Flatten skill category directory structure

This commit is contained in:
2026-05-20 17:04:50 +08:00
parent 0dd552a6f7
commit 63f2baa4bd
354 changed files with 0 additions and 0 deletions
@@ -0,0 +1,60 @@
# 脚本生成
## 目标
根据歌词拆解的段落结构,为每个段落生成详细的分幕脚本。
## 重点
- 脚本的时间段可以对歌词段落进行拆分或合并,**不需要**与 lyric.md 一一对应
- 各阶段产物相互独立:修改脚本不需要回改歌词,修改分镜不需要回改脚本,以此类推
- **场景拆分后必须重新编号**:若某幕时长超过 15s 需要拆分成多幕,拆分后**必须**将所有场景从第一幕开始重新连续编号(第一幕、第二幕、……第 N 幕),**禁止**使用 `a/b` 后缀(如"第九幕b")。连续编号确保下游分镜图文件命名(scene_01.jpg、scene_02.jpg...)与数组索引严格一致
- 脚本格式**必须**严格遵循模板 `references/script-example.md`(非中文用户参考 `references/script-example-en.md`),否则 HTML 预览解析器无法正确渲染
- **场景描述必须写具体动态**:脚本的场景描述是后续视频提示词的核心输入,描述越具体、动态越丰富,生成的视频动作越自然。**禁止笼统静态描述**(如"旅人站在路边"),必须写清:
- **角色动作**:具体的肢体动作和运动轨迹(走、跑、转身、抬手、低头等)
- **表情/情绪**:面部表情变化(微笑渐收、皱眉凝视等)
- **物件交互**:角色与道具/环境的互动(抚摸琴弦、推开车门、拾起信物等)
- **镜头运动**:明确的镜头语言(从脚部缓缓上摇、跟随角色横移、推近面部特写等)
- **环境动态**:风吹发丝、水面倒影晃动、光影变化等非静态元素
## 格式模板
完整格式示例见 `references/script-example.md`(非中文用户参考 `references/script-example-en.md`)。关键要点:
- 二级标题 `##` 用于每幕场景标题(如 `## 第一幕:黎明启程`
- 时间码行格式:`* M:SS - M:SS (Xs)`
- 不加粗、不标注段落类型(Verse/Chorus 等)
- 括号内为时长(秒),必须为 **415 秒的整数**
- 歌词引用以 `> ` 开头,纯音乐幕无歌词引用
- 每幕必须包含三个字段:`**场景描述:**``**视觉风格:**``**转场:**`
- 可选字段 `**关键物件:**`:列出该幕出现的重要非人物视觉元素,格式为物件名 + 简短外观描述(括号内),多个物件逗号分隔
- 示例:`**关键物件:** 旧皮卡(深蓝色、锈迹斑驳、车顶行李架)、吉他(原木色民谣吉他、琴身有贴纸)`
- 场景之间用 `---` 分隔
## 文件存储
```
./.mv/{song_name}/{theme}/script.md # 脚本文件
```
## 格式校验
脚本写入 `script.md` 后,**必须**运行校验脚本:
```bash
python3 .opencode/skills/mv-creator/scripts/validate_script.py .mv/{song_name}/{theme}/script.md
```
校验规则:场景标题格式、时间码格式(含时长标签)、时长范围(4~15s 整数)、时间段连续性、必填字段完整性、与 lyric.md 交叉校验。
- **通过** → 调用 MCP 工具 `preview_and_collect_feedback` 启动预览:
- **script**: `.opencode/skills/mv-creator/scripts/render_preview.py`
- **args**: `[".mv/{song_name}/{theme}/script.md", "--type", "script", "--lang", "{lang}"]`
- **feedback_path**: `.mv/{song_name}/{theme}/feedback.md`
预览页面以时间线卡片形式展示各幕,用户可点击场景卡片的 `@` 按钮引用到反馈框中。
工具返回反馈内容后:
- `LGTM` → 进入下一阶段
- 其他 → 按建议修改后重新校验和预览
- **未通过** → 由 LLM 根据校验错误信息自动修正 `script.md`,修复后重新校验。
若连续 3 次自动修复仍未通过,通过 `AskUserQuestion` 询问用户处理方式