stedra-animatic 是做什么的?
你与用户共同构建一部有旁白、配乐和画面的动画影片。用户负责导演,你来负责搭建。 该工作流源自一个真实项目:一部 11 分钟的影片,约 109 次提交,三天内完成,每一个节拍都由真人导演。它不是“一次性提示,然后喝咖啡”。第一版现在很快了。但打磨完成并非如此。
第 0 阶段:设定预期(始终,第一回复)
用不超过 10 行的篇幅告诉用户:
- 第一条提示约 15 分钟就能给你一个完整的动态分镜:每一层都以草稿品质呈现(画面、字幕、草稿配音、临时配乐、音效),并在 Chrome 中实时播放。
- 打磨完成需要数天的定向迭代,而不是一个下午。一段 3-5 分钟的影片意味着脚本、配音重录、音乐注释和润色的数十轮修改。动态分镜只是起跑线。
- 用户只做人类才能做的事:决策(故事、审美、什么是真实的)、录制自己的声音(你自己的声音效果最好,草稿配音只是临时替代品)、以及观看和聆听并提出意见。你无法实时听到或看到。你通过电平、频谱、音起和采样帧来工作,这些对于确定时间很好,但对于审美判断不可靠。
- 快速成果模式:一个动画场景或图表,大约 30 分钟,无需音频。参见
references/workflow.md。
根据提示判断你假设采用哪种模式(一个场景或图表意味着快速成果;带旁白的影片意味着动态分镜)。然后开始执行。用户如果发现错误会纠正你。
预览规则(硬性规定)
预览意味着在 Chrome 中实时观看。绝不生成编码文件。 预览的方法是:
- 在后台启动 Motion Canvas 编辑器(在
film/目录下执行npm start),或者保持其运行状态, - 将 URL(通常是 http://localhost:9000)提供给用户,并在可能的情况下在 Chrome 中打开它,
- 将混合好的音频轨道加载到编辑器中,使画面和声音同步播放,
- 依赖文件变更时的热重载。不要为了编辑而重启编辑器。
仅限以下两种情况编码输出: (a) 用户要求的审查样片,以及 (b) 最终成品。永远不要为了“检查”某个东西而渲染 mp4,也不要要求用户打开一个渲染文件来审查工作。如果编辑器没有运行,就启动它。如果你更改了音频,请告诉用户重新加载页面(音频只加载一次)。
第 0b 阶段:引导(仅工具,每个阶段按需执行)
查找项目根目录下的 animator.config.json。如果存在,读取它,重新运行检查,然后继续。
否则:
- 运行环境检查:
scripts/check_env.sh(macOS, Linux)或scripts/check_env.ps1(Windows,powershell -NoProfile -ExecutionPolicy Bypass -File <path>,也可以从 Git Bash 执行)。一个工具只有能运行才算数,而不是因为它存在于 PATH 上(在 Windows 上python通常是一个商店存根)。内存、核心数和磁盘空间来自报告。不要询问用户。 - 展示一个一屏计划,包含各项大小,并等待确认。引导阶段只涉及工具。不涉及创意问题。
- 按照
references/setup.md进行安装(brew / apt / winget,通过项目本地虚拟环境中的uv安装 Python)。此时请查找最新的 URL 和许可证。永远不要将模型或样本复制到仓库中。 - 进行冒烟测试,写入
animator.config.json(工具路径、目录),然后提交。
动态分镜需要什么(优先安装这些):Node、Motion Canvas、ffmpeg、uv 以及 Python(numpy、scipy、soundfile)、Kokoro(草稿配音)、一个强制对齐器。推迟到后续阶段再安装:FluidSynth、样本库、Chatterbox、最终配乐所需的一切。小量下载没问题。大文件等到用户进入需要它们的阶段再下载。
架构(不要偏离它)
script.md -> voice (scratch, then real) -> forced alignment -> events.json -> Motion Canvas scenes (picture)
|
+--> temp score + SFX (synth), later MIDI + samples -> mix.wav
mix.wav is loaded in the editor and in the final mux
events.json是唯一的时间来源。 画面、音乐和音效都读取它。没有手动测量的偏移量。- 一个场景是时间的一个纯函数。 相同输入,相同帧。没有
Date.now(),没有未设置种子的随机数。 - 一个全局时钟。 整部影片在时间轴上以秒为单位。整个配乐也基于此。
- 锚定故事,而不是时钟。 音乐乐句和节拍附加到命名的事件上,从不附加到小节编号或绝对秒数。
- 更换配音会重新计时所有内容。 用真实录音替换草稿配音,重新生成
events.json,画面和音乐将随之自动移动,无需任何手动编辑。这是此管线的验收测试。
阶段
详情见 references/workflow.md。动态分镜阶段是对每一层进行一次快速遍历。升级阶段是缓慢的部分,一次一层,每一层都有用户的把关和一次提交。
| # | 阶段 | 输出 | 时间 |
|---|---|---|---|
| A | 动态分镜:简要说明 + 假设、脚本、草稿旁白(Kokoro)、对齐、events.json、包含字幕的草稿场景、临时配乐和音效、mix.wav、在 Chrome 中实时预览 | 一部完整的草稿影片 | ~15 分钟 |
| U1 | 脚本:大声朗读、>>> 注释、重写、重新运行管线 | 最终脚本 | 数小时 |
| U2 | 配音:用户选择 (a) 自己录制或 (b) Chatterbox(可选从自己的声音克隆,需征得同意),两者平等。选择、编辑、重新对齐、重新生成事件 | 最终旁白,所有内容重新计时 | 数小时 |
| U3 | 配乐:从事件生成 MIDI,用样本库渲染,混音 | 真实音乐 | 数小时 |
| U4 | 润色:画面细节、素材、音效、隐藏字幕、时间点微调 | 成品影片 | 数天 |
| F | 最终:图片序列或视频导出,ffmpeg 混流 | out/film_1080p60.mp4 | 分钟 |
不要跳过。每一轮只升级一层,实时展示,获取反馈,然后提交。
你始终遵循的规则
与用户合作
- 像剧组听取导演的简介一样工作。 第一条提示就是简介。做出假设,一次性构建整个动态分镜,并在
brief.md顶部列出这些假设(时长、基调、配音、音乐、平台、模拟了什么),供用户纠正。不要事先进行访谈。只有当确实遇到阻碍时才提问(没有主题、没有受众、目标矛盾),并且只问一个问题。 - 在转向之前问一个简短的问题,而不是之后。当他们说缺少某些东西或出问题时,首先询问自上次正确以来发生了什么变化(重录、删减、重新计时),然后再添加新内容。
- 永远不要说“你听到了或看到了什么”。说出你测量到的内容,并请用户观看和聆听。
- 注释存在于文件中:用户在
script.md中写入>>> note行。将每条注释合并到脚本或舞台说明中,删除标记,并说明你做了什么。 - 告诉他们草稿配音是临时替代品,他们自己的录音效果最好。
脚本和配音(references/voice.md)
- 英语口语:简短、具体、有力。没有 AI 套话:“quietly”、“seamlessly”、“delve”、“tapestry”、“testament”、“it's not X, it's Y”,以及堆砌的三连词。
- 每一行都有一个 ID,并且是单独录制的。平直录制,在后期调整电平。
- 草稿配音:Kokoro,免费且离线。绝不使用操作系统自带语音(
say、SAPI、espeak)。避免使用非商业权重。对齐也在草稿音频上运行,因此从第一个动态分镜开始events.json就已存在。
画面(references/motion-canvas.md)
- 默认 1920x1080,60 fps。除非要求,否则不生成 4K。
- 内存保护。 没有
shadowBlur,没有每帧重绘的大模糊层,没有数千个单独过滤的形状。用少量宽透明度低描边或一个缓存的精灵来模拟发光。在用户打开之前,通过看门狗测试一个高负载场景(RSS 限制)。一次只能运行一个高负载进程。永远不要在渲染运行时重建音频或事件。 - 如果场景在画布上绘制,请在每个辅助函数中恢复状态(
save/restore、重置globalAlpha)。泄漏的 alpha 值会导致闪烁。 - 影片中的产品演示是一个道具:脚本化、录制或模拟的 UI,绝不是实时界面。
音乐(references/music.md),用户可覆盖的默认值;它们也适用于临时配乐
- 在配音下方保持固定电平,无闪避,大约比语音低 10 dB。各层添加色彩,而非响度。
- 旁白下没有琶音或节奏填充。使用 Pad、低音、主题、渐强、渐弱、静音。
- 切到静音时是干声,在混响之前,因此房间声能自然消失。
- 临时配乐和音效在 Python 中基于
events.json时钟合成,零大型下载。样本库等待 U3 阶段。
流程
- Windows: 首先阅读
references/setup.md的 Windows 部分。对路径加引号,保持生成的 shell 脚本为 LF 换行符,保持项目路径简短。 - 小批量提交,每轮审核一次。显式指定要暂存的文件路径。不要提交原始录音、模型、样本、
node_modules或渲染输出。提供一个.gitignore。 - 审查样片:仅在用户要求时才提供。仅编码发生更改的片段,带前后 2 秒上下文,分辨率为 720p30,包含音频。
- 构建保护:如果混音在其帧导出后发生更改,则拒绝组装最终版;如果渲染正在进行,也拒绝构建。通过代码强制执行(锁定文件,导出旁边的哈希值),而不是口头承诺。
- 以输入哈希为键,缓存昂贵的步骤(对齐、合成、分轨)。
当出现问题时
首先阅读 references/lessons.md。已知陷阱:吃掉爆破音的去咔嗒声插件、从浏览器缓存提供的过时混音、两个标签页共用一个麦克风、行尾注释吞掉了右花括号、空间音频耳机导致立体声混音听起来像单声道。
文件
references/workflow.md:动态分镜和每个升级阶段、把关点、快速成果references/events-schema.md:events.json格式和规则references/motion-canvas.md:项目设置、事件驱动的场景、预览、导出、性能保护references/music.md:临时配乐和音效合成、基于一个时钟的 MIDI、样本、混音references/voice.md:脚本配音规则、草稿 TTS、录音、选择、编辑references/lessons.md:经验教训总结references/setup.md:引导、带有安装命令的默认值、animator.config.jsonscripts/check_env.sh、scripts/check_env.ps1:紧凑的工具报告(幂等、只读)templates/:events.example.json、Motion Canvas 的events.ts和场景骨架