111 lines
5.9 KiB
Markdown
111 lines
5.9 KiB
Markdown
# 分镜规划
|
||
|
||
## 目标
|
||
|
||
根据脚本为每个场景规划分镜,**引用已生成的人设图、背景图和关键物件图**作为视频生成的参考素材,不再单独生成分镜图。
|
||
|
||
## 重点
|
||
|
||
- 分镜不再独立生成图片,而是为每幕映射已有的参考图(角色 `selected.jpg`、背景 `selected.jpg`、物件 `selected.jpg`)
|
||
- 每幕需要编写视频生成提示词,描述画面动态和镜头运动
|
||
- 分镜文档是视频生成阶段的直接输入
|
||
|
||
## 流程
|
||
|
||
### 1. 解析脚本与关联素材
|
||
|
||
读取 `script.md` 提取每幕信息(场景名称、时间码、场景描述、歌词、视觉风格、关键物件)。
|
||
结合 `story_concept.md` 中的核心人物描述和各幕场景描述,为每幕标注:
|
||
|
||
- **出场角色**:场景中出现的角色名 → 对应 `characters/{character_name}/selected.jpg`
|
||
- **场景背景**:该幕的场景环境 → 对应 `backgrounds/{bg_name}/selected.jpg`
|
||
- **关键物件**:该幕出现的关键物件 → 对应 `props/{item_name}/selected.jpg`
|
||
|
||
判断规则:
|
||
- 场景描述中明确提及角色名或角色特征 → 标注该角色
|
||
- 场景描述为纯空镜/风景/物件特写 → 出场角色标注为 `(无)`
|
||
- 不确定时倾向于标注角色(宁多勿漏,用户可在预览时修正)
|
||
|
||
### 2. 生成分镜文档
|
||
|
||
将每幕信息写入 `storyboard.md`,为每幕生成:
|
||
- **出场角色**:该幕出现的角色**目录名**(即 `characters/` 下的子目录名,不是 design.md 中的 H1 显示名)
|
||
- **场景背景**:该幕对应的背景**目录名**(即 `backgrounds/` 下的子目录名)
|
||
- **关键物件**:该幕出现的关键物件**目录名**(即 `props/` 下的子目录名)
|
||
- **场景描述**:中文画面描述(从 script.md 同步)
|
||
- **视频提示词**:英文 prompt,描述画面动态、镜头运动、角色动作,引用参考图(如 `image 1 as background, image 2 as character`)
|
||
- **参考图列表**:背景 `selected.jpg` + 角色 `selected.jpg`(如有)+ 物件 `selected.jpg`(如有)
|
||
|
||
### 3. 生成分镜图
|
||
|
||
为每幕生成分镜合成图,让用户在视频生成前预览实际画面构图。
|
||
|
||
**生成方式**:使用 `all_in_one_batch_image_generation`(model_name: `all_in_one_pro`)或 `nano_banana_batch_image_generation_v2`(model_name: `nano_banana_2`)批量生成,每幕 1 张。
|
||
|
||
**参考图传入**:通过 `image_paths` 传入背景 `selected.jpg` + 角色 `selected.jpg`(如有)+ 关键物件 `selected.jpg`(如有),并在提示词中用 `image 1 as background, image 2 as character` 等引用。
|
||
|
||
**提示词**:基于分镜文档的 `视频提示词:` 字段,但去除镜头运动描述(pan、dolly、tracking 等),仅保留画面构图、角色动作、光线氛围和风格描述。这是**静态画面**提示词,不同于视频提示词。
|
||
|
||
**宽高比**:统一 `16:9`。
|
||
|
||
**存储**:保存到 `storyboard/` 目录,命名 `scene_01.jpg`、`scene_02.jpg` 等(序号与幕序一致)。
|
||
|
||
**写入分镜文档**:在 `storyboard.md` 每幕末尾追加 `候选图:` 和 `选定图:` 字段,记录生成的候选图路径。首次生成后默认选定第一张。
|
||
|
||
### 4. 用户审阅
|
||
|
||
调用 MCP 工具 `preview_and_collect_feedback` 启动预览:
|
||
- **script**: `.opencode/skills/mv-creator/scripts/render_preview.py`
|
||
- **args**: `[".mv/{song_name}/{theme}", "--type", "storyboard", "--lang", "{lang}"]`
|
||
- **feedback_path**: `.mv/{song_name}/{theme}/feedback.md`
|
||
|
||
预览页面按时间线展示各幕分镜卡片,显示每幕的参考图缩略图和视频提示词。
|
||
工具返回反馈内容后:
|
||
- `LGTM` → 进入视频生成阶段
|
||
- 其他 → 按建议修改分镜映射或视频提示词,更新 `storyboard.md`,重新校验和预览
|
||
|
||
## 输出格式
|
||
|
||
**严格按用户语言选择对应的 example 和字段名**(参见 SKILL.md「输出控制」和「Markdown 字段名中英对照表」):
|
||
- 中文用户:参考 `references/storyboard-example.md`
|
||
- 非中文用户:参考 `references/storyboard-example-en.md`
|
||
|
||
关键要点:
|
||
|
||
- 二级标题 `##` 用于每幕场景标题,与 `script.md` 的幕名保持一致
|
||
- 时间码行格式:`* M:SS - M:SS (Xs)`,与 `script.md` 一致
|
||
- 歌词引用以 `> ` 开头(从 script.md 同步)
|
||
- 每幕必须包含以下字段(中文/English):
|
||
- `出场角色/Characters` — 角色名(逗号分隔),无角色写 `(无)`/`(None)`
|
||
- `场景背景/Scene Background` — 对应的背景名
|
||
- `关键物件/Key Props` — 物件名(逗号分隔),无物件可省略
|
||
- `场景描述/Scene Description` — 画面描述(用户语言),缩进 2 空格
|
||
- `视频提示词/Video Prompt` — 英文 prompt,描述动态和镜头,引用参考图编号,缩进 2 空格
|
||
- `参考图/Reference` — 列表形式,每行注明用途,路径相对 theme 目录
|
||
- `候选图/Candidates` — 列表形式,每行记录候选图文件名和简要说明
|
||
- `选定图/Selected` — 用户选定的最终分镜图文件名
|
||
- 场景之间用 `---` 分隔
|
||
|
||
## 格式校验
|
||
|
||
storyboard.md 写入后,**必须**运行校验脚本:
|
||
|
||
```bash
|
||
python3 .opencode/skills/mv-creator/scripts/validate_storyboard.py .mv/{song_name}/{theme}/storyboard.md
|
||
```
|
||
|
||
校验规则:场景标题格式、时间码格式、必填字段完整性、出场角色目录及 `selected.jpg` 存在性、场景背景目录及 `selected.jpg` 存在性、关键物件目录及 `selected.jpg` 存在性、与 `script.md` 交叉校验(幕数和时间码一致)。
|
||
|
||
- **通过** → 启动预览供用户审阅
|
||
- **未通过** → 由 LLM 根据校验错误信息自动修正,修复后重新校验
|
||
|
||
## 文件存储
|
||
|
||
```
|
||
./.mv/{song_name}/{theme}/storyboard.md # 分镜规划文档
|
||
./.mv/{song_name}/{theme}/storyboard/ # 分镜图目录
|
||
├── scene_01.jpg # 各幕分镜图
|
||
├── scene_02.jpg
|
||
└── ...
|
||
```
|