/make-video — 步骤 2–4:从选题到合并发布
输入:用户从当前工作树的 ideas 文件中做出的选择(“/make-video N”+ 修改)或用户指定的对象。
输出 = 完成定义(DoD)(参见 AGENTS.md,“聊天管道”):out/<ep>/release/ 目录下的主视频文件 <ep>_en_1080x1920p60.mp4 和 publish_en.md,共两个文件,交付给用户;视觉 QA 通过;所有更改已提交;分支已合并到 main(通过 video_wt.py finish);工作树已移除。
质量标准 — docs/quality.md:电影感而非信息图;事实用语言表达,视觉效果用画面呈现;最终渲染不超过 6 小时 GPU。
仅限英文,目标时长 29–29.5 秒,最长 30.0 秒(docs/shorts_format.md)。
参考链接:流程 — docs/pipeline.md;审批 — docs/approval.md;发布包 — docs/publish.md;角色 — docs/workflows.md;库 — docs/spacekit.md;时间 — docs/timings.md;队列 — docs/render_queue.md;智能体、提交、常见问题 — AGENTS.md。
命令:在工作树根目录下使用 Git Bash;<ep> 表示 epNNN_<slug>。
步骤 0 — 工作树,队列,提交
- 分支为
video/epNNN…,在/next-video之后继续使用。如果聊天在未执行/next-video的主仓库副本中,则执行python tools/video_wt.py start→ Claude 使用EnterWorktree(参数path) / Codex 使用workdir。 - Blender、TTS、音乐、合成 — 仅通过队列进行:提交任务后,聊天可继续处理文本工作。
- 每个模块完成后需提交,提交信息格式为
type(<ep>): …,并包含模型轨迹。每次步骤结束时,工作树应为干净状态。
第一部分 — 审批前
- 剧集。 执行
python tools/video_wt.py claim <slug>(slug 为[a-z0-9_],不超过 16 个字符,根据目录名称确定)。将episodes/_template/复制到episodes/<ep>/,在episode.json中设置id为文件夹名称,languages: ["en"](不设置frames_dir/audio_dir路径)。在 ideas 文件末尾追加:已选择: N, <日期>, 修改: …, 剧集: <ep>。 提交:feat(<ep>): 从 N 号方案创建剧集。 - 事实调查:研究员 + 事实核查员(
docs/workflows.md) →facts.md(每个数字附带链接,视觉参考资料)。提交。 - 视觉简报
visual_brief.md(角色:“导演”):参考资料,首帧,核心镜头,色调,光照,每个镜头的摄像机与事件,惯例,预算。“电影感/惊艳”评论家对简报进行评审 → 修改。提交。 - 脚本
script_9x16.json(英文):6–8 个段落,时间锚点at(秒),总时长 29–29.5 秒(严格 ≤ 30.0 秒),约 55–70 个单词;第一句为事实钩子;最后一句引导回开头(循环)。en_cap中的数字,|表示手动换行(参考docs/pipeline.md,“字幕与副标题”)。频道语音:Kokoroaf_heart×0.98。提交。 - 场景与镜头。
system.py(实际参数 → 屏幕显示,惯例写在 docstring 中);缺失部分通过spacekit/模块补充(独立提交feat(spacekit): …,回归测试使用tools/imgdiff.py)。根据简报编写shots_9x16.py:6–10 个镜头,每个 2–5 秒,每个镜头至少包含 3 个深度平面,关键帧 + 对比帧,辉光/光晕,摄像机运动,运动模糊,背景不空(docs/quality.md)。episode.json(剪辑,覆盖层en,字幕在安全区域内),music_cues.json(使用自己的调式/调性/速率)。剪辑点对齐事件;最后一帧等于第一帧。 剪辑帧数总和 ≤ 1799(60 fps 下)。执行python tools/check_episode.py episodes/<ep>/episode.json。提交。 - 时间预览:执行
python tools/render_queue.py submit preview episodes/<ep>/episode.json --with-tts,查看状态status --json。生成out/<ep>/9x16/sheet_prev.png;无 Traceback/OVERRUN,有 FLASH/EVENT;提示列表通过python tools/cues.py episodes/<ep>/episode.json --logs out/<ep>/9x16/logs生成。 - 英雄帧:按镜头提交
submit preview … --hero --shots vN --frames F,F+1,F+2(F 为该镜头最佳时刻;100% 分辨率,不带--samples— 使用镜头代码中的采样,与最终渲染一致) → 生成out/<ep>/9x16/hero/,sheet_hero.png。向评论家和所有者展示第 F 帧;根据日志hero_vN.log获取该帧所需时间及预计总时间(docs/timings.md)。在shots_9x16.py中调整采样和重效果(提交后重新生成英雄帧),确保最终渲染耗时 4–6 小时,而不是 1 小时。 - 评论(
docs/workflows.md):“电影感/惊艳”(对每个镜头打分 1–10,低于 8 分需重做,最多进行 3 轮),构图,节奏/钩子,事实(仅 4 个阻塞点,参考docs/quality.md);可选:独特性,音效。修改后重复步骤 6–7。 报告保存为剧集文件夹中的文件,每轮评论单独提交fix(<ep>): 根据评论修改,第 K 轮。 - 粗剪视频 完整版(
docs/approval.md,1a):在镜头中使用draft函数,通过submit task提交剧集级preview_movie.py。如果未能生成,则在无粗剪视频的情况下提交审批,消息中注明“粗剪视频:无”。 - 审批:按照
docs/approval.md模板发送消息,附带文件(英雄帧、粗剪视频)。提交当前状态。 停止并等待回复。 如有修改,返回相应步骤。
第二部分 — 收到“ok”后:至完成定义(除 docs/approval.md 中定义的暂停外,不再提问)
- 审批记录。 准备最终的提示列表(cue-list)和根据
docs/publish.md编写的publish_en.md(惯例以列表形式列出)。提交:chore(<ep>): 审批通过,准备渲染(用户的修改写在提交正文中)。 - 最终渲染。 执行
python tools/render_queue.py submit final episodes/<ep>/episode.json --approved '用户审批:日期、聊天上下文'。该标志记录已获得的同意,而非替代它。 向用户提供任务 ID、渲染 PC 和预计完成时间。Worker 会自动选择 PC,分批渲染(每批 120 帧),并执行帧检查、TTS、音乐、混音、剪辑构建、合成、机器 QA 和发布。聊天可以关闭。 - 状态与故障。 使用
status --json查看进度(cursor/steps表示进度;任务结束前的帧保存在snapshot中,而非out/<ep>/)。failed状态 — 日志保存在快照中;临时环境故障 — 执行retry JOB;代码/脚本修改 — 执行cancel JOB,在工作树中修改,必要时重新审批,然后提交新任务。帧检查 FAIL — 分析原因后执行 RERENDER,删除快照中(以及远程)的坏帧,然后执行retry JOB --rerender-shots vN。pause/resume可在批次间执行。不要终止顶层的 bash 进程。 - 视觉 QA。
needs_review表示机器检查完成且发布包已就绪。查看 PNG 文件夹out/<ep>/9x16/qa_en/和主视频:质量不低于英雄帧(无噪点、模糊、过曝、闪烁),安全区域正确,字幕同步,循环正常。 如果质量合格,执行python tools/render_queue.py accept JOB;存在缺陷则修改后提交新任务。 - 交付。 将
out/<ep>/release/中的两个文件交付给用户(Claude 使用 SendUserFile)。如果在渲染期间源文件发生变化,则需要在提交前比对快照中的发布文件和剪辑 JSON 文件。 - 记录。 更新
episodes/INDEX.md(镜头、技术、语音、调性、钩子),README.md中的剧集表格,docs/channel.md中的 ✅ 主题,docs/timings.md中的每帧时间统计,并将经验教训写入相应文档。提交:docs(<ep>): 记录与经验教训(包含剧集代码、edit_9x16_en.json、publish_en.md;不包含out/目录)。 - 合并。 执行
python tools/video_wt.py finish— 确保工作树干净 → release → accept →git merge main→ 运行 check_episode 和测试 → 快进 main → 将out/<ep>/移至主仓库副本。如果出现冲突,在工作树中解决,提交,然后重试。 然后退出工作树(Claude 使用ExitWorktreekeep),在主仓库副本中执行python tools/video_wt.py remove epNNN;如果工作树是由start --here创建的,则不要删除。至此,才能告知“完成”。