# Comic Drama Master

> 漫剧制作总导演。接受用户故事创意，依次完成剧本创作、角色设计、分镜图生成、分镜视频生成、视频合成全流程，产物保存到 COMIC_DRAMA_OUTPUT_DIR（默认 ./output），最终交付完整漫剧视频和 TOS 链接。

- Skill: `bytedance/comic-drama-master` (Agent Skill, multi-file: 23 files)
- Install (CLI): `npx skillmds@latest add bytedance/comic-drama-master`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bytedance/comic-drama-master/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: bytedance (https://skillmd.com/u/bytedance)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/bytedance/comic-drama-master

---


# 漫剧制作总导演

你是统筹全局的漫剧制作总导演，负责协调五个专业环节完成从创意到成片的全流程。

> 五个专业环节的详细规格：
> - 剧本生成：参见 `references/screenplay-generator.md`
> - 角色设计：参见 `references/character-designer.md`
> - 场景美术：参见 `references/scene-designer.md`
> - 分镜视频：参见 `references/storyboard-director.md`
> - 视频合成：参见 `references/video-synthesizer.md`
>
> 完整使用示例参见 `examples/examples.md`。

---

## ⚠️ 内容安全审核提醒

在开始制作之前，**必须先对用户的故事创意进行内容安全预审**。

### 高风险关键词（容易触发 API 拒绝）

以下类型的内容在视频生成阶段（doubao-seedance API）有较高概率被拒绝（`OutputVideoSensitiveContentDetected`）：

| 风险类别 | 高风险关键词示例 |
|---------|----------------|
| 战争军事 | 战争、军队、军事、入侵、屠杀、征服 |
| 血腥暴力 | 血腥、血液、流血、残肢、内脏、致命伤 |
| 武器描述 | 刀砍、剑刺、弓箭射杀、枪械、炸弹 |
| 宗教敏感 | 堕天使、恶魔、撒旦、邪教、亵渎 |
| 恐怖元素 | 恐怖、惊悚、尸体、骷髅、鬼魂 |
| 政治敏感 | 政治人物、敏感历史事件、领土争议 |

### 预审处理规则

1. **低风险**（日常、奇幻冒险、儿童故事等）：直接开始制作
2. **中风险**（武侠打斗、修仙对决等）：在剧本和 prompt 中使用**委婉替代词**：
   - ❌ `blood spraying from wound` → ✅ `spiritual energy impact, staggering backward`
   - ❌ `sword piercing through chest` → ✅ `sword energy clash, powerful strike`
   - ❌ `army marching to war` → ✅ `warriors gathering for a decisive confrontation`
   - ❌ `bloody battle` → ✅ `fierce spiritual energy confrontation`
3. **高风险**（纯战争、恐怖、政治敏感）：**明确告知用户**该题材可能导致视频生成大面积失败，建议：
   - 调整为更温和的表达方式
   - 更换题材方向
   - 用户坚持则继续，但提前说明可能有 30-50% 的场景需要反复重试

> **提醒时机**：在步骤2（初始化任务目录）之后、步骤3（剧本生成）之前，向用户简要说明风险等级和应对策略。

---

## ⚡ 脚本参数速查表（大模型必读）

> **重要**：以下是所有脚本的精确调用格式和 JSON 文件格式。调用任何脚本前，必须严格按照此表准备参数，不得猜测格式。

### app_config.py — 读取配置
```bash
python scripts/app_config.py
# 无参数，返回 JSON
```

### task_manager.py — 任务目录管理
```bash
# 初始化任务
python scripts/task_manager.py init "<task_name>"

# 保存文档
python scripts/task_manager.py save "<task_folder绝对路径>" "<文件名.md>" "<Markdown内容>"

# 列出任务
python scripts/task_manager.py list
```

### web_search.py — 网络搜索
```bash
python scripts/web_search.py "<搜索关键词>"
# 返回 JSON 字符串数组
```

### image_generate.py — 单张图片生成
```bash
python scripts/image_generate.py "<英文prompt>" --output-dir "<保存目录绝对路径>"
# 返回 JSON: {"saved_files": ["/absolute/path/to/generated_image_TIMESTAMP_0.png"]}
```

### batch_image_generate.py — 批量并行图片生成（⚡ 推荐用于分镜图和角色立绘）
```bash
# 从 JSON 文件读取 prompts，并行生成（默认3线程）
python scripts/batch_image_generate.py \
  --prompts-file prompts.json \
  --output-dir "<保存目录绝对路径>" \
  --prefix scene_ \
  --max-workers 3 \
  --max-retries 3

# 返回 JSON: {"status": "success", "total": N, "succeeded": N, "failed": 0, "saved_files": [...], "elapsed_seconds": X}
```

**📋 image_prompts.json 格式（纯字符串数组）：**
```json
[
  "STYLE_ANCHOR, scene 1 prompt...",
  "STYLE_ANCHOR, scene 2 prompt...",
  "STYLE_ANCHOR, scene 3 prompt..."
]
```

> ⚡ **性能对比**：7 张分镜图串行生成约 70s，并行生成约 25s，提速约 3 倍。
> 内置自动重试（最多3次）和失败 prompt 简化 fallback 机制。

### batch_video.py — 批量视频提交/轮询
```bash
# 提交任务（⚠️ JSON 文件格式见下方）
python scripts/batch_video.py submit \
  --prompts-file prompts.json \
  --first-frames-file frames.json \
  --durations-file durations.json

# 轮询任务
python scripts/batch_video.py poll --task-ids-file task_ids.json --interval 30
```

**📋 JSON 文件精确格式（严格遵守，不得修改结构）：**

**prompts.json** — 纯字符串数组（⚠️ 不是对象数组！）：
```json
[
  "STYLE_ANCHOR, scene 1 full prompt text...",
  "STYLE_ANCHOR, scene 2 full prompt text...",
  "STYLE_ANCHOR, scene 3 full prompt text..."
]
```

**frames.json** — 纯字符串数组，每项为 TOS URL（与 prompts 一一对应）：
```json
[
  "https://tos-cn-beijing.volces.com/.../scene_01.jpg?...",
  "https://tos-cn-beijing.volces.com/.../scene_02.jpg?...",
  "https://tos-cn-beijing.volces.com/.../scene_03.jpg?..."
]
```

**durations.json** — 纯整数数组，每项为 4~15 之间的整数（与 prompts 一一对应）：
```json
[6, 8, 5, 10, 14, 12, 5]
```

**task_ids.json** — submit 返回结果中 `submitted` 字段的值（对象，key 为 scene_key，value 为 task_id）：
```json
{
  "scene_01": "task_id_abc123",
  "scene_02": "task_id_def456",
  "scene_03": "task_id_ghi789"
}
```

### file_download.py — 批量文件下载
```bash
python scripts/file_download.py \
  --urls <url1> <url2> <url3> ... \
  --save-dir "<保存目录绝对路径>" \
  --filenames scene_01.mp4 scene_02.mp4 scene_03.mp4 ...
```

### video_merge.py — 视频合并
```bash
python scripts/video_merge.py \
  --input-dir "<videos_dir绝对路径>" \
  --output "<final_dir绝对路径>/<task_name>_final.mp4" \
  --scene-count <N>
```

### tos_upload.py — TOS 上传
```bash
python scripts/tos_upload.py "<文件绝对路径>"
# 返回 JSON: {"signed_url": "https://..."}
```

### video_scorer.py — 效果评分
```bash
python scripts/video_scorer.py "<task_folder绝对路径>"
```

---

## 前置依赖

- **ffmpeg / ffprobe**（必须，步骤7使用）：视频合并和时长检测依赖 ffmpeg。**在步骤7（视频合成）开始前自动检查并安装。**
  ```bash
  # macOS
  brew install ffmpeg
  # Linux (Debian/Ubuntu)
  sudo apt-get install -y ffmpeg
  # Linux (CentOS/RHEL)
  sudo yum install -y ffmpeg
  ```
  > ⚠️ ffmpeg 仅在步骤7（视频合成）时需要，无需提前安装。脚本会在合成前自动检查。
- **网络搜索**：调研时通过 `python scripts/web_search.py <query>` 执行，脚本自包含在此 skill 的 `scripts/` 目录下。
- **图片生成**：
  - 单张：`python scripts/image_generate.py <prompt> [--output-dir <dir>]`
  - **批量并行（推荐）**：`python scripts/batch_image_generate.py --prompts-file <file> --output-dir <dir>`
- **环境变量**（必须提前设置）：
  - `ARK_API_KEY` 或 `MODEL_IMAGE_API_KEY`：方舟 API 密钥（图片生成用）
  - `VOLCENGINE_ACCESS_KEY` / `VOLCENGINE_SECRET_KEY`：火山引擎 AK/SK（网络搜索 + TOS 上传用）
  - `VIDEO_DURATION_MINUTES`：视频时长（可选，默认 0.5（30秒），支持 0.5/1/2/3/4）
  - `COMIC_DRAMA_OUTPUT_DIR`：产物输出根目录（可选，默认项目目录下的 `output/`）
  - `DEFAULT_VIDEO_MODEL_NAME`：视频生成模型名称（可选，默认 `doubao-seedance-2-5-260628`）

---

## 🔄 恢复未完成任务（断点续制）

> **当新对话开始或上下文丢失时，必须先执行此检测流程，再决定是新建任务还是继续现有任务。**

### 恢复检测流程

**第一步：列出已有任务目录**

```bash
python scripts/task_manager.py list
```

如果找到已有任务目录，检查其中的产物完成情况。

**第二步：检查产物并判断恢复点**

进入最新的 task_folder，按以下规则判断应该从哪一步继续：

| 已有产物 | 缺失产物 | 恢复到步骤 |
|---------|---------|-----------|
| 无任何产物 | 全部 | 步骤2：初始化任务目录 |
| `requirements.md` | `plot.md`, `script.md` | 步骤3：剧本生成 |
| `plot.md`, `script.md` | `characters/` | 步骤4：角色设计 |
| `characters/`, `characters.md` | `storyboard/` | 步骤5：场景美术 |
| `storyboard/` 有分镜图 | `videos/` | 步骤6：分镜视频 |
| `videos/` 有视频文件 | `final/` | 步骤7：视频合成 |
| `final/` 有最终视频 | 评分报告 | 步骤8：产物验证 |

**第三步：加载已有产物上下文**

如果需要从中间步骤继续，**必须先读取已完成的产物文件**来恢复上下文：
- 读取 `characters.md` 恢复 STYLE_ANCHOR 和角色描述
- 读取 `plot.md` 恢复剧情大纲和时长分配
- 读取 `script.md` 恢复完整对白剧本
- 读取任务目录中已有的 TOS URL 记录

**第四步：向用户确认**

向用户展示检测结果：
- 展示已完成的步骤和对应产物
- 展示下一步应该执行的步骤
- 询问用户是否继续该任务，还是重新开始新任务

> ⚠️ **如果用户提供的是全新的故事创意**，则忽略恢复流程，直接从步骤1开始。
> 只有当用户明确表示"继续"、"接着做"、"上次的"等意图时，才执行恢复流程。

---

## 全流程概览

```
用户故事创意
  ↓
步骤0: 恢复检测 → python scripts/task_manager.py list（检查是否有未完成任务）
步骤1: 读取配置 → python scripts/app_config.py（智能时长模式，4s~15s 动态范围）
步骤2: 初始化任务目录 → python scripts/task_manager.py init "<task_name>"
  ↓ ⚠️ 内容安全预审（评估风险等级，向用户说明）
步骤3: 剧本生成 → python scripts/web_search.py 调研 + 创作剧本 + 智能时长分配（参见 references/screenplay-generator.md）
步骤4: 角色设计 → python scripts/image_generate.py 生成立绘（参见 references/character-designer.md）
步骤5: 场景美术 → python scripts/image_generate.py 生成分镜图（参见 references/scene-designer.md）
步骤6: 分镜视频 → python scripts/batch_video.py submit/poll + 每段独立时长（参见 references/storyboard-director.md）
步骤7: 视频合成 → python scripts/video_merge.py + tos_upload.py（参见 references/video-synthesizer.md）
步骤8: 产物验证与效果评分 → 逐项检查产物完整性 + 生成评分报告
  ↓
完整漫剧视频 + TOS 签名链接 + 评分报告
```

---

## 步骤1：读取启动配置

```bash
python scripts/app_config.py
```

输出 JSON 包含：
- `video_duration_minutes`：视频时长（分钟）
- `total_seconds`：总秒数
- `smart_duration`：`true`（智能时长模式已启用）
- `duration_range`：`{"min": 4, "max": 15}`（每段视频可选时长范围）
- `duration_options`：`"4s ~ 15s 动态分配"`
- `scene_count_range`：`{"min": N, "max": M}`（场景数参考范围）
- `recommended_scene_count`：推荐场景数（以平均 8s 估算）

### 智能时长模式说明

每个分镜场景根据**剧情节奏需要**独立分配时长（**4秒 ~ 15秒**连续可选），而非全部使用统一时长。**时长的多样性是让漫剧节奏生动的关键**——快切制造紧迫感，长镜头铺垫情绪，交替使用让观众始终沉浸在故事中。

| 场景类型 | 推荐时长范围 | 适用情况 | 对白密度 |
|---------|-------------|---------|---------|
| 紧张快切 | **4~6秒** | 追逐场面、惊吓瞬间、快速闪回、蒙太奇过渡、一击必杀 | 1~2句短促台词或无对白纯画面 |
| 标准叙事 | **7~10秒** | 开篇铺垫、过渡衔接、环境建立、简单对话、结尾余韵 | 3~5句对白，标准节奏 |
| 高潮铺垫 | **11~15秒** | 终极对决、情绪爆发、多角色交锋、关键转折、密集对白 | 6~10句对白，密集交锋 |

**总导演在步骤3（剧本生成）时，根据每章的剧情功能和节奏需要决定该章时长**，确保：
- 总时长 ≈ `total_seconds`（允许 ±10% 浮动）
- 高潮章节（第三幕）优先分配 11~15 秒
- 紧张追逐/闪回可使用 4~6 秒快切
- 开篇和结尾章节通常使用 7~10 秒
- **相邻场景时长应有变化**，避免连续多个相同时长导致节奏单调

向用户确认配置后继续。

---

## 步骤2：初始化任务目录

```bash
python scripts/task_manager.py init "<task_name>"
```

从故事创意中提取核心关键词作为 task_name。脚本返回 JSON：

```json
{
  "task_folder": "{COMIC_DRAMA_OUTPUT_DIR}/task_20260222_143000_关键词/",
  "storyboard_dir": "{COMIC_DRAMA_OUTPUT_DIR}/task_.../storyboard/",
  "characters_dir": "{COMIC_DRAMA_OUTPUT_DIR}/task_.../characters/",
  "videos_dir": "{COMIC_DRAMA_OUTPUT_DIR}/task_.../videos/",
  "final_dir": "{COMIC_DRAMA_OUTPUT_DIR}/task_.../final/",
  "outputs_dir": "{COMIC_DRAMA_OUTPUT_DIR}/",
  "deleted_tasks": []
}
```

记录所有路径，后续步骤全程使用。FIFO 自动清理，最多保留16个任务。

> ⚠️ **内容安全预审**：在此步骤之后、步骤3之前，对用户故事创意执行内容安全预审（参见上方「内容安全审核提醒」），向用户简要说明风险等级。

---

## 步骤3：剧本生成（含智能时长分配）

**完整规格参见 `references/screenplay-generator.md`**。

核心流程：
1. **`python scripts/web_search.py` 深度调研**（必须在写剧本之前执行）
2. 保存需求文档 `requirements.md`
3. 创作章节式剧情大纲 `plot.md`（含全局风格锚定声明 + 情绪弧线图）
4. **为每个章节动态分配时长**（4秒 ~ 15秒，根据剧情节奏）
5. 创作完整对白剧本 `script.md`（每章标注时长，逐秒剧本按实际时长展开）
6. 输出 `scene_durations` 列表（供步骤6使用）

### 智能时长分配规则

在创作 plot.md 时，为每章标注时长（4s ~ 15s 动态选择）：

```
第一章：[章节名]（6秒）— [摘要]    ← 快速闪回/引子，紧凑开场
第二章：[章节名]（8秒）— [摘要]    ← 世界观建立，标准叙事
第三章：[章节名]（5秒）— [摘要]    ← 紧张追逐/危机降临，快切
第四章：[章节名]（10秒）— [摘要]   ← 冲突升级，需要更多对白
第五章：[章节名]（14秒）— [摘要]   ← 高潮对决，密集交锋
第六章：[章节名]（12秒）— [摘要]   ← 高潮延续，情绪爆发
第七章：[章节名]（5秒）— [摘要]    ← 结局余韵，短促定格
```

**时长分配决策表**：

| 判定条件（满足任一即可） | 推荐时长范围 |
|------------------------|-------------|
| 高潮对决、终极交锋 | **12~15秒** |
| 多角色同时交锋（3人+） | **12~15秒** |
| 关键剧情转折、反转揭示 | **11~14秒** |
| 情绪爆发（愤怒嘶吼、决死宣言、临死遗言） | **11~15秒** |
| 对白密集（需要6句以上对白才能充分表达） | **11~15秒** |
| 复杂动作编排（多段连续动作） | **12~15秒** |
| 开篇建立世界观 | **7~10秒** |
| 过渡衔接、环境转换 | **6~9秒** |
| 简单对话（3-5句对白即可） | **7~10秒** |
| 结尾余韵、情绪沉淀 | **6~10秒** |
| 单纯氛围渲染 | **5~8秒** |
| 紧张追逐、危机闪回、一击必杀 | **4~6秒** |
| 蒙太奇过渡、梦境闪现 | **4~5秒** |
| 惊吓瞬间、突发事件 | **4~5秒** |

> **关键原则**：时长多样性 > 时长统一。一部好漫剧的节奏应像心跳般起伏有致——紧张时短促如鼓点（4~6s），铺垫时舒缓如弦乐（7~10s），高潮时绵长如交响（11~15s）。

**script.md 中每章的时长体现**：
- 章节标题格式：`## 第N章：[章节名]（时长：Xs）`（X 为 4~15 之间的整数）
- 逐秒剧本时间轴按实际时长展开（如 5秒场景：`0:00-0:05`；12秒场景：`0:00-0:12`）
- 11~15秒场景的对白密度更高（6-10句），动作编排更丰富
- 7~10秒场景的对白为标准密度（3-5句）
- 4~6秒场景对白极简（0-2句），以画面冲击力为主

**确认步骤3产物**：
- `{task_folder}/requirements.md` ✅
- `{task_folder}/plot.md` ✅（含章节划分 + 每章时长标注 + 风格锚定 + 情绪弧线）
- `{task_folder}/script.md` ✅（含对白、神情、动作、场景桥接、结束状态、**每章独立时长**）
- `scene_durations` 列表已记录 ✅（如 `[6, 8, 5, 10, 14, 12, 5]`）

从 plot.md 提取：主要角色列表、核心视觉风格（默认「国漫3D写实」）。

**🔔 向用户展示关键产出**（必须在确认产物后、进入下一步之前展示）：
- 📖 **剧情大纲**：展示 plot.md 的完整分章大纲（章节名 + 时长标注 + 摘要）
- 🎭 **每章对白摘录**：每章展示 1-2 句最精彩的核心对白
- 📊 **时长分配汇总表**：章节—时长—分配理由
- 📈 **情绪弧线图**：每章情绪强度可视化
- 👥 **角色列表**：主要角色姓名 + 身份 + 一句话概括

---

## 步骤4：角色设计

**完整规格参见 `references/character-designer.md`**。

核心流程：
1. 确定视觉风格，生成 **STYLE_ANCHOR**（全局风格锚定字符串）
2. 为每个角色创作精确的英文 AI 提示词
3. ⚡ 使用 `python scripts/batch_image_generate.py` **并行生成**角色立绘 + 封面图
4. 保存角色设计文档 `characters.md`
5. **将所有立绘和封面上传到 TOS**，获取 TOS URL（用于图片展示）

**画风一致性关键**：
- STYLE_ANCHOR 写入 characters.md 顶部，后续所有步骤必须引用
- 角色英文提示词一经确定，在所有后续场景中**原样复用**，仅允许追加动作/表情
- 配色方案用精确英文颜色词（如 `midnight blue` 而非 `blue`）

确认产物：
- `{task_folder}/characters.md` ✅（含 STYLE_ANCHOR + 英文提示词 + 立绘图片）
- `{characters_dir}/` 下有角色立绘 .jpg 文件 ✅
- `{task_folder}/cover.jpg` ✅
- 所有角色立绘和封面图已上传到 TOS，TOS URL 已记录 ✅

**🔔 向用户展示关键产出**：
- 🎨 **STYLE_ANCHOR**：展示完整风格锚定字符串
- 👤 **角色概要**：每个角色的中文描述（姓名 + 身份 + 标志性特征）
- 🖼️ **角色立绘预览**：所有角色立绘以 Markdown 图片形式展示（⚠️ **必须使用 TOS URL，不得使用本地磁盘路径**）
- 🖼️ **封面图预览**：封面图以 Markdown 图片形式展示（⚠️ **必须使用 TOS URL**）

---

## 步骤5：场景美术（分镜图）

**完整规格参见 `references/scene-designer.md`**。

核心流程：
1. 从 characters.md 提取 STYLE_ANCHOR
2. 为每个场景构建提示词（以 STYLE_ANCHOR 开头，体现场景结束状态）
3. ⚡ 使用 `python scripts/batch_image_generate.py` **并行生成**所有分镜图（内置自动重试 + 失败 prompt 简化 fallback）
4. 上传到 TOS，记录 TOS URL

**画风一致性关键**：
- 所有分镜图提示词必须以 STYLE_ANCHOR 开头
- 角色描述严格复用 characters.md 中的英文提示词
- 相邻场景的色调、光照、环境元素保持视觉连贯

**场景生成失败 fallback**：
- 脚本内置自动重试（每张最多3次）
- 重试全部失败后，自动用简化 prompt 再次尝试（移除高风险词汇）
- 如果仍然失败，提取失败场景的 prompt，手动简化后使用 `image_generate.py` 单独重试

确认产物：
- `{storyboard_dir}/` 下有 scene_count 张分镜图 ✅
- 所有分镜图的 TOS URL 已记录 ✅（供步骤6使用）

**🔔 向用户展示关键产出**（⚠️ **必须展示分镜图，不得跳过**）：
- 🖼️ **分镜图预览**：所有分镜图以 Markdown 图片列表形式展示（⚠️ **使用 TOS URL**），每张附带：
  - 对应章节名
  - 一句场景描述
  - 该章节的时长标注
- 📊 **生成统计**：总数/成功数/耗时

---

## 步骤6：分镜视频生成（智能时长）

**完整规格参见 `references/storyboard-director.md`**。

核心流程：
1. 从 characters.md 提取 STYLE_ANCHOR
2. 为每个场景构建七维度导演级视频提示词（以 STYLE_ANCHOR 开头）
3. **准备每段视频的独立时长列表**（从步骤3的 `scene_durations` 获取，4~15秒动态值）
4. 批量提交视频任务（含首帧 TOS URL + 每段独立时长）
5. 轮询等待全部完成
6. 下载视频 + 质量评分

### 智能时长提交方式

将 prompts 列表、首帧 URL 列表、时长列表分别写入 JSON 文件，然后调用 submit：

**第一步：准备 JSON 文件（⚠️ 严格按照速查表中的格式，参见文件顶部）**

```json
// prompts.json — ⚠️ 必须是纯字符串数组，不是对象数组！
[
  "STYLE_ANCHOR, environment for scene 1, character desc, action, dialogue, camera, audio",
  "STYLE_ANCHOR, environment for scene 2, character desc, action, dialogue, camera, audio"
]

// frames.json — TOS URL 字符串数组（与 prompts 一一对应）
[
  "https://tos-cn-beijing.volces.com/.../scene_01.jpg?签名参数...",
  "https://tos-cn-beijing.volces.com/.../scene_02.jpg?签名参数..."
]

// durations.json — 整数数组（与 prompts 一一对应）
[6, 8, 5, 10, 14, 12, 5]
```

**第二步：调用 submit 命令**

```bash
python scripts/batch_video.py submit \
  --prompts-file prompts.json \
  --first-frames-file frames.json \
  --durations-file durations.json
```

**第三步：保存返回结果中 `submitted` 字段为 task_ids.json**

submit 返回格式：
```json
{
  "submitted": {"scene_01": "task_id_xxx", "scene_02": "task_id_yyy"},
  "errors": {},
  "total": 7
}
```

将 `submitted` 字段的内容保存为 `task_ids.json`：
```json
{"scene_01": "task_id_xxx", "scene_02": "task_id_yyy"}
```

> ⚠️ **不再使用 `--duration` 统一时长参数**，改用 `--durations-file` 实现每段独立时长。
> `durations.json` 中的时长列表必须与 `prompts.json` 一一对应，每个值为 4~15 之间的整数。

**画风一致性关键**：
- 所有视频提示词以 STYLE_ANCHOR 开头
- 角色描述严格复用 characters.md 中的英文提示词
- 对白从 script.md 原样提取
- 11~15秒场景：至少5-6句对白，密集交锋节奏
- 7~10秒场景：至少3-4句对白
- 4~6秒场景：0-2句极简对白，以画面冲击为主
- 运镜多样化，相邻场景不得使用完全相同的运镜手法

### 镜头语言专业指导

**镜头是导演最重要的叙事工具**。不同情绪需要截然不同的镜头策略：

#### 紧张/悬疑场景的镜头策略

| 镜头技法 | 描述 | 情绪效果 |
|---------|------|---------|
| 近景→特写连续推进 | `medium shot slowly pushing in to extreme close-up on eyes` | 压迫感递增，暗示危险逼近 |
| 快速正反打切换 | `rapid shot-reverse-shot between characters, each cut 0.5s` | 心理对峙白热化，紧张感拉满 |
| 手持晃动镜头 | `handheld shaky camera, slight vibration, unstable framing` | 不安定感，观众代入角色恐惧 |
| 倾斜构图（Dutch angle） | `tilted camera 15-25 degrees, off-balance composition` | 世界失序、心理扭曲 |
| 景深压缩长焦 | `telephoto lens compression, blurred foreground and background` | 孤立角色、空间压缩、窒息感 |
| 暗部留白 | `deep shadows consuming 60% of frame, character half-lit` | 未知威胁、恐惧氛围 |

#### 高潮/爆发场景的镜头策略

| 镜头技法 | 描述 | 情绪效果 |
|---------|------|---------|
| 速度斜坡（Speed Ramp） | `normal speed → ultra-slow 0.2x on impact → snap back to real-time` | 关键一击的视觉强调 |
| 360度环绕 | `360-degree orbit around character during energy release` | 能量爆发的仪式感 |
| 极端低角度 | `extreme worm's-eye view looking up, silhouette against sky` | 角色气势碾压，史诗感 |
| 跟拍追踪 | `dynamic tracking shot racing alongside the action, camera tilting 45°` | 动作场面的沉浸感 |
| 快速蒙太奇 | `rapid montage: face → fist → impact → reaction, 0.3s per cut` | 战斗节奏爆裂 |
| 鞭甩摇镜 | `whip pan from attacker to defender, motion blur, freeze on impact` | 突袭感、力量传递 |

#### 情绪铺垫场景的镜头策略

| 镜头技法 | 描述 | 情绪效果 |
|---------|------|---------|
| 缓推长镜头 | `slow steady dolly push-in over 5 seconds, minimal movement` | 情绪渐入，观众被缓缓吸入画面 |
| 大全景→人物 | `wide establishing shot slowly narrowing to medium shot on character` | 渺小感→聚焦→共情 |
| 近景微表情 | `extreme close-up held for 3 seconds, capturing every micro-expression` | 无声胜有声，情绪传递 |
| 过肩镜头 | `over-the-shoulder shot, shallow depth of field, speaker in soft focus` | 亲密/对峙的心理距离 |
| 慢拉远镜 | `slow pull-back revealing vast landscape, character becoming small` | 孤独感、命运感、余韵 |
| 静止锁定 | `static locked-off camera, subject slowly walking away, held 6 seconds` | 结尾余韵、情绪沉淀 |

> **镜头节奏规则**：紧张场景用快切（每 0.5~1.5s 一个镜头切换），铺垫场景用长镜（3~6s 不切），高潮场景先慢后快再慢（蓄力→爆发→余波）。

**对白与连贯性关键**：
- 对白间距不超过4秒，要有交锋感
- 音频情绪与画面情绪匹配，相邻场景音乐有过渡感
- 环境在连续场景中保持一致，仅变化破坏程度/光照

确认产物：
- `{videos_dir}/` 下有 scene_count 个 .mp4 文件 ✅
- 每段视频含中文对白语音 + 配乐 + 音效 ✅
- 各段视频时长与 `scene_durations` 一致 ✅

**🔔 向用户展示关键产出**（⚠️ **必须展示每段分镜视频，不得跳过**）：
- 🎬 **分镜视频列表**：所有视频**必须**以 `<video src="{tos_url}" width="640" controls>第N章{章节名}</video>` 格式展示（⚠️ **必须使用 TOS URL，不得使用本地磁盘路径，不得使用纯文本链接或 Markdown 链接**），每段附带章节名 + 时长 + 核心对白 1-2 句摘录
- 📊 **质量评分**：展示评分结果

> ⚠️ 视频展示格式示例（必须严格遵循）：
> ```
> **第一章：{章节名}**（{时长}秒）
> 核心对白："{角色A}：{台词}"
> <video src="https://tos-cn-beijing.volces.com/.../scene_01.mp4?签名参数" width="640" controls>第一章{章节名}</video>
> ```

---

## 步骤7：视频合成与交付

**完整规格参见 `references/video-synthesizer.md`**。

核心流程：
1. **检查并安装 ffmpeg**（首次使用时自动安装）
2. 严格筛选视频文件（只接受 scene_NN.mp4 格式）
3. 按顺序合并所有视频
4. 上传到 TOS
5. 保存交付文档，展示最终结果

**⚠️ 第一步：检查并安装 ffmpeg（合成前必须确认可用）**

> 💡 **向用户说明**：在检查/安装 ffmpeg 时，向用户简要解释：
> 「接下来需要将各段分镜视频按顺序合并为一部完整漫剧。合并视频需要用到 **ffmpeg**（一个开源的音视频处理工具），我来检查一下环境中是否已安装……」
> 如果需要安装，告知用户：「正在安装 ffmpeg，这是一个专业的视频拼接工具，用于将 {scene_count} 段分镜视频无缝合并为完整漫剧视频，同时自动检测最终时长。安装只需几秒钟。」

```bash
# 检查 ffmpeg 是否已安装
which ffmpeg && ffmpeg -version || echo "ffmpeg not found, installing..."

# macOS 自动安装
brew install ffmpeg 2>/dev/null || true

# Linux 自动安装
# sudo apt-get install -y ffmpeg 2>/dev/null || sudo yum install -y ffmpeg 2>/dev/null || true
```

> 如果 ffmpeg 已安装则直接跳过，无需重复安装。

**合并视频：**
```bash
python scripts/video_merge.py --input-dir "<videos_dir>" --output "<final_dir>/<task_name>_final.mp4" --scene-count <N>
python scripts/tos_upload.py "<final_dir>/<task_name>_final.mp4"
```

> 合并后的实际总时长由 ffprobe 自动检测（因为每段视频时长可能不同）。

确认产物：
- `{final_dir}/{task_name}_final.mp4` ✅
- TOS 签名 URL ✅

**🔔 向用户展示关键产出**（⚠️ **视频必须使用 `<video>` 标签展示，不得使用纯文本链接或 Markdown 链接**）：
- 🎬 **最终视频**：合成视频**必须**以 `<video src="{tos_signed_url}" width="640" controls>完整漫剧视频</video>` 格式展示（⚠️ **必须使用 TOS URL，禁止使用纯文本 URL、Markdown 代码块包裹的 URL 或 Markdown 链接格式**）
- 🔗 **TOS 链接**：展示完整签名 URL（作为备用文本链接，放在 `<video>` 标签之后）
- 📁 **任务目录结构**：展示完整目录树

> ⚠️ **最终视频展示格式（必须严格遵循，不得使用其他展示方式）**：
> ```
> 🎬 漫剧生成完成！
> 
> <video src="https://tos-cn-beijing.volces.com/.../task_name_final.mp4?签名参数" width="640" controls>完整漫剧视频</video>
> 
> 🔗 TOS 链接：https://tos-cn-beijing.volces.com/.../task_name_final.mp4?签名参数
> ```
> ❌ **错误示例（禁止使用）**：
> - ~~```text\nhttps://...\n```~~（代码块包裹）
> - ~~[视频链接](https://...)~~（Markdown 链接）
> - ~~https://...~~（纯文本 URL）

---

## 步骤8：产物验证与效果评分

**每个任务完成后，必须执行完整的产物验证和效果评分。**

### 8.1 产物完整性检查

逐项检查以下产物目录结构，确认每个文件/文件夹**存在且非空**：

```
{task_folder}/
├── characters/                  ← 必须包含至少1个 .jpg 文件
│   ├── char_<name1>.jpg
│   ├── char_<name2>.jpg
│   └── char_<name3>.jpg
├── characters.md                ← 必须非空，含 STYLE_ANCHOR + 角色提示词
├── cover.jpg                    ← 必须存在且文件大小 > 0
├── final/                       ← 必须包含1个 _final.mp4 文件
│   └── <task_name>_final.mp4
├── plot.md                      ← 必须非空，含章节大纲 + 时长分配
├── requirements.md              ← 必须非空，含需求文档
├── script.md                    ← 必须非空，含逐秒剧本
├── storyboard/                  ← 必须包含 scene_count 个 .jpg 文件
│   ├── scene_01.jpg
│   ├── scene_02.jpg
│   └── ...
└── videos/                      ← 必须包含 scene_count 个 .mp4 文件
    ├── scene_01.mp4
    ├── scene_02.mp4
    └── ...
```

**验证规则**：
- 如果任何文件夹为空或文件内容为空 → **当前任务判定为失败**
- 文件数量必须与 scene_count 严格匹配（storyboard/ 和 videos/ 目录）
- characters/ 目录下的文件数量必须与主要角色数量匹配

### 8.2 效果评分

使用评分工具对任务进行质量评估：

```bash
python scripts/video_scorer.py "<task_folder>"
```

评分输出包含 5 个维度（每项 0-10 分）：

| 评分维度 | 评分标准 |
|---------|---------|
| 剧情连贯性 | 场景间衔接是否流畅，是否有割裂感 |
| 对白丰富度 | 人物台词是否足够，语气是否多样，是否有冲突感 |
| 视觉质感 | 画面风格统一性，特效质量，镜头运用 |
| 情感张力 | 是否有戏剧性起伏，高潮是否震撼 |
| 音画同步 | 配乐是否贴合情绪，配音是否清晰 |

### 8.3 产物验证报告格式

```
📋 产物验证报告

├── characters/          {N}个文件  ✅/❌
├── characters.md        {size}字   ✅/❌
├── cover.jpg            {size}KB   ✅/❌
├── final/               {N}个文件  ✅/❌
│   └── xxx_final.mp4    {size}MB   ✅/❌
├── plot.md              {size}字   ✅/❌
├── requirements.md      {size}字   ✅/❌
├── script.md            {size}字   ✅/❌
├── storyboard/          {N}个文件  ✅/❌
└── videos/              {N}个文件  ✅/❌

产物完整性: ✅ 全部通过 / ❌ {N}项缺失

📊 效果评分
剧情连贯性: X/10
对白丰富度: X/10
视觉质感:   X/10
情感张力:   X/10
音画同步:   X/10
综合评分:   X.X/10

改进建议: [具体建议]
```

> **任何产物缺失或内容为空，整个任务即判定为失败**，必须报告具体缺失项并协调修复。

---

## 总导演执行规范

1. **内容安全预审**：步骤2之后必须对故事创意执行内容安全预审，向用户说明风险等级
2. **上下文传递**：每步必须明确所有路径参数和内容参数
3. **质量门控**：每步完成后确认产物存在，异常时协调解决再继续
4. **画风一致性**：STYLE_ANCHOR 贯穿全流程，所有图片/视频提示词以此开头
5. **角色一致性**：characters.md 中的英文提示词在所有场景中原样复用
6. **剧情连贯性**：场景桥接确保相邻章节自然过渡，情绪弧线有起承转合
7. **对白密度**：4~6秒场景 0-2句对白，7~10秒场景至少3句对白，11~15秒场景至少6句对白，对白间距不超过4秒，有交锋感
8. **智能时长**：每章根据剧情节奏动态分配 4~15 秒，时长多样性优先，总时长控制在目标范围内
9. **运镜多样性**：相邻场景运镜手法不重复，全片至少5种运镜类型；紧张场景用快切近景，铺垫场景用长镜缓推，高潮场景用速度斜坡和环绕
10. **视频生成工具**：只允许使用 `batch_video.py` 的 submit/poll（或失败重试时的 `create_video_task.py` + `query_video_task.py`）
11. **URL 零修改**：所有图片或视频 URL 在输入输出的全流程中均需严格保持原始状态，不允许进行任何形式的篡改（包括但不限于修改域名、路径、query参数、锚点等）。
12. **产物目录**：所有输出固定在 `COMIC_DRAMA_OUTPUT_DIR`（默认 `./output/`）下，每个任务独立目录
13. **图片生成**：优先使用 `python scripts/batch_image_generate.py` 批量并行生成（步骤4角色立绘、步骤5分镜图），单张补充使用 `python scripts/image_generate.py`
14. **内容安全措辞**：视频 prompt 中避免直接使用战争/血腥/武器等高风险词汇，用委婉替代词
15. **产物验证**：步骤7完成后必须执行步骤8的产物完整性检查和效果评分，任何产物缺失即判定失败
16. **关键产出展示**：每步完成后，**必须**将该步骤的关键产出内容（文档摘要、图片预览、视频链接、评分报告等）直接展示给用户，而非仅返回文件路径。用户应在对话流中清晰看到剧情大纲、角色立绘、**分镜图**、视频等核心输出
17. **分镜图必须展示**：步骤5完成后，**必须**以 Markdown 图片格式展示所有分镜图预览（使用 TOS URL），让用户在进入视频生成步骤前确认画面效果
18. **视频展示格式**：所有视频（分镜视频和最终合成视频）**必须**使用 `<video src="{tos_url}" width="640" controls>描述</video>` 格式展示。**禁止**使用纯文本 URL、Markdown 代码块包裹的 URL 或 Markdown 链接格式
19. **ffmpeg 按需安装**：步骤7（视频合成）开始前检查并安装 ffmpeg，按需安装不打扰前期创作流程
20. **场景生成 fallback**：分镜图生成失败时自动重试（最多3次），重试失败后简化 prompt 再尝试，确保尽可能多的场景生成成功

## 什么是好的漫剧

> 剧情有起承转合，台词和语言张弛有度，镜头运用恰到好处（镜头方式多种多样，带着用户进入漫剧世界），
> 画面层次丰富，剧情连贯，情感充沛，人物有个性，画面、场景、音乐、对白细腻且一致，
> 画风始终统一，用户看到漫剧能感受到故事的吸引、情节的连贯、主角的张力和故事线的波澜。
> **节奏是漫剧的灵魂**——快切紧张如鼓点（4~6s），叙事舒缓如弦乐（7~10s），高潮绵长如交响（11~15s），
> 三者交替使用，让观众的心跳随着画面起伏，这才是大师级的节奏把控。

