Video-Gen 项目族交接文档

AI 视频生成 Skill 全家桶 — 核心流程、架构决策、已知坑点与运维指南

📅 编写日期:2026-04-16 ✍️ 作者:Taylor Zhou 📋 休假时间:4月17日 – 5月初 🔖 版本:v1.2(CN/EN 完全对齐)

01 · GitHub 仓库总览

项目族共包含 6 个 Git 仓库,按重要程度排列如下:

🎬
英文版本 — migoo 线上接入的版本,建议后续所有改动都基于这个仓库。支持 Seedance / Kling / Kling-Omni 后端,ElevenLabs TTS 优先 + Gemini TTS 兜底,smart-narration 智能旁白,Veo3 已废弃。
⭐ 主仓库 · 线上版本
🎬
中文版本 — 功能与英文版已完全对齐(2026-04-16)。代码和文档结构一致,固定中文回复。可作为中文语境下的阅读参考。
已对齐 · 中文参考
🧪
自动化测试框架。并发运行多个 Case,自动回答交互问题(风格/时长/比例等),执行到 Phase 3 分镜设计,生成 HTML 测试报告。
自动化测试
🔭
多媒体生成项目/Skill 自动监测工具。支持视频、图像、TTS、音乐四大领域,从 GitHub / Skillhub / Clawhub 三个渠道定期检索,自动去重生成分析报告。
监控工具
🎞
AI 视频拉片工具。使用 Gemini 分析视频内容,提取镜头语言(运镜、构图、光影色调),生成完整剧本(分幕 + 对白/OS + 动作描述)。支持视频 URL 和本地文件,产出可直接喂给 /video-gen 做二次创作。
拉片工具 · video-gen 上游
🗂
早期纯 Veo3 版本(Google Veo 3.1 Fast)。时长固定 4/6/8s、最高 720p。已不再主动维护,Veo3 在主仓库中已标记 Deprecated。
已归档 · 仅参考
建议
后续所有开发都在 video-gen-en 上进行。两个版本的文档已完全对齐(2026-04-16),功能描述一致。主要差异为:
a. 中文版锁定只会用中文回复用户,英文版根据用户语言来回复
b. 英文版整个代码库里不存在中文、中国平台名

02 · 整体架构与技术栈

核心文件

文件职责说明
SKILL.mdSkill 定义 / Agent 行为指南定义 Phase 0-5 全流程、交互卡片、后端选择逻辑
video_gen_tools.pyAPI 调用层video/music/tts/image/vision/setup/check/validate 子命令
video_gen_editor.pyFFmpeg 剪辑层concat/mix/transition/color/narration/smart-narration 子命令
reference/*.md参考文档storyboard-spec / prompt-guide / backend-guide / consistency-guide / api-reference
config.jsonAPI Key 持久化存储所有 provider 的 key,不进 Git

依赖

设计理念

Director Agent 模式:SKILL.md 定义了一个 "导演 Agent" 的完整行为规范。Agent(Claude/其他 LLM)读取 SKILL.md 后,按 Phase 0→5 顺序与用户交互、调用 CLI 工具、最终交付成品视频。

核心原则:灵活规划 + 稳健执行。规划阶段(Phase 1-3)产出结构化 JSON,执行阶段(Phase 4-5)由 JSON 驱动,确保可复现。

03 · 核心工作流 (Phase 0–5)

P0
配置检查
Provider 选择
API Key 配置
环境检测
P1
素材收集
目录扫描
视觉分析
人物识别
P2
创意确认
7 个问题卡片
角色参考图
真人检测
P3
分镜设计
storyboard.json
一致性 Review
用户确认
P4
执行生成
API 并发调用
音乐/旁白
进度跟踪
P5
剪辑输出
拼接 + 转场
旁白插入
配乐 + 输出
Phase 0 — Provider 配置 + 环境检查
  1. 运行 python video_gen_tools.py setup 查看所有 provider 配置状态
  2. 无任何视频 API key → 引导用户选择 Seedance / Kling Official / Kling via fal
  3. 用户提供 key 后通过 setup --set-key 保存到 config.json
  4. 运行 python video_gen_tools.py check 确认 FFmpeg、Python、httpx 就绪
关键规则
没有任何可用的视频 API key 时,禁止进入 Phase 1。必须在此阶段完成至少一个 provider 的配置。
Phase 1 — 素材收集与分析

素材来源:目录路径 / 视频文件 / 无素材(纯创意模式)

视觉分析三级 fallback

  1. Read 工具直接读取图片(多模态模型)
  2. 内置 VisionClient 调用视觉模型
  3. 询问用户手动描述

产出state.json / analysis.json / personas.json

人物识别后只注册基本信息,reference_image 为 null 的角色由 Phase 2 补充。

Phase 2 — 创意确认(7 个问题卡片 + 真人检测)

通过问题卡片与用户交互,收集 7 项关键信息:

#问题影响范围
1视频风格(电影/Vlog/广告/纪录片/实验)调色、转场、配乐基调
2目标时长(15s/30s/60s/自定义)分镜数量和节奏
3画面比例(9:16/16:9/1:1)所有生成和剪辑命令
4配乐需求是否调用 Suno
5旁白/解说TTS 生成、时间点规划
6角色画风(realistic/anime/mixed)参考图风格、是否禁用 Seedance
7角色参考图来源AI 生成三视图 / 上传 / 纯文字
真人素材检测(Phase 2 末尾,非常关键)
visual_style = realistic + 有角色参考图 → 禁用 Seedance,强制使用 Kling-Omni。
这是一个保守策略:Seedance 对真人照片的审核行为不稳定,实际测试表明时而通过时而被 content_policy_violation 拒绝。为避免生产事故统一禁用。

产出creative.json(含 backend_selection 决策)/ 更新后的 personas.json

Phase 3 — 分镜设计(核心!)

生成前必须阅读三个参考文档:storyboard-spec.md / prompt-guide.md / backend-guide.md

关键流程

  1. personas.json 同步角色信息到 storyboard
  2. 读取 creative.jsonbackend_selection,自动选择后端
  3. scenes[] → shots[] 两层结构设计分镜
  4. 自动执行一致性 Review(时间光照、空间元素、人物妆造、image/video 匹配、跨 scene 连续性)
  5. 必须用户确认后才能进入 Phase 4

Seedance vs Kling-Omni 分镜区别(很容易搞错)

维度SeedanceKling-Omni
分镜图级别scene-level(一张图覆盖多 shots)shot-level(每 shot 一张图)
执行方式一次 API 调用生成整个 scene逐 shot 调用 API
输出1 个视频N 个视频片段
shot 里需要什么video_prompt + reference_imagesvideo_prompt + image_prompt + frame_path

产出storyboard/storyboard.json

Phase 4 — 执行生成

执行前检查(全部必须通过)

  1. python video_gen_tools.py validate --storyboard ... 校验 schema
  2. 参考图尺寸检查(<720px 放大、>2048px 缩小)
  3. Storyboard 链路一致性检查(Omni 是否有 shot-level 结构等)

执行规则

  • 第一个 API 调用单独执行,确认成功后才并发
  • 并发不超过 3 个
  • 失败重试最多 2 次,然后询问用户
  • 实时更新 state.json

执行顺序

视频片段生成 → 音乐生成 → 旁白生成(如有)→ 进入 Phase 5

产出generated/videos/*.mp4 / generated/music/*.mp3 / generated/narration/*.mp3

Phase 5 — 剪辑输出

合成流程

拼接(自动归一化)→ 旁白插入 → 转场 → 调色 → 配乐混音 → 输出 final.mp4

音频混音关键规则

FFmpeg amix 必须使用 normalize=0
不加这个参数,FFmpeg 的自动均一化会把所有音轨压到同一音量,导致 BGM 把人声盖掉。
video_gen_editor.pymix_audio() 函数已硬编码 normalize=0(约第 470 行)。千万不要动这行。
音频类型推荐音量说明
视频环境声/同期声0.8保留原始音频氛围
旁白/解说1.5–2.0确保人声清晰
BGM0.1–0.15(Vlog)/ 0.2–0.3(电影)/ 0.5–0.7(MV)按视频类型灵活调

产出output/final.mp4

04 · 后端选择与决策逻辑

四大后端能力对比

Seedance 2
Provider: fal > piapi
  • 智能切镜(时间分段 prompt 自动触发)
  • 多参考图(最多 9 张)
  • 首尾帧控制
  • 音画同出
  • 时长 4-15s(任意整数)
  • 最高仅 720p
  • 真人审核不稳定
Kling-Omni
Provider: official / fal
  • 多参考图(<<>> 引用)
  • 角色一致性好
  • 无真人审核限制
  • multi-shot 支持
  • 最高 1080p
  • 无首帧精确控制
  • 需 shot-level 逐个调用
Kling 3.0
Provider: official / fal
  • 首帧精确控制(--image)
  • 首尾帧控制
  • 最高 1080p
  • multi-shot
  • 无多参考图能力
Veo3
Provider: compass 已废弃
  • 时长仅 4/6/8s(枚举值)
  • 最高 720p
  • 无 multi-shot
  • 无多参考图
  • 两个版本均已统一标记 Deprecated

场景驱动选择决策表

场景真人素材优先后端兜底后端原因
虚构片/短剧无(动漫)SeedanceKling-Omni智能切镜 + 多参考图
虚构片/短剧有真人Kling-Omni真人素材禁用 Seedance
广告片(无素材)SeedanceKling-Omni长镜头 + 智能切镜
广告片(有素材)Kling-3.0首帧精确控制
MV 短片SeedanceKling-Omni长镜头 + 音乐驱动
MV 短片有真人Kling-Omni真人素材禁用 Seedance
Vlog/写实类Kling-3.0首帧精确控制
核心原则(优先级从高到低)
1. 真人素材检测 → 禁用 Seedance(顶层过滤)
2. 同一项目使用同一模型,不混用
3. 虚构片不使用 text2video
4. 需要首帧控制时只能用 Kling
5. Seedance/Omni 的分镜图是参考,不是首帧精确控制

05 · 降级链路与容错策略

降级路径

Seedance
Kling-Omni
Kling img2video
Kling text2video
降级路径触发条件损失操作
Seedance → Kling-OmniSeedance 超时/审核/429失去智能切镜需重新按 shot-level 规划分镜
Kling-Omni → Kling img2videoOmni 429/402失去多参考图,角色一致性降低用 Gemini 生成分镜图做首帧
Kling img2video → text2video无首帧图可用失去首帧控制纯文字生成
降级前提条件
1. 已重试一次仍失败(Seedance 超时需等待 10 分钟)
2. 用户明确同意降级(不能自动降级)
3. 降级后仍有可用后端

Seedance → Kling-Omni 降级要点

这不是简单的字段替换!Seedance 是 scene-level(一次调用生成整个 scene),Kling-Omni 是 shot-level(逐 shot 调用)。降级需要:

  1. 保留 storyboard 的创意设计(风格、时长、角色等)
  2. 为每个 shot 新增 image_promptframe_path
  3. 先用 Gemini 为每个 shot 生成分镜图
  4. 再逐 shot 调用 Kling-Omni API

API 错误类型处理

错误类型处理方式
429 并发限制询问用户:等待 60s 重试 / 降级 / 取消
402 余额不足告知充值,或降级到其他后端
网络超时重试 2 次,失败后询问
content_policy_violation通常是 Seedance 真人审核问题,降级到 Kling-Omni

06 · 中文版 vs 英文版差异

两个版本核心 flow 相同(Phase 0-5),代码完全一致。截至 2026-04-16 SKILL.md 文档已全部对齐。

已对齐项(全部完成)

维度对齐前状态对齐后状态
TTS 链路EN 文档仅有基础 --voice-style 参数✅ EN 已补齐 ElevenLabs 优先链路(voice 映射、stability、文本增强、voice-id 复用、Gemini 兜底)
旁白插入命令EN 文档仅描述 narration(硬插入)✅ EN 已改为 smart-narration(自动测量时长、不重叠插入)
Vlog 兜底后端CN 无兜底(—),EN 写了 Kling-Omni✅ 统一为 —(无兜底)
Veo3 状态CN 无 Veo3 标注,EN 有多处 deprecated✅ 两版 SKILL.md + backend-guide 均统一标记 Deprecated
storyboard 场景精确化EN 缺少 time_state / spatial_setting 精确化规范✅ EN 已补充精确化要求和合格/不合格对比表
人物妆造锁定字段EN 缺少 locked_costume / locked_hairstyle / locked_makeup✅ EN 已补充字段定义和 costume_scope 说明
TTS 音色表两版均引用已废弃的火山引擎 TTS✅ 统一更新为 ElevenLabs + Gemini 映射表
EN 工具路径EN api-reference.md 全部引用 video-gen/ 路径✅ 24 处路径已修正为 video-gen-en/
一致性审查模板CN 内嵌完整 Review Prompt,EN 仅引用外部文件✅ EN 已补齐完整 prompt 模板(5 项审查原则 + 输出格式)
Phase 2 Q7 检查逻辑CN 有 PersonaManager 代码片段,EN 省略✅ EN 已补充 Python 检查逻辑
首帧控制描述CN "只能用 Kling",EN "Kling or Vidu"✅ 统一为 "only Kling"
text2video / 纯文字条款EN 多了 "Can use text2video",CN 说"后续流程无需改动"✅ EN 对齐为"后续流程无需改动"
prompt-guide 章节顺序CN 先三视图后附录,EN 先附录后三视图✅ EN 调整为先三视图后附录
prompt-guide Kling 模板EN 末尾有多余反引号 ``````✅ 修复为正确的 ```
EN 表格 "Chinese" 描述prompt-guide 写 "Chinese description",storyboard-spec 写 "Chinese display name"✅ 统一改为 "display name"
旁白字段名两版 SKILL.md 用 overall_time_range,storyboard-spec 用 time_range✅ SKILL.md 统一为 time_range,与 spec 一致
CN 重复规则块CN 有两个 "关键规则" 段落(内容略有矛盾)✅ 合并为一个,消除 Kling/Vidu 矛盾描述

仍存在的差异(预期差异,无需对齐)

维度video-gen(中文版)video-gen-en(英文版 / 线上版)
回复语言锁定中文回复根据用户语言自动切换
代码库语言含中文文案、中国平台名(如"快手出品"等)整个代码库不存在中文、中国平台名
完全对齐
代码层面两个版本始终一致(video_gen_tools.py / video_gen_editor.py 完全相同)。文档层面(SKILL.md + 全部 reference/*.md)现已完全对齐,仅保留语言和 UI 文案差异。Agent 读取任一版本 SKILL.md 后均能正确调用所有已实现的功能。

07 · 历史踩坑记录(重点!)

08 · 潜在风险与待解决项

风险项严重度现状建议
Seedance 审核策略变更 当前采用保守策略统一禁用。如果 Seedance 未来改善审核,可能白白损失智能切镜优势 定期用测试 Case 验证 Seedance 对 realistic 参考图的审核表现,确认稳定后可放宽策略
Kling 官方 API 429 频率 高并发时容易触发。fal 代理可绕过但有额外成本 监控 429 频率,考虑预购高并发配额或优先走 fal
ElevenLabs TTS 仅中文版有 已解决 英文版 SKILL.md 已补齐完整 ElevenLabs 链路(4/16 对齐)
smart-narration 仅中文版有 已解决 英文版 SKILL.md 已更新为 smart-narration(4/16 对齐)
Veo3 已废弃但文档未统一 已解决 两个版本 backend-guide.md 均已标记 Veo3 Deprecated(4/16 对齐) 后续可考虑彻底移除 Veo3 后端代码
自动化测试只到 Phase 3 video-gen-test 只测到分镜设计,不涵盖实际视频生成和剪辑 扩展测试框架覆盖 Phase 4-5(需要 API 费用预算)

09 · 周边工具链

video-gen-test — 自动化测试框架

video-agent-monitor — 多媒体 Skill 监控

video-understanding — AI 视频拉片工具

video-gen-veo3 — Veo3 独立版(已归档)

10 · API Keys 与环境变量

环境变量用途何时需要优先级
FAL_API_KEYfal.ai 代理(Seedance / Kling-Omni / Gemini 图片)使用 fal 相关服务时Seedance 第一优先
KLING_ACCESS_KEY
KLING_SECRET_KEY
Kling 官方 API使用 Kling / Kling-Omni 官方时官方第一优先
SEEDANCE_API_KEYSeedance piapi 代理fal 不可用时的兜底piapi 第二优先
COMPASS_API_KEYGemini 图片 + TTS图片生成、Gemini TTS(ElevenLabs 兜底)图片生成第一优先
SUNO_API_KEYSuno 音乐生成生成 BGM 时
YUNWU_API_KEYGemini 图片生成(yunwu 代理)图片生成最低优先级兜底最低
VISION_API_KEY
VISION_BASE_URL
VISION_MODEL
内置视觉分析 fallback非多模态模型时的图片分析
Provider 优先级
图片生成:compass → fal → yunwu
视频生成:official → fal
Seedance:fal → piapi
TTS:ElevenLabs → Gemini(两个版本已统一)

所有 key 既可以通过环境变量设置,也可以通过 config.json 持久化(setup --set-key 命令)。config.json 不应提交到 Git。

11 · 项目文件结构

Skill 仓库结构

video-gen/ (or video-gen-en/)
├── SKILL.md                    # Skill 定义(Phase 0-5 全流程)
├── video_gen_tools.py          # API 调用 CLI 工具
├── video_gen_editor.py         # FFmpeg 剪辑 CLI 工具
├── config.json                 # API Key 持久化(不进 Git)
└── reference/
    ├── storyboard-spec.md      # 分镜规范、JSON 格式
    ├── prompt-guide.md         # Prompt 编写规范
    ├── backend-guide.md        # 后端选择决策树
    ├── consistency-guide.md    # 一致性审查规范
    └── api-reference.md        # CLI 参数速查

运行时项目目录

~/video-gen-projects/{project_name}_{timestamp}/
├── state.json                  # 项目状态(Phase 进度)
├── personas.json               # 角色注册表
├── materials/
│   └── personas/               # 角色参考图
├── analysis/
│   └── analysis.json           # 素材分析结果
├── creative/
│   ├── creative.json           # 创意方案(含 backend_selection)
│   └── decision_log.json       # 决策记录
├── storyboard/
│   └── storyboard.json         # 分镜脚本
├── generated/
│   ├── frames/                 # 生成的分镜图
│   ├── videos/                 # 生成的视频片段
│   ├── music/                  # 生成的音乐
│   └── narration/              # 生成的旁白
└── output/
    └── final.mp4               # 最终视频

12 · 常见问题 FAQ

Q: 接手后应该先看哪些文件?
  1. SKILL.md — 理解完整工作流
  2. reference/backend-guide.md — 理解后端选择逻辑
  3. reference/storyboard-spec.md — 理解分镜 JSON 结构
  4. video_gen_tools.py--help — 了解所有子命令
Q: 如何快速验证环境是否正常?
python video_gen_tools.py check    # 检查依赖和 API key
python video_gen_tools.py setup    # 查看所有 provider 状态
Q: 用户报告"视频没有声音"怎么排查?
  1. 检查 storyboard.json 中 audio 字段是否为 true
  2. 检查是否使用了 --audio 参数
  3. 检查 concat 时是否保护了原始音轨
  4. 检查 mix_audio 是否用了 normalize=0
Q: Seedance 生成超时怎么办?

Seedance 通过 fal 通常 ~60s 完成,通过 piapi ~120s。如果超过 10 分钟:

  1. 重试一次
  2. 仍然失败 → 询问用户是否降级到 Kling-Omni
  3. 降级需要重新按 shot-level 规划分镜(见第 5 节降级流程)
Q: 如何跑自动化测试?
# 跑所有 Case
/video-gen-test

# 只跑指定 Case
/video-gen-test --cases 1,3,5

测试只执行到 Phase 3(分镜设计),不会真正生成视频,不消耗视频 API 费用。

测试用例在 /Users/taylor.zhoush/Documents/Obsidian Vault/自动测试case.md

Q: 如何添加新的视频生成后端?
  1. video_gen_tools.py 中添加新的 backend handler
  2. reference/backend-guide.md 中添加能力对比和决策逻辑
  3. reference/api-reference.md 中添加 CLI 参数说明
  4. 在 SKILL.md 的后端选择决策表中增加对应行
  5. validate 命令中添加校验规则
  6. 跑一遍自动化测试验证不会破坏现有流程
Q: creative.json 的 backend_selection 字段是干嘛的?

Phase 2 末尾的真人素材检测结果。Phase 3 读取此字段来决定用哪个后端:

{
  "seedance_disabled": true,         // 是否禁用 Seedance
  "preferred_backend": "kling-omni", // 推荐后端
  "reason": "真人参考图会触发 Seedance content_policy_violation"
}

如果 seedance_disabled = true,Phase 3 会自动按 Kling-Omni 的 shot-level 标准设计分镜。

Q: 2026-04-16 的 CN/EN 对齐改了哪些文件?

video-gen(中文版):3 个文件

  • SKILL.md — 补充 Veo3 deprecated 标注(Provider 表、Phase 0、Phase 4 链路表、工具速查);移除重复的"关键规则"块;旁白字段名 overall_time_range → time_range
  • reference/backend-guide.md — Veo3 标记 Deprecated,移除作为 Vlog 兜底
  • reference/prompt-guide.md — TTS 音色表从火山引擎更新为 ElevenLabs + Gemini

video-gen-en(英文版):7 个文件

  • SKILL.md — TTS 链路补齐、smart-narration、Vlog 兜底修正、一致性审查完整 prompt 模板、Phase 2 Q7 Python 检查逻辑、首帧 "Kling or Vidu" → "only Kling"、text2video 条款对齐、旁白字段名统一
  • reference/api-reference.md — 24 处工具路径 video-gen/ → video-gen-en/
  • reference/backend-guide.md — Veo3 Deprecated
  • reference/prompt-guide.md — TTS 音色表更新、章节顺序对齐(三视图→附录)、修复多余反引号、"Chinese description" → "display name"
  • reference/storyboard-spec.md — 场景精确化规范 + 人物妆造锁定字段 + "Chinese display name" → "display name"
  • reference/consistency-guide.md — 无变更(已一致)

代码层(.py)无变更,全部为文档对齐。

Q: 为什么 Seedance 用 "scene-level" 而 Kling-Omni 用 "shot-level"?

这是两个后端的核心架构差异:

  • Seedance 有"智能切镜"能力 — 给它一个时间分段 prompt(0-3s 做什么,3-6s 做什么...),它自动在一次调用中生成包含多个镜头的视频。所以只需要一张 scene-level 分镜图作为视觉参考。
  • Kling-Omni 没有这个能力 — 每个镜头需要单独调用 API,每个 shot 需要自己的分镜图和 prompt。

这个差异直接影响了 storyboard.json 的结构设计和降级策略的复杂度。