Comfy Director 是做什么的?
故事优先,画面其次。多镜头AI电影的失败往往发生在剪辑阶段,而非渲染阶段:如果节拍之间缺乏因果关系,即使每个镜头再精美,读起来也只是一部披着故事外衣的蒙太奇。
必需前提:comfy 技能(CLI 机制 + 配方路径 —— apply/capture/foreach —— 用于可重复的多阶段工作流)。如果任务失败,请使用 comfy-debug。
操作顺序
- 概念 —— 一个陌生人都能复述的核心创意。
- 剧本 —— 在触碰管线之前完成。首先将剧本交给用户。
- 镜头列表 —— 将每个场景映射到一种连续性策略。
- 音频设计 —— 根据剧本的情感节拍进行设计,而非在画面完成后才考虑。
- 制作 → 合版 → 质量控制。
跳过第2步直接进行渲染是导致剪辑被毙的首要原因。
剧本规则
- 一个主角,镜头可以跟随。在每一个镜头中都能被识别。
- 因果测试: 每一次切换都要回答“正因为此……” —— 绝不能是“然后,在别的地方……”。如果一个节拍可以随意重新排序而不破坏任何东西,那它还不是一个故事。
- 陌生人测试: 一个零上下文的陌生人必须能用两句话复述剧情(“X想要A,B阻止了他,他做了C,所以D”)。
- 节拍携带的时间总和应等于目标时长。
概念规则
- 品牌/产品应被感受到,而非被点名提及:阐述其理念;屏幕上直接引用内部梗和社区传说会被视为粉丝服务。
- 客户提到的一种技术(“风格迁移”、模型名称)是火花,而非命令 —— 仅在创意需要时才使用它。围绕一种技术构建电影是供应商(而非导演)的做派。
- 怪异必须层层叠加:令人惊讶的主体 与 客体 与 场景。在一个常规画面中加入一个怪异元素只是装饰。
镜头提示
- 写实镜头: 仅使用真人电影摄影师/胶片语言。在逼真的提示中混入一个插画师/动漫/漫画的名字会破坏效果。插画风格的参考只应出现在刻意风格化的镜头中。
- 运动提示描述的是场景如何移动,而非其中有什么(参见
comfy技能视频常见陷阱 —— t2v/i2v 模型陷阱、SaveVideo、fps 接线)。
连续性工具包
按镜头选择,大致按强度排序:
| 策略 | 用途 |
|---|---|
| 将角色/位置参考图带入每个镜头的 i2v 工作流 | 主角身份一致性 |
| 通过参考图编辑实现相同身份、不同构图(一张主角图 → N 个角度) | 跨剪辑的可识别面孔 |
| 镜头 N 的关键帧作为镜头 N+1 的种子(基于图像引用的重风格化或结束帧) | 连续动作 |
| 讲话者头部输入确切的播放音频(KlingAvatar),在同一个口型同步头部 的不同角度之间切换 —— 绝不要在画外音上覆盖 B-roll | 必须感觉真实的对话 |
| 在每个提示中逐字重复相同的服装/光线/镜头参数 | 廉价的基线粘合剂 |
如果一个镜头无法保持连续性,重写剧本,使其不需要那个镜头 —— 不要强推有问题的剪辑。
音频
- 配乐 = 简短设计的线索,在故事转折点连接;一次性的长生成无法跟随动态弧线(它会在你需要高潮的地方正好反转)。
- 通过数学计算放置画外音:音轨持续时间 vs 节拍窗口,在混音之前进行。
- 将配乐压在画外音之下;对最终混音进行响度归一化(约 -14 LUFS)。
- 对话必须通过构建方式实现口型同步。 用确切播放的音频驱动嘴部(KlingAvatar
sound_file),并在同一个口型同步头部的不同角度之间切换 —— 在连续的画外音上覆盖 B-roll 读起来像蒙太奇,而 i2v 生成的嘴部会漂移。“无口型同步/感觉不真实”是典型的否决理由。(在流程图中生成音频 —— 云端的LoadAudio无法看到上传文件;参见comfy音频陷阱。) - 在昂贵的渲染之前,务必通过听觉锁定语音和选角。 声音/口音是主观的,无法从波形中读取 —— 渲染几个便宜的候选 TTS 版本(同一句台词),让用户选择,然后 将胜出的结果投入到昂贵且易出现
transient_auth错误的虚拟角色/口型同步镜头中。因语音被否决而重新渲染所有这些镜头是可以避免的浪费。主角外观同理:在从主角图生成所有镜头之前,先批准主角静态图。 - 通过测量而非感觉验证混音。 你无法听到渲染结果 —— 使用
ffmpeg volumedetect检查每个部分:结尾的“死寂”或被掩埋的对白会显示为接近 -91 dB 的窗口。在宣布完成前,确认每个节拍都以应有的电平存在。
制作操作
-
在提交时,将每次提交 —— 镜头、关键帧、音频干声、重新提交 —— 追加到
job_ids.txt(<job_name> <prompt_id>)。仅追加:重新提交会获得新行(shot_s3_resubmit <id>),绝不覆盖,这样已失效的 prompt_id 仍保留其镜头身份。 -
在项目根目录维护
LOG.md:一个仅追加的事件日志,在事件发生时(而非会话结束时) 写入 —— 每次提交/重新提交(+ 失败代码)一行,每次 QC 判定(+ 重新生成原因)一行,以及每个会使先前工作失效的决策:重新选角、提示更改、哪个参考图或干声现在是规范的。逐帧发现记录在qc/QC_LOG.md中;LOG.md索引它们。17:36 ERROR shot_s3 transient_auth -> RESUBMIT 27dd45b4 (same workflow, no re-login) 17:44 QC shot_s2 FAIL background-crawl -> re-roll (same kf, new seed); recut beat if 2nd fails 17:50 DECISION recast protagonist -> ref_ray.png canonical; vo2, vo6 stale, re-gen -
恢复契约: 一个零记忆的后续代理必须仅从磁盘恢复:
LOG.md(发生了什么,为什么)→job_ids.txt(哪些作业)→comfy jobs status(它们的状态)。一个不在LOG.md中的决策会随着会话消亡 —— 已完成但已过时的作业(旧选角的 VO 干声)否则看起来和好的作业一模一样。 -
对每个下载的片段使用 ffprobe;在合版前对不符合规格的时长/尺寸进行归一化。
-
在剪辑前,从每个片段中抽取一帧与剧本进行质量控制检查。
-
精确时长:使用 ffmpeg 按节拍修剪/重新定时,不要指望运气。
常见错误(每个都曾导致真实剪辑被毙)
| 错误 | 结果 |
|---|---|
| 在剧本之前进行渲染 | “八个好看的节拍,但互不因果” |
| 屏幕上显示社区内部梗 | “太直接,粉丝服务” |
| 将客户提到的技术作为概念 | “我说它是为了激发创意” |
| 没有连续性计划 | 主角每切一次镜头就换张脸 |
| 一次生成40秒音乐 | 弧线在高潮处反转 |
| 在连续画外音上覆盖 B-roll | “感觉像蒙太奇/音频不匹配” |
| 在用户听到声音之前将其烘焙到 N 个镜头中 | 用户否决时重新渲染所有内容 |
| 直接拼接讲话者头部片段 | 声音漂移不同步(虚拟角色将视频填充超过音频) |