AI 视频生成 Skill 全家桶 — 核心流程、架构决策、已知坑点与运维指南
项目族共包含 6 个 Git 仓库,按重要程度排列如下:
/video-gen 做二次创作。| 文件 | 职责 | 说明 |
|---|---|---|
SKILL.md | Skill 定义 / Agent 行为指南 | 定义 Phase 0-5 全流程、交互卡片、后端选择逻辑 |
video_gen_tools.py | API 调用层 | video/music/tts/image/vision/setup/check/validate 子命令 |
video_gen_editor.py | FFmpeg 剪辑层 | concat/mix/transition/color/narration/smart-narration 子命令 |
reference/*.md | 参考文档 | storyboard-spec / prompt-guide / backend-guide / consistency-guide / api-reference |
config.json | API 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 驱动,确保可复现。
python video_gen_tools.py setup 查看所有 provider 配置状态setup --set-key 保存到 config.jsonpython video_gen_tools.py check 确认 FFmpeg、Python、httpx 就绪素材来源:目录路径 / 视频文件 / 无素材(纯创意模式)
视觉分析三级 fallback:
产出:state.json / analysis.json / personas.json
人物识别后只注册基本信息,reference_image 为 null 的角色由 Phase 2 补充。
通过问题卡片与用户交互,收集 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 生成三视图 / 上传 / 纯文字 |
visual_style = realistic + 有角色参考图 → 禁用 Seedance,强制使用 Kling-Omni。content_policy_violation 拒绝。为避免生产事故统一禁用。
产出:creative.json(含 backend_selection 决策)/ 更新后的 personas.json
生成前必须阅读三个参考文档:storyboard-spec.md / prompt-guide.md / backend-guide.md
personas.json 同步角色信息到 storyboardcreative.json 的 backend_selection,自动选择后端scenes[] → shots[] 两层结构设计分镜| 维度 | Seedance | Kling-Omni |
|---|---|---|
| 分镜图级别 | scene-level(一张图覆盖多 shots) | shot-level(每 shot 一张图) |
| 执行方式 | 一次 API 调用生成整个 scene | 逐 shot 调用 API |
| 输出 | 1 个视频 | N 个视频片段 |
| shot 里需要什么 | video_prompt + reference_images | video_prompt + image_prompt + frame_path |
产出:storyboard/storyboard.json
python video_gen_tools.py validate --storyboard ... 校验 schemastate.json视频片段生成 → 音乐生成 → 旁白生成(如有)→ 进入 Phase 5
产出:generated/videos/*.mp4 / generated/music/*.mp3 / generated/narration/*.mp3
拼接(自动归一化)→ 旁白插入 → 转场 → 调色 → 配乐混音 → 输出 final.mp4
video_gen_editor.py 的 mix_audio() 函数已硬编码 normalize=0(约第 470 行)。千万不要动这行。
| 音频类型 | 推荐音量 | 说明 |
|---|---|---|
| 视频环境声/同期声 | 0.8 | 保留原始音频氛围 |
| 旁白/解说 | 1.5–2.0 | 确保人声清晰 |
| BGM | 0.1–0.15(Vlog)/ 0.2–0.3(电影)/ 0.5–0.7(MV) | 按视频类型灵活调 |
产出:output/final.mp4
| 场景 | 真人素材 | 优先后端 | 兜底后端 | 原因 |
|---|---|---|---|---|
| 虚构片/短剧 | 无(动漫) | Seedance | Kling-Omni | 智能切镜 + 多参考图 |
| 虚构片/短剧 | 有真人 | Kling-Omni | — | 真人素材禁用 Seedance |
| 广告片(无素材) | 无 | Seedance | Kling-Omni | 长镜头 + 智能切镜 |
| 广告片(有素材) | 有 | Kling-3.0 | — | 首帧精确控制 |
| MV 短片 | 无 | Seedance | Kling-Omni | 长镜头 + 音乐驱动 |
| MV 短片 | 有真人 | Kling-Omni | — | 真人素材禁用 Seedance |
| Vlog/写实类 | 有 | Kling-3.0 | — | 首帧精确控制 |
| 降级路径 | 触发条件 | 损失 | 操作 |
|---|---|---|---|
| Seedance → Kling-Omni | Seedance 超时/审核/429 | 失去智能切镜 | 需重新按 shot-level 规划分镜 |
| Kling-Omni → Kling img2video | Omni 429/402 | 失去多参考图,角色一致性降低 | 用 Gemini 生成分镜图做首帧 |
| Kling img2video → text2video | 无首帧图可用 | 失去首帧控制 | 纯文字生成 |
这不是简单的字段替换!Seedance 是 scene-level(一次调用生成整个 scene),Kling-Omni 是 shot-level(逐 shot 调用)。降级需要:
image_prompt 和 frame_path| 错误类型 | 处理方式 |
|---|---|
| 429 并发限制 | 询问用户:等待 60s 重试 / 降级 / 取消 |
| 402 余额不足 | 告知充值,或降级到其他后端 |
| 网络超时 | 重试 2 次,失败后询问 |
| content_policy_violation | 通常是 Seedance 真人审核问题,降级到 Kling-Omni |
两个版本核心 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(英文版 / 线上版) |
|---|---|---|
| 回复语言 | 锁定中文回复 | 根据用户语言自动切换 |
| 代码库语言 | 含中文文案、中国平台名(如"快手出品"等) | 整个代码库不存在中文、中国平台名 |
content_policy_violation。
| Provider + 后端 | 真人支持 | 生成速度 | 备注 |
|---|---|---|---|
| fal Seedance | ✗ 完全不支持 | ~2 min | 速度快但真人一律被拒 |
| piapi Seedance | 时灵时不灵 | 很慢,成功率低 | 偶尔通过,不可依赖 |
| fal Kling-Omni / Kling | ✓ | ~8 min | 稳定但等待时间长 |
--audio 参数定义为 store_true(默认 False),Agent 不传就是静音。而 Seedance 的 FalSeedanceClient.submit_task 方法签名默认 generate_audio=True 且 CLI 未覆盖,所以 Seedance 天然有声音。这个不对称导致从 Seedance 切到 Kling 后 Agent 不会主动加 --audio,视频就没声了。audio.enabled 字段在代码里从未被读取(只读了 aspect_ratio),所以即使分镜标了 enabled: true,Kling 调用依然静音。
--audio 改为默认开启(default=True),新增 --no-audio 用于显式关闭。所有后端行为统一:默认带声音,不需要声音时用 --no-audio,后续剪辑阶段可去掉音轨。amix 滤镜默认开启自动均一化(normalize=1),会把所有音轨音量压到相同水平,导致 BGM 音量与人声一样大,人声被盖掉,最终视频完全不能用。
mix_audio() 已硬编码 normalize=0。绝对不能移除。video_gen_tools.py music 如果不传 --creative 参数,不会读取 creative.json 里的 music.prompt 和 music.style,生成的音乐和视频风格完全不搭。
--creative creative/creative.json。video_gen_editor.py concat 需要从 storyboard.json 读取 aspect_ratio 来确定输出尺寸。不传会用默认值,最终视频可能被拉伸。
--storyboard。--reference 列表中靠后的图片权重更高。主角参考图放前面可能导致配角面部特征抢占主角。
@Image1(大写 I),piapi 用 @image1(小写 i)。写错大小写会导致图片引用失效。
| 风险项 | 严重度 | 现状 | 建议 |
|---|---|---|---|
| Seedance 审核策略变更 | 高 | 当前采用保守策略统一禁用。如果 Seedance 未来改善审核,可能白白损失智能切镜优势 | 定期用测试 Case 验证 Seedance 对 realistic 参考图的审核表现,确认稳定后可放宽策略 |
| Kling 官方 API 429 频率 | 中 | 高并发时容易触发。fal 代理可绕过但有额外成本 | 监控 429 频率,考虑预购高并发配额或优先走 fal |
| 已解决 | 英文版 SKILL.md 已补齐完整 ElevenLabs 链路(4/16 对齐) | — | |
| 已解决 | 英文版 SKILL.md 已更新为 smart-narration(4/16 对齐) | — | |
| 已解决 | 两个版本 backend-guide.md 均已标记 Veo3 Deprecated(4/16 对齐) | 后续可考虑彻底移除 Veo3 后端代码 | |
| 自动化测试只到 Phase 3 | 低 | video-gen-test 只测到分镜设计,不涵盖实际视频生成和剪辑 | 扩展测试框架覆盖 Phase 4-5(需要 API 费用预算) |
/video-gen-test 或 /video-gen-test --cases 1,3,5~/vico-test-results/{timestamp}/report.html/Users/taylor.zhoush/Documents/Obsidian Vault/自动测试case.md/Users/taylor.zhoush/Downloads/00-素材库/测试集/reports/ 目录下的 today.md / all-projects-list.md / index.html/AI媒体监控 或 /check media agents,也可定时执行/video-understanding <视频URL或本地路径>,或说"拉片""分析视频""解析这个视频"/video-gen ~/video-understanding-projects/{project}/output/script.mdMIGOO_API_KEY + MIGOO_BASE_URL(必需),FILE_SERVICE_URL(可选,本地视频上传)| 环境变量 | 用途 | 何时需要 | 优先级 |
|---|---|---|---|
FAL_API_KEY | fal.ai 代理(Seedance / Kling-Omni / Gemini 图片) | 使用 fal 相关服务时 | Seedance 第一优先 |
KLING_ACCESS_KEYKLING_SECRET_KEY | Kling 官方 API | 使用 Kling / Kling-Omni 官方时 | 官方第一优先 |
SEEDANCE_API_KEY | Seedance piapi 代理 | fal 不可用时的兜底 | piapi 第二优先 |
COMPASS_API_KEY | Gemini 图片 + TTS | 图片生成、Gemini TTS(ElevenLabs 兜底) | 图片生成第一优先 |
SUNO_API_KEY | Suno 音乐生成 | 生成 BGM 时 | — |
YUNWU_API_KEY | Gemini 图片生成(yunwu 代理) | 图片生成最低优先级兜底 | 最低 |
VISION_API_KEYVISION_BASE_URLVISION_MODEL | 内置视觉分析 fallback | 非多模态模型时的图片分析 | — |
所有 key 既可以通过环境变量设置,也可以通过 config.json 持久化(setup --set-key 命令)。config.json 不应提交到 Git。
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 # 最终视频
--help — 了解所有子命令python video_gen_tools.py check # 检查依赖和 API key python video_gen_tools.py setup # 查看所有 provider 状态
audio 字段是否为 true--audio 参数normalize=0Seedance 通过 fal 通常 ~60s 完成,通过 piapi ~120s。如果超过 10 分钟:
# 跑所有 Case /video-gen-test # 只跑指定 Case /video-gen-test --cases 1,3,5
测试只执行到 Phase 3(分镜设计),不会真正生成视频,不消耗视频 API 费用。
测试用例在 /Users/taylor.zhoush/Documents/Obsidian Vault/自动测试case.md
video_gen_tools.py 中添加新的 backend handlerreference/backend-guide.md 中添加能力对比和决策逻辑reference/api-reference.md 中添加 CLI 参数说明validate 命令中添加校验规则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 标准设计分镜。
video-gen(中文版):3 个文件
SKILL.md — 补充 Veo3 deprecated 标注(Provider 表、Phase 0、Phase 4 链路表、工具速查);移除重复的"关键规则"块;旁白字段名 overall_time_range → time_rangereference/backend-guide.md — Veo3 标记 Deprecated,移除作为 Vlog 兜底reference/prompt-guide.md — TTS 音色表从火山引擎更新为 ElevenLabs + Geminivideo-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 Deprecatedreference/prompt-guide.md — TTS 音色表更新、章节顺序对齐(三视图→附录)、修复多余反引号、"Chinese description" → "display name"reference/storyboard-spec.md — 场景精确化规范 + 人物妆造锁定字段 + "Chinese display name" → "display name"reference/consistency-guide.md — 无变更(已一致)代码层(.py)无变更,全部为文档对齐。
这是两个后端的核心架构差异:
这个差异直接影响了 storyboard.json 的结构设计和降级策略的复杂度。