docs: add video route selection and verified ComfyUI workflow tutorials

This commit is contained in:
2026-10-29 15:06:10 +08:00
parent e99975e672
commit 9eef175633
5 changed files with 1117 additions and 13 deletions
@@ -0,0 +1,223 @@
# 14|什么时候用文生视频,什么时候用图生视频
[返回知识库目录](README.md) · [配套:ComfyUI 工作流搭建](15_ComfyUI工作流搭建与排错.md) · [配套:AI 转译与模板](10_AI转译与实操模板.md)
先问“这个镜头必须保持什么、允许模型发挥什么”,再选择输入模式。文生视频与图生视频是不同的约束入口,不是低级与高级的区别。本章的选择树、实验表和原创示例是本手册的方法建议;产品能力只在所引用的模型与版本语境内成立。资料核查:**2026-10-29**。本次未运行新视频来测量这些建议的成功率。
## 1. 模式、模型、平台与工作流不是同一件事
| 层面 | 它决定什么 | 例子与容易混淆的地方 |
|---|---|---|
| 输入模式 | 用哪些材料约束生成 | T2V 用文字;I2V 用图与文字;首尾帧同时约束两个时刻 |
| 模型及检查点 | 学到了什么、支持哪些输入、怎样推理 | 同一家族可有不同任务权重;名称相似不等于互换 |
| 平台或服务 | 通过什么界面、API、账号能力使用模型 | 网页支持的功能不一定在同名 API 或本地版本中提供 |
| 工作流 | 怎样加载模型、处理输入、采样、解码和保存 | 多接一个图片节点,不代表 T2V 权重自动变成 I2V |
| 制作流程 | 一个镜头先做什么、后做什么 | 文生图→图生视频是两阶段流程,不是“纯文生视频” |
以公开权重 Wan2.2 为例,官方分别列出 T2V-A14B、I2V-A14B,以及兼容两种任务的 TI2V-5B;Comfy 官方也提供对应模板。选择流程时,应确认具体权重与节点怎样接收图片,不能只根据文件名里有“Wan”就接在一起。[Wan 官方模型表](https://github.com/Wan-Video/Wan2.2)、[Comfy Wan2.2 模板说明](https://docs.comfy.org/tutorials/video/wan/wan2_2)
## 2. 常见模式各自负责什么
| 路径 | 主要输入与职责 | 适合先解决的问题 | 不能由它单独保证 |
|---|---|---|---|
| 文生视频 T2V | 文字描述主体、空间、外观和运动 | 探索还没确定的画面与动态、可自由变化的空镜 | 同一角色跨镜身份、精确构图与复杂物理 |
| 图生视频 I2V | 一张图约束特定画面状态,文字描述随后变化;不少产品把它作为首帧 | 已有认可构图、服装、角色与场景,希望使其动起来 | 完整三维结构、背面细节、动作全过程和后续身份 |
| 文生图→图生视频 | 先独立制作并批准静帧,再送入视频模型 | 先审核角色与构图,再投入运动生成 | 静帧好看不代表姿势可运动;多一步也不必然省钱 |
| 首尾帧 FLF / 插值生成 | 开始与结束图约束两端,文字说明需要的转变 | 到达明确终点、物件状态变化、可规划的转场 | 中间沿哪条路线走、是否真的接触、速度与因果合理 |
| 参考图 / 多参考生成 R2V | 图可能约束角色、物件、风格或场景,而不是直接作为首帧 | 需要固定元素,又不想沿用参考图原构图 | 每张参考自动分工、多个角色自动不混淆 |
| 参考视频生成 | 视频提供身份、动作、镜头或风格等参考,职责取决于模型 | 已有想借用的运动节奏、表演或角色动态资料 | 逐帧精确复制,或原片里的主体全部得到保留 |
| 视频生视频 V2V / 视频编辑 | 现有视频作为被变换或编辑的基础 | 已有可用行动和路线,需要换外观、环境或局部内容 | 只改目标区域而绝不影响其余像素,或所有帧都稳定 |
| 姿态、深度等条件控制 | 把指定结构或随时间变化的控制序列交给兼容模型 | 骨架运动、空间深度、轮廓、受控路线 | 身份、衣物、接触、遮挡和全部物理自动正确 |
| 视频延长 / continuation | 使用已有片段或尾部状态继续生成 | 在已有运动基础上续接下一个行动阶段 | 可以无限延长而不累积身份、空间与节奏偏差 |
这些模式会重叠。例如一个流程可以同时用首帧、角色参考和动作视频。关键不是术语有几个,而是每份输入究竟做什么。
Runway 的 Gen-4.5 图生视频指南明确把输入图作为首帧,并把文字主要用于运动;但 Comfy 的 Wan VACE 文档把一类图片输入称为 reference-to-video。Google Gemini Omni 文档也区分首帧、尾帧、主体参考和视频参考。因此,看到界面上的“上传图片”按钮时,应先查它是**首帧、参考,还是待编辑素材**。[Runway I2V 指南](https://help.runwayml.com/hc/en-us/articles/48324313115155-Image-to-Video-Prompting-Guide)、[Comfy VACE 示例](https://docs.comfy.org/tutorials/video/wan/vace)、[Google Omni 输入职责](https://ai.google.dev/gemini-api/docs/omni)
## 3. 一棵按镜头任务选择的决策树
```text
已经有一段行动、运镜或节奏基本合格的视频吗?
├─ 有:希望保留这段运动,只改变特定内容?
│ ├─ 是:先研究兼容的 V2V / 局部视频编辑
│ └─ 否:把视频明确标为动作、相机或身份参考,研究参考生成
└─ 没有:这个镜头的角色外观或起始构图必须精确保持吗?
├─ 是:先确认静帧是否合格、姿态是否允许随后动作
│ ├─ 合格:试 I2V;需要明确终点时再考虑首尾帧
│ └─ 不合格:先修图、重构图或制作新的起始帧
└─ 否:主要是在探索画面或运动,可以接受外观变化吗?
├─ 是:先试 T2V,保留有价值的动态与构图方案
└─ 否:先建立必要参考,再选支持其职责的生成方式
无论选哪一路:动作时序或空间路径是否必须受控?
├─ 是:补动作预演、视频参考、姿态 / 深度等条件,或重新设计覆盖
└─ 否:先用较简单输入测试,再逐项增加约束
```
这是一种决策起点,不是自动路由程序。例如有参考图,但图中人物背对相机、遮住了后续需要使用的手,就不宜因为“已经有图”而直接生成交接动作。应先补可执行的静帧或动作方案。
## 4. 文生视频何时值得优先尝试
**画面尚未定型。** 你想比较几种风、雨、物体运动或摄影机路线,让模型同时提供视觉与动态方案。此时先做一张高度精修的静帧,反而可能过早锁住还需要探索的构图。
**镜头不依赖精确身份。** 例如陌生城市的远景、无人走廊、海面与云层。但“空镜”也可能有必须连续的建筑与光线;如果下一镜需要认出同一扇门,它就不能再随意生成。
**想先找到运动方案。** 对某些镜头,可以先用 T2V 做粗糙动作实验,选出清楚的行动阶段,再建立固定角色的静帧或参考流程。不要把探索版中偶然出现的脸和服装当作已经完成资产设计。
Runway 当前 T2V 指南将可见内容与运动列为两类基本描述。这支持“没有图片时,文字还要交代看到什么”的写法;不意味着 T2V 必须写满所有摄影名词。[Runway T2V 指南](https://help.runwayml.com/hc/en-us/articles/42460036199443-Text-to-Video-Prompting-Guide)
## 5. 图生视频何时更有价值
**起始画面本身就是交付要求。** 比如已经批准的人物服装、产品摆放、双人构图或某个分镜关键帧。先对这张图完成审批,能把“外观不对”和“运动不对”分开诊断。
**连续剧需要反复认出同一个人或场景。** 适合先建立角色参考与各机位静帧,再生成对应镜头;其中每个新静帧都需要检查身份、光源、站位与视线,不能把同一张正面照重复喂给所有机位。
**构图经过导演选择。** 关键线索应在桌面哪里、门框遮住谁、哪个人更接近出口,这类关系可以先在静帧上检查。若首帧已经把关键物件裁掉,视频文字让它“自然露出”可能需要模型补造原先看不到的空间。
输入图的优势来自提供明确视觉依据;它也会把错手、透视矛盾、假文字与不合理姿势带入运动。Runway 的 I2V 指南特别提醒输入图的视觉瑕疵可能随视频被强化。先修起始状态通常比不断重抽同一张问题图更可诊断,但是否更省成本要实际记录。[Runway I2V 指南](https://help.runwayml.com/hc/en-us/articles/48324313115155-Image-to-Video-Prompting-Guide)
## 6. 按镜头类型选择,不按整部剧只选一种
下面是本手册的优先试验方向;实际结果应在你使用的模型、工作流和硬件上比较。
| 镜头任务 | 优先试验 | 为什么这样选 | 若失败,怎样换路 |
|---|---|---|---|
| 同角色的普通对话近景 | 审核角色与机位静帧后 I2V,或支持身份参考的生成 | 先固定脸、服装、视线与构图 | 先排查参考和表演节拍,再比较另一模型或音画分工 |
| 双人对话与递物 | 先做站位与接触预演,再试双人 I2V 或兼容控制 | 既要认出人,也要让两人的手与物件发生明确关系 | 用有功能的覆盖或控制视频保留交接证据,不只追求脸稳定 |
| 不需跨镜认出的氛围空镜 | T2V 与 I2V 都可小样比较 | T2V 探索动态;I2V 可保留已批准的建筑与构图 | 建筑需连续时补场景资产,不把随机变化当艺术表达 |
| 产品、服装或道具展示 | 已批准图或真实素材作为参考;必要时 V2V / 合成 | 外形、位置与标识往往比自由发挥更重要 | 对尺寸、文字或几何要求高时保留真实 / 3D 底稿,别依赖纯生成保证 |
| 打斗、舞蹈、复杂身体接触 | 先动作预演,再评估视频参考、姿态控制、I2V 等 | 起始画面不能提供整段动作时序 | 简化并发动作或重设覆盖;不能只把静帧再精修一遍 |
| 主体转身、相机大幅环绕 | 多视角资产、3D 预演或可用参考;再比较生成模式 | 单张图的背面与遮挡后空间没有完整证据 | 减小未见区域的补造量,补视图或换拍法,并记录创作代价 |
| 必须到达明确终点的转场 | 首尾帧或兼容关键帧流程 | 同时给出两端状态 | 若中间靠融化完成,补中间行动、改两端图或改为剪辑转场 |
| 已有动作正确,只想换景或局部内容 | 兼容的 V2V / 视频编辑 | 尽量利用已有时间与运动结构 | 检查被保留部分是否真的保留;可缩小编辑范围 |
| 长镜与连续路线 | 先预演完整地理与阶段,再选控制或分段续接 | 难点是持续的空间、遮挡和运动状态 | 在有动机的切点分段;逐段复查,不无限沿用退化尾帧 |
原[《备用钥匙》片段](10_AI转译与实操模板.md)可以混合处理:双人开场先批准 I2V 起始帧;钥匙细节先明确手与桌面状态;递伞镜头先验证握稳、松手的动作;出门镜头重新核对通道。不是整场戏一律 I2V,也不是每镜重新 T2V 生成不同母女。
## 7. 先定静帧,还是先定运动
| 当前最不可失去的东西 | 先做的验证 | 再投入什么 |
|---|---|---|
| 外观与构图 | 合格角色、产品、场景和机位静帧 | 运动与声音 |
| 动作时序与接触 | 手机演示、白模、姿态序列或粗动作视频 | 外观、材质与光色 |
| 摄影机路线与空间揭示 | 简易3D、路线草图或相机预演 | 人物细节与最终画面 |
| 未确定的视觉概念 | T2V / 静图探索,对比多种观看方案 | 选定后再固定资产 |
| 对白与回应节拍 | 试读音轨、停顿和听者动作 | 按节奏配置镜头与生成单元 |
不要让静帧设计与运动设计各做一套相互冲突的方案。例如静帧中人物双手紧贴身体、被桌沿遮住,运动稿却要求他立即从身后取出一件大物;这种失败不是单纯“提示词不够强”。
## 8. 同一任务,T2V 与 I2V 的文字有什么不同
原创镜头任务:夜班修复师听见门口铃声,停止整理胶片,抬头看向门外。关键信息是“铃声使他停止手中行动并转移注意”。下面是制作思路示范,不是某模型的保证可用参数。
### 8.1 T2V:视觉与变化都要交代
```text
固定中景,一名穿深色工作服的修复师坐在狭小修复室的桌旁,桌面有打开的胶片盒,门在画面右侧后方。台灯照亮他的手与胶片盒。门口响起一声铃,修复师先停下整理动作,再抬头望向右后方的门。保持这段从专注工作到注意门口的过程。
```
这里把人物、房间、物件、光和门位交给文字建立。若他必须是前一镜的固定角色,仅靠同一段外貌描述不能当作身份验证。
### 8.2 I2V:先检查图,再写随后变化
先确认输入图已经显示同一修复师、正确工作服、桌上胶片盒和右后方的门;双手有合理位置,桌沿没有把必要动作全遮住。画幅也应与预计视频的取景相容,防止裁切改变门的位置。
```text
摄影机固定。门口响起一声铃后,修复师先让手中的整理动作停住,随后抬头看向右后方的门,目光在门口停留。
```
声音是否能在同次生成、怎样指定,应查所选模型接口;若流程只有画面,铃声可用临时音轨定节拍,再在后期制作。不要把本示范当作所有本地视频模型都支持原生声音的声明。
两种文字都必须保留刺激与反应。I2V 可以减少对图中既有外观的重复,但不能省略手先停、再抬头的关系;T2V 也不需要无条件增加无关品牌、摄影机型号和装饰词。
## 9. 更多输入不一定带来更多控制
### 首尾帧:终点正确,中间仍可能不成立
首帧是手拿伞,尾帧是另一人拿伞,模型可能用物件淡出再出现、手臂穿过身体或突然换位抵达终点。两端图只能给出边界条件,不能证明握稳、松手和重心转移已经发生。先让两端属于同一合理世界,再明确中间行动;需要时增加动作依据或改分镜。
Comfy 的 Wan2.2 页面与 Google Omni 文档都提供首尾帧相关入口,但使用方式与模型不同,不能把其中一家的接线或标记复制给另一家。[Comfy Wan2.2 首尾帧示例](https://docs.comfy.org/tutorials/video/wan/wan2_2)、[Google Omni 插值说明](https://ai.google.dev/gemini-api/docs/omni)
### 角色图、场景图、动作视频要各有职责
写清“这张图管身份,那张图管场景布局,视频只管动作节奏”。同一张合照未必能把多人身份分别绑定;两张相反机位的场景图也可能给出矛盾的门窗位置。支持多参考并不表示平台会自动推断你的优先级。
VACE 的官方实现区分参考生成、视频编辑与掩码编辑,并使用视频、掩码与参考图等条件;Comfy 的控制视频例子还展示了预处理深度视频。它们说明结构化条件可以进入生成,但不意味着任意姿态预处理器都能直接接到任何视频检查点上。[VACE 官方实现](https://github.com/ali-vilab/VACE)、[Comfy VACE 控制视频示例](https://docs.comfy.org/tutorials/video/wan/vace)
### V2V 与视频参考不能混叫
“以这个视频为基础改背景”和“借用这个视频的动作,重新生成另一个场景”是不同任务。Runway Edit Studio 的 Aleph 2.0 是编辑已有视频的产品例子;Google Omni 文档也明确区分作为待编辑来源与作为参考的视频。应核对原动作、相机、声音和非编辑区域实际保留了什么。[Runway Edit Studio](https://help.runwayml.com/hc/en-us/articles/51683104370451-Creating-with-Edit-Studio)、[Google Omni 媒体职责](https://ai.google.dev/gemini-api/docs/omni)
### 延长:上一段的偏差也可能成为下一段输入
尾帧接下一段时,脸部偏差、错位道具与曝光变化可能被继承。按阶段检查并回到认可资产校准,而不是发现角色已经变了还继续延长。不同扩展模型可能使用不止一帧信息;应先查它实际接收尾帧、尾部片段还是整段视频,再设计接力。
## 10. 用小样比较路线,而不是凭感觉换模型
为一个代表性镜头做有限对照,先写通过条件,再试生成。以下预算由项目自行设定,不是建议固定抽多少次或承诺成功率。
| 组别 | 保持不变 | 本组改变 | 要回答的问题 |
|---|---|---|---|
| A:T2V | 同一动作目标、画幅、交付要求 | 用文字建立视觉和运动 | 模型能否给出可用的动态方案 |
| B:I2V | 同一镜头任务;使用批准起始图 | 给出起始视觉约束 | 身份与构图改善后,运动是否仍成立 |
| C:修图后 I2V | 与 B 同模型、主要参数和目标 | 仅修起始姿势、遮挡或裁切 | 问题是否主要来自原图 |
| D:控制 / V2V | 同一行动与目标结果 | 加入兼容动作或空间条件 | 新增输入是否真正改善时序与路线 |
不同模型的 seed 没有统一对应关系,甚至同一模型的 T2V 与 I2V 也可能是不同检查点;这不是严格的同随机条件实验。应保留实际输入、版本和次数,用项目验收标准比较可用结果。
| 检查维度 | 写成可判定的问题 |
|---|---|
| 身份 | 关键特征是否从开始到结束及相邻镜头保持 |
| 构图与空间 | 主体、门、桌与线索是否在应有位置,有没有无因换位 |
| 运动与物理 | 接触、支撑、路径与结果是否连续可见 |
| 表演与叙事 | 反应是否由刺激引发,观众能否读懂这一镜的变化 |
| 剪辑接口 | 进入、退出状态是否能接前后镜,不靠口头补充 |
| 生产成本 | 参考制作、运行、返修、后期与等待总共花了什么 |
比较成本应看“得到一条可采用镜头的总投入”,而不只看一次推理的价格。T2I→I2V 增加了静帧制作环节,但可能减少外观返工;T2V 省去该环节,却可能需要更大范围筛选。没有本项目记录时,不预设谁一定便宜。
## 11. 失败后怎样换路线
| 失败表现 | 先排查 | 下一步可尝试 |
|---|---|---|
| T2V 动作可用,人物始终不像 | 身份是否是必须项,模型是否支持参考 | 固定角色资产,再试 I2V / 身份参考;保留动作设计 |
| I2V 像海报在漂,动作不发生 | 图中姿势是否允许动作,运动描述是否矛盾 | 修起始状态、明确动作阶段;必要时先做动态预演 |
| I2V 大转身后换脸、背景崩坏 | 未见区域、遮挡与空间证据不足 | 补多视角 / 场景资料,比较控制路线或改覆盖 |
| 首尾帧到了终点但中间融化 | 两端是否跨越过大状态差,路径是否合理 | 改关键帧,补中间行动依据,或使用剪辑完成转场 |
| 控制动作正确但角色变形 | 控制类型、强度、分辨率与参考是否兼容 | 分别检查身份与控制分支,不盲目增加全部权重 |
| V2V 改掉了本来要保留的内容 | 来源、参考、编辑范围是否混用 | 缩小编辑范围、增加明确参考;仍需逐帧审片 |
| 延长后越来越不像原场景 | 偏差从哪一段开始、哪个状态被继承 | 回退到最后合格版本,修正再接,必要时改为新镜头 |
换路线时保留镜头的剧情任务。若因为模型限制删去一次关键接触、隐藏动作后果或改掉人物选择,应作为导演方案变更记录,不能只宣布“生成更稳定了”。
## 12. 交给工作流搭建前的一页选择卡
```text
镜头的剧情任务:
必须保持的身份 / 道具 / 空间 / 构图:
允许模型自由发挥的内容:
已经有的图、视频、声音及各自职责:
动作时序、接触与相机路线的难点:
优先测试模式与理由:
所选模型是否明确支持这些输入:
需要先补的起始帧 / 关键帧 / 动作预演:
小样验收条件与试验预算:
失败后保留什么、改变什么:
```
填完后进入[15|ComfyUI 工作流搭建与排错](15_ComfyUI工作流搭建与排错.md),按具体模板确认节点与模型兼容性。已有工作流不必全部重搭;先查它现在是哪种输入路径、缺哪种约束,再决定修改哪一段。
## 本章核实来源
资料核查:2026-10-29。以下只支持正文明确说明的产品输入与任务分工;选择树、原创镜头和试验方法属于本手册建议,不是厂商成功率承诺。
1. [Wan2.2 官方仓库](https://github.com/Wan-Video/Wan2.2):不同任务权重与 TI2V 的输入区别。
2. [Comfy Wan2.2 官方模板](https://docs.comfy.org/tutorials/video/wan/wan2_2):T2V、I2V、混合与首尾帧示例入口。
3. [Runway Text to Video Prompting Guide](https://help.runwayml.com/hc/en-us/articles/42460036199443-Text-to-Video-Prompting-Guide):Gen-4.5 语境中的可见内容与运动描述。
4. [Runway Image to Video Prompting Guide](https://help.runwayml.com/hc/en-us/articles/48324313115155-Image-to-Video-Prompting-Guide):Gen-4.5 首帧、运动描述与输入图瑕疵。
5. [Comfy Wan2.1 VACE 示例](https://docs.comfy.org/tutorials/video/wan/vace):参考图、控制视频、预处理与编辑任务。
6. [VACE 官方实现](https://github.com/ali-vilab/VACE):R2V、V2V、MV2V 任务与条件输入。
7. [Runway Creating with Edit Studio](https://help.runwayml.com/hc/en-us/articles/51683104370451-Creating-with-Edit-Studio):Aleph 2.0 对已有视频的编辑语境。
8. [Google Generate and edit videos with Gemini Omni Flash](https://ai.google.dev/gemini-api/docs/omni):首尾帧、主体参考、来源视频、参考视频及延长职责的区别。
ComfyUI 与 LoRA 基础知识、工作流记录和完整交付检查,继续参见[原制作手册](../AI连续剧制作流程与ComfyUI基础手册.md)。
@@ -0,0 +1,284 @@
# 15|ComfyUI 工作流怎样搭建、验证与排错
[返回知识库目录](README.md) · [先选生成路线](14_文生视频与图生视频的选择.md) · [看现有工作流拆解](16_现有工作流拆解与搭建练习.md) · [原制作手册](../AI连续剧制作流程与ComfyUI基础手册.md)
工作流不是把“文生图、LoRA、ControlNet、采样器、视频保存”几个节点都摆上去。它是一张有类型、有依赖、有执行条件的数据流图:输入从哪里进入,经过什么模型与处理,最后由哪个输出节点产生可取回的文件。
本章以官方基础图像链和 Wan2.2 TI2V 5B 原生模板解释搭建方法。资料与模板核查日期为 **2026-10-29**;节点名称、模型文件、菜单位置和默认值可能随版本变化。下列链路是教学拆解,不能代替目标服务器的节点 schema、实际模型列表和运行验收。本次没有为这些教学步骤排队生成新视频。
## 1. 先写任务卡,再找模板
开始连线前,先写清这七项:
| 项目 | 应该写成什么 | 为什么影响工作流 |
|---|---|---|
| 镜头任务 | 女儿接过伞,母亲松手;不是“温情大片” | 决定需要验证哪段动作与关系 |
| 输入 | 文字、首帧、人物参考、视频、声音分别有哪些 | 不是有图片就一定走同一种 I2V 路线 |
| 必须锁定 | 人物身份、首帧构图、道具位置、动作轨迹等 | 决定选基础生成、参考条件还是控制模块 |
| 允许变化 | 镜头角度、背景、动作、风格中哪些可探索 | 避免为了“全锁定”叠加互相冲突的约束 |
| 输出 | 一段视频、帧序列、音频或带音轨容器 | 决定解码与保存链,不是只看预览 |
| 规模 | 画幅、尺寸、帧数、批量、预期时长 | 影响模型支持范围、显存、解码与封装 |
| 验收 | 接触成立、台词连续、人物未换位等 | 用内容标准判断流程,而非只看绿色运行状态 |
例如“两分钟短剧”是项目总长,不等于应寻找一个直接输出两分钟的单节点。先按分镜识别需要生成的素材,再分别选择路线,最后在剪辑里组织时长。
## 2. 搭建起点:先用对应版本的模板建立基线
优先顺序可以这样安排:**官方对应模型模板 → 已验证的本机流程 → 可追溯的作者示例 → 从组件组合新的图**。这是本手册建议的排查顺序,不代表官方模板在任意硬件上必然运行成功。
在 ComfyUI 的模板侧栏,或 `Workflow → Browse Workflow Templates` 一类入口,按任务和模型加载模板;模板通常附模型信息。界面名称可能不同,关键是确认模板来自哪里、适用哪个模型版本。官方文档也说明模板包含原生模型流程及部分自定义节点示例,模板包本身与核心、前端存在版本关系。[官方模板说明](https://docs.comfy.org/interface/features/template)
第一次打开后,依次做五件事:
1. **另存一份基线。** 原模板保留,实验在副本上进行,文件名包含任务与版本。
2. **读图的主路径。** 找到模型加载、条件、采样、解码和保存,沿最终输出往前追。
3. **列出外部依赖。** 哪些是模型文件,哪些是自定义节点包,哪些是图片、视频或声音。
4. **确认节点模式。** 正常、禁用、旁路不是同一回事;尤其检查可选图像输入是否真正进入执行图。
5. **先跑原有基线,再改目标。** 实际需要生成时,先用受支持的较小规模确认加载、采样、解码和保存闭环,再逐步增加负担。
不要为了“清理画布”先删除看起来不懂的采样配置、条件节点或模型补丁;它们可能正是该模型能工作的必要环节。反过来,不与最终输出存在依赖的装饰分支,也不能仅凭它出现在画布上就认定已经生效。
## 3. 把依赖分清:缺节点、缺模型、模型不匹配是三类问题
| 依赖层 | 例子 | 具体检查 |
|---|---|---|
| Comfy Core / 前端 / 模板 | 核心节点实现、画布功能、官方模板包 | 记录各自版本;“更新了核心”不证明前端和模板同时更新 |
| 自定义节点包 | 特定视频封装、预处理、模型 wrapper | 记录节点的 `class_type`、包来源、版本及启动导入错误 |
| 主模型 | 扩散模型、完整 checkpoint | 文件格式、模型架构、精度、量化方式与加载节点是否匹配 |
| 文本编码器 | CLIP、T5 或其他架构的编码器 | 与主模型及模板要求一致,不能只看接口都写 CLIP |
| VAE | 图像或视频编码、解码器 | 架构、通道、压缩与时间维度是否匹配 |
| 条件模型 | LoRA、ControlNet、视觉编码器等 | 适用的基座、版本、任务和作用范围 |
| 运行输入 | 首帧、参考图、音频、控制图 | 确实能被服务端找到,尺寸、时长和内容符合本镜 |
模型目录应按当前安装和 `extra_model_paths.yaml` 实际配置检查。常见分区包括 `checkpoints`、`diffusion_models`、`text_encoders`、`vae`、`loras`、`controlnet`、`clip_vision`;但本机是否看得到文件,要以相应加载节点的下拉列表或服务器返回值为准。文件下载到浏览器所在电脑,不等于已放进远程 ComfyUI 的模型目录。[官方首次生成与模型安装说明](https://docs.comfy.org/get_started/first_generation)
有些 checkpoint 打包多个组件,有些模型必须分开加载。`CheckpointLoaderSimple` 的常见输出为 MODEL、CLIP、VAE;这不意味着每个名为 checkpoint 的文件都真的提供了适用的三者。加载器能读文件、节点能连线、模型组件兼容,是三个需要分别验证的层面。
## 4. 先看数据类型,颜色只作辅助
节点可连接的端口有数据类型,参数控件则常是字符串、数字、下拉选项等。颜色帮助识别,但主题、插件和版本可能改变表现;判断时读取端口名称、类型与节点说明。[官方节点概念](https://docs.comfy.org/basic-concepts/nodes)
| 类型 | 可以怎样理解 | 常见来源 → 去向 | 容易弄错的地方 |
|---|---|---|---|
| MODEL | 可用于当前模型运算的模型对象 | 加载 / 模型补丁 → 引导器或采样器 | 不是图片,也不是模型文件名字符串 |
| CLIP | 此接口名称下的文本编码组件 | 编码器加载 → 文本编码 | 名字相同不保证不同模型家族可互换 |
| VAE | 像素与潜空间之间的编解码组件 | VAE 加载 → 编码 / 解码 | Wan 视频 VAE 不能当 SD 图像 VAE 随意替换 |
| CONDITIONING | 编码后的条件结构 | 文本编码、参考或控制条件 → 采样 | 不是直接把一句提示词接到采样端口 |
| IMAGE | 像素图像或图像批 | 加载、解码、图像处理 → 编码 / 保存 / 视频封装 | 在视频链中可能是帧批,不只是一张图 |
| LATENT | 潜表示及相关元数据 | 空潜变量、编码、采样 → 采样 / 解码 | 同叫 LATENT 仍可能有架构、通道与时间维差异 |
| MASK | 区域或权重信息 | 图片加载、分割、遮罩处理 → 对应条件或合成 | 不是所有黑白图片都会自动被当成正确遮罩 |
| CONTROL_NET | 控制模型对象 | ControlNet 加载 → 控制条件应用 | 不等于骨架、深度图或轮廓图片本身 |
| AUDIO | 波形与采样率等音频数据 | 音频加载 / 解码 → 音频保存或视频封装 | 有声音输入口不表示视频模型自动会生成声音 |
| VIDEO | 某些节点使用的视频对象 | 帧和音轨封装、视频加载 → 视频保存 | 不与 IMAGE 或 AUDIO 直接等同 |
| INT / FLOAT / STRING | 数值或文字参数 | 控件 / 输入节点 → 指定参数 | 不能把输出槽编号误当成参数值 |
官方数据类型文档给出了 IMAGE、LATENT、AUDIO 等结构。文档中基础 SD 的潜图尺寸示例不能推广成所有视频模型的压缩比例;后续连线还需检查模型语义与实际张量形状。[官方数据类型参考](https://docs.comfy.org/custom-nodes/backend/datatypes)
**转换必须有意义。** `VAEEncode` 可把兼容的 IMAGE 编为 LATENT,`VAEDecode` 执行反向过程;视频模型也可能要求专用条件节点来组织首帧、时间长度、掩码和潜变量。不要只为让线接上,就插入一个不属于该模型的转换器。
## 5. 第一张教学图:基础文生图闭环
下面是理解数据流的基础 SD 类示意,不是所有图像模型、更不是所有视频模型的通用配方:
```text
CheckpointLoaderSimple
MODEL ───────────────────────────────────┐
CLIP ──→ CLIPTextEncode(正向文字)─────────┤
└─→ CLIPTextEncode(负向文字)─────────┤
EmptyLatentImage(尺寸、批量)──────────────→ KSampler
│ LATENT
VAE ────────────────────────────────────→ VAEDecode
│ IMAGE
SaveImage
```
逐条检查,比从左往右随便拉线更可靠:
1. 模型输出到采样器的 MODEL 输入。
2. 文本编码器分别接正向与负向文本节点,再接对应的 CONDITIONING 输入。
3. 空潜变量提供待采样的潜表示;尺寸和 batch 属于这里的生产条件。
4. 采样器输出 LATENT,使用匹配的 VAE 解码成 IMAGE。
5. IMAGE 接到保存节点,确认有可取回的文件。
该链可以用于学习“模型、条件、潜变量、解码、输出”的职责,但 FLUX、其他编码架构、蒸馏模型或视频模型会有不同的加载、引导和采样方式。遇到差异先回到对应模板,不要把示意图当成强制节点清单。[基础示例工作流](https://github.com/Comfy-Org/docs/blob/main/public/text-to-image.json)
## 6. 第二张教学图:Wan2.2 TI2V 5B 的文/图双模式
Wan2.2 家族并非只有一个可任意切换的权重。官方区分 TI2V 5B、T2V A14B、I2V A14B 等任务版本;此处专门解释 **TI2V 5B 原生模板**,不把它的接法移植到 14B 双专家或其他 wrapper。[Wan 官方仓库](https://github.com/Wan-Video/Wan2.2)
### 6.1 加载、条件、潜变量与输出各自成链
```text
UNETLoader ─→ ModelSamplingSD3 ─────────────────────────────┐
CLIPLoader ─→ CLIPTextEncode(正向)─────────────────────────┤
└→ CLIPTextEncode(负向)─────────────────────────┤
VAELoader ─→ Wan22ImageToVideoLatent ──────────────────────→ KSampler
LoadImage.IMAGE → Wan22ImageToVideoLatent.start_image(可选) │
│ LATENT
VAELoader ──────────────────────────────────────────────→ VAEDecode
│ IMAGE 帧批
CreateVideo
│ VIDEO
SaveVideo
```
这里 `ModelSamplingSD3` 是该模板对模型采样配置的处理节点;节点名称不能被理解成主模型变成了 Stable Diffusion 3。`Wan22ImageToVideoLatent` 同时承担该模型所需的潜变量组织,不能用普通 `EmptyLatentImage` 随意替换。
本次读到的官方 JSON 使用 `wan2.2_ti2v_5B_fp16.safetensors`、`umt5_xxl_fp8_e4m3fn_scaled.safetensors` 与 `wan2.2_vae.safetensors`,并连接上述路径。文件名是该快照的依赖示例;如果使用其他精度或重新打包版本,应按其配套说明核对加载方式。[官方 TI2V 5B 模板 JSON](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/templates/video_wan2_2_5B_ti2v.json)
### 6.2 文生与图生,真正改的是输入分支
| 要做的模式 | 输入分支怎样处理 | 运行前看什么 |
|---|---|---|
| T2V:文字驱动视频 | 在该模板规定的方式下停用可选首帧输入,使实际执行图不携带 `start_image` 图像条件 | 导出的 API 图是否真的不再引用首帧;不要只看画布上有无一张图 |
| I2V:首帧驱动视频 | 启用 `LoadImage`,将实际首帧接入 `Wan22ImageToVideoLatent.start_image` | 图片来自哪里,尺寸与裁切怎样处理,图中初态是否能发生所需动作 |
官方教程提供可选图像输入的切换,并指出视频尺寸和长度在专用潜变量节点中设置。切换必须使用本模板支持的办法;不是任何 T2V 图加一个 `LoadImage` 就获得 I2V 能力,也不是从任意 I2V 图删掉输入便得到可用 T2V。[官方 Wan2.2 教程](https://docs.comfy.org/tutorials/video/wan/wan2_2)
选择 I2V 后,首帧给出的身份、构图与初态仍需审查。手已握住伞柄,却在文字里要求先从远处走近,图和动作就会冲突;这是输入设计问题,不必先怀疑采样器坏了。
### 6.3 帧数、采样步数与输出帧率不是一回事
- **帧数 / length:** 要组织多少视频帧;模型可能有特定的时间尺寸约束。
- **采样步数 / steps:** 去噪过程的计算次数,不等于视频帧数。
- **输出 fps:** 帧序列怎样按时间播放;随意改它会改变速度和时长,并不自动补出新的运动内容。
- **batch:** 多个样本的批量,不能把它直接当成一个视频的时间长度。
先保留模板适用的帧数与采样安排。做小样时,在模型支持范围内缩小分辨率、时长或批量;不能把长度改成任意整数后,认为所有时序结构仍会兼容。
这个 Wan 示例的 `CreateVideo` 有可选 AUDIO 入口,但以上基础链没有音频生成分支,因此不能把提示词里的“雨声、说话”当成已经输出音轨。原生音画联合生成或外部音轨合成,需要不同的模型或额外的实际音频路径,见[现有工作流拆解](16_现有工作流拆解与搭建练习.md)。
## 7. 在哪里加模块:先有问题,再加一条支路
| 已确认的问题 | 可研究的模块 | 它主要改变哪一层 | 不能指望它自动解决 |
|---|---|---|---|
| 需要特定风格或训练过的主体特征 | 兼容 LoRA | 模型,部分也改编码组件 | 所有机位的身份、持物、空间与剧情记忆 |
| 姿态或结构偏离 | 对应模型支持的 ControlNet / 控制条件 | 采样的结构约束 | 肌肉受力、接触顺序及所有遮挡物理 |
| 需要参考人物或外观 | 模型原生参考、视觉编码或适配器 | 模型规定的参考条件 | 自动获得首帧、尾帧、3D 世界的全部约束 |
| 局部需要修复 | 遮罩、局部编辑或重绘 | 指定区域的生成与合成 | 与其他镜头天然连续 |
| 分辨率不足 | 尺寸调整、超分、分块修复 | 像素或潜空间处理 | 修正原先错误的构图和动作因果 |
| 需要更多播放帧 | 插帧 | 已有帧之间的运动估计 | 修好换脸、瞬移、穿模和错误手势 |
| 运行速度不足 | 已支持的量化、缓存、加速方案 | 权重、计算或采样路径 | 在不测试的前提下保证质量不变 |
后期插帧是在已有视频帧之间补过渡;首尾帧视频生成则把两张图作为生成条件,让模型生成中间内容。它们解决的问题和输入路径不同,不能混称为同一种操作。
**LoRA 放在它实际修改的流上。** 经典 `LoraLoader` 接收 MODEL 与 CLIP,再输出修改后的对象;某些模型或 LoRA 使用 model-only 路径。不能把 LoRA 文件接到文本框,也不能假定每个 LoRA 都训练过文本编码器。[ComfyUI 官方节点源码](https://github.com/Comfy-Org/ComfyUI/blob/master/nodes.py)
**加速 LoRA 还带采样契约。** 它可能要求特定模型、步数、引导与调度,不能只把文件叠上去,再沿用普通高步数设置。人物 LoRA、风格 LoRA、加速 LoRA 的目标不同;每次只加入一个已核对兼容性的变化,与基线对照。
**控制图和控制模型不是同一物。** 骨架、深度和轮廓是输入条件;相应控制模型或原生节点负责如何使用它们。经典 `ControlNetApplyAdvanced` 把控制信息应用到 CONDITIONING,不是用一张深度图直接替换采样器的 MODEL。视频模型可能采用完全不同的原生控制结构,应另找对应模板,而非照搬图像 ControlNet 支路。
## 8. UI JSON、API JSON 和节点编号怎样理解
| 文件或字段 | 主要用途 | 不能混淆的地方 |
|---|---|---|
| UI 工作流 JSON | 保留画布节点、连线、布局、控件、分组或子图定义 | 好看的截图不能代替它;API 图也通常不含完整布局 |
| API 工作流 JSON | 描述后端实际执行节点的 `class_type` 与 `inputs` | 通常不能把 UI 顶层 `nodes/links` 直接作为本地 `/prompt` 的执行图 |
| node ID | 标识当前图中的一个节点实例 | 节点标题可改,ID 也不是跨所有工作流的固定职责编号 |
| 输出 slot | 该节点输出列表中的索引 | 通常从 0 开始;不是节点 ID、不是链接 ID |
| `widgets_values` | 某些 UI 格式按顺序存储参数 | 改版本或控件顺序后,不能按旧下标盲填 |
| 参数与引用 | 字面值,或对上游节点输出的引用 | 两项数组引用不是任意数值列表 |
例如,API 图中的 `"samples": ["3", 0]` 表示从**当前图的节点 3 的第 0 个输出**取数据,不是“采样 3 次、用 0 号随机种子”。只把这一字段单独保存,不会形成完整可运行工作流;还需存在源节点、匹配类型和可到达的输出。
UI 里的注释、重路由、禁用节点和子图也会影响导出形态。尽量从当前前端导出 API 格式,再检查实际 `class_type` 和引用;不要通过删除几个顶层字段手工“转换”。本机版本与示例可见[第16章](16_现有工作流拆解与搭建练习.md)。
### 用只读 schema 检查连线
自托管 ComfyUI 的 `GET /object_info` 或 `GET /object_info/{node_class}` 可查节点定义;`GET /system_stats` 可查设备与内存信息。以此确认必填项、可选项、输出顺序和模型下拉值,不必为了检查而提交生成任务。[官方服务器路由](https://docs.comfy.org/development/comfyui-server/comms_routes)
```text
GET /object_info/Wan22ImageToVideoLatent
检查:需要哪些输入?start_image 是不是可选?输出是什么类型?
GET /object_info/UNETLoader
检查:要用的模型文件是否出现在该服务器的候选列表?
GET /object_info/SaveVideo
检查:接收 VIDEO 还是其他类型?输出文件由哪个字段配置?
```
这不是一套独立的请求脚本,也不会执行图。模型列表能证明“被服务器发现”,不能证明文件完整、权重可加载或显存足够。
## 9. 一次可复查的搭建循环
1. 保存基线 UI 图与 API 图,记下模型、节点包、输入素材和运行设置。
2. 在受支持的小规模上跑通,确认输出数量、文件路径、视频帧数及有无音轨。
3. 抽看开头、中间、结尾,并看一次完整播放;采样成功不等于镜头合格。
4. 按问题只改一个主要变量,例如加入参考条件,而不是同时更换模型、seed、步数与所有提示词。
5. A/B 比较时尽量控制其他输入;固定 seed 方便对照,但不承诺完全确定性或跨版本相同结果。
6. 若要更换模型家族,重新选模板和对应组件;不要只替换主模型文件名。
7. 扩到目标尺寸、帧数与批量后再验收;小样跑通不保证最终规模的峰值内存可承受。
8. 采用的版本重新保存,并把失效或弃用的实验标清,避免剪辑时混用不同初始状态。
画布可按“输入/模型→条件→采样→解码→封装保存→后处理”分组。共享同一组件的支路可复用其加载器;不同模型家族不因端口类型相同就共享 VAE 或编码器。整理布局的目的是能沿故障数据追到上游,不能靠折叠分组掩盖依赖。
## 10. 排错顺序:找最早失败的层面
| 现象 | 先收集什么证据 | 优先检查与处理 |
|---|---|---|
| 导入后红色缺节点 | 缺失的 `class_type`、节点来源、启动导入日志 | 核心版本是否包含它、自定义包是否装在实际运行环境、是否导入失败;先不乱换采样器 |
| 模型下拉框没有文件 | 加载器列表、实际模型目录、路径配置 | 文件是否放在服务端正确分类目录;目录变化后刷新列表,仍无则检查路径配置 |
| 线接不上或参数校验失败 | 源输出类型、目标输入类型、字段名与允许选项 | 先修连线和参数;不要把错误类型强行伪装成匹配 |
| `shape`、矩阵维度或通道错误 | 首个报错节点、模型与编码器/VAE组合、输入尺寸 | 检查模型家族与时间/空间尺寸约束,回到原模板验证 |
| 采样开始就 OOM | 当前空闲显存、尺寸、帧数、批量、权重精度 | 在模型允许范围内减负,检查重复加载;不能仅凭模型文件大小估算总峰值 |
| 采样完成,解码时 OOM | 解码节点、最终潜变量规模、设备占用 | 检查视频长度、VAE 与分块/分段支持;不是每个 VAE 都实现相同的 tiled 行为 |
| 输出黑片、噪点或异常颜色 | 潜变量来源、匹配的 VAE、首个异常阶段和精度日志 | 可能是模型/条件错配、数值异常或解码问题;先定位,别一律认定“提示词不够好” |
| 显示成功,却找不到视频 | 末端输出节点、执行历史中的 outputs、文件名与类型 | 是不是只连了预览,或只有 IMAGE 帧而未封装保存;确认保存节点真在输出路径上 |
| 有画面没有声音 | 是否有实际 AUDIO 数据,是否接入封装,成片音轨信息 | 不以提示词提到声音或节点有 AUDIO 口,推定音频已生成 |
| 视频速度或音画长度不符 | 帧数、封装 fps、音频采样率与实际时长 | 分清采样过程和播放设置;先对齐时间,再判断是否需要补帧或重做素材 |
| 改参数几乎立刻结束 | 执行节点与缓存信息、被改控件是否在有效支路 | 可能是正常缓存复用,也可能改了未执行分支;不要仅凭快就判故障 |
| 更新后以前的图失效 | 更新前后核心、前端、节点包与依赖版本 | 回到可工作的备份并逐层定位;先查当前发布说明,不凭旧问题清单认定今天仍未修复 |
每次报错保留节点 ID、`class_type`、首个异常、输入素材版本和参数快照。报错最后一行常是结果,真正原因可能在更早的模型加载或节点导入处。多用户服务器上,清队列、释放模型、重启会影响其他任务,排错前先确认当前运行状态;本章没有要求读者先重装整个环境。
## 11. API 的“入队成功”与“完成成功”分开
对自托管服务,`POST /prompt` 会验证并加入执行队列,成功响应通常包含 `prompt_id`;如果验证失败,会有 `error` 或 `node_errors`。这只说明接收状态。后续还可能加载失败、运行异常或没有所需输出。要继续观察 WebSocket 事件,或查询 `GET /history/{prompt_id}`,核对状态和输出,再实际取回文件检查。
最少记录四个阶段:**已提交 → 已开始 → 执行结束状态 → 输出已取回并验收**。云端、部署 API 与自托管接口可能有不同端点和认证方式,不能把本地请求体直接推广给所有服务。
## 12. 交付一份别人能继续改的工作流
```text
workflow_gui.json 供画布查看与编辑,保留可理解的布局
workflow_api.json 当前版本导出的实际执行图
dependencies.md 模型文件、节点包、版本与来源
inputs.md 输入素材清单、职责和适用镜头
run_record.json 运行设置、prompt_id、输出文件、采用或返修理由
```
文件名是组织建议,不要求每个项目都照抄。模型权重、图片、音频与凭据不需要打进同一个 JSON。尤其检查调用服务的节点是否把 token 等敏感值存进了工作流;分享给团队时使用适当的凭据配置方式。
交付检查:
- 图中的节点类型和必填参数,在目标服务器可用。
- 模型、编码器、VAE 与可选模块确实相互兼容。
- 输入来自可定位的素材版本,参考职责写清楚。
- 所需支路没有误禁用,最后有对应的保存路径。
- UI 图与 API 图对应同一个制作版本,布局能沿数据依赖阅读。
- 实际运行过的设置与只做过结构检查的设置分别标注。
- 文件取回后检查内容与时间,不把成功日志代替观看。
## 13. 建议的三个搭建练习
**练习一:只学闭环。** 用基础文生图模板,指出 MODEL、CLIP、VAE、CONDITIONING、LATENT 和 IMAGE 各在哪条线上。暂不叠 LoRA、ControlNet 与放大,确认自己知道每一步产生什么。
**练习二:同一视频模板比较文/图模式。** 在支持双模式的 TI2V 5B 模板副本上,只切换首帧条件,并检查导出的执行图。使用同一镜头任务,对比初始构图、身份与动作发展;结果不能提前假定 I2V 一定更好。选择依据见[第14章](14_文生视频与图生视频的选择.md)。
**练习三:给已有工作流增加一个有理由的支路。** 先说清它解决什么,再查端口类型、模型兼容与额外内存,生成一次有对照的样片。写下这个模块改善了什么、没有改善什么,以及是否值得保留。可以从[本机已用流程](16_现有工作流拆解与搭建练习.md)开始,避免学习与生产同时更换全部变量。
## 本章查证来源
以下均于 2026-10-29 读取官方页面或官方仓库;教程、节点实现和模板今后可能更新。本章不把旧技能日志中的开放问题当作当前仍存在的事实。
1. [ComfyUI Workflow Templates](https://docs.comfy.org/interface/features/template)——模板入口、依赖与模板包。
2. [ComfyUI First Generation](https://docs.comfy.org/get_started/first_generation)——基础生成、工作流导入与模型路径。
3. [ComfyUI Nodes](https://docs.comfy.org/basic-concepts/nodes)——节点、连接与状态。
4. [ComfyUI Datatypes](https://docs.comfy.org/custom-nodes/backend/datatypes)——IMAGE、LATENT、AUDIO 等类型结构。
5. [Comfy-Org 基础示例工作流](https://github.com/Comfy-Org/docs/blob/main/public/text-to-image.json)——基础图像链的结构入口。
6. [Wan2.2 官方仓库](https://github.com/Wan-Video/Wan2.2)——模型家族与 TI2V 的任务区别。
7. [ComfyUI Wan2.2 教程](https://docs.comfy.org/tutorials/video/wan/wan2_2)——5B 与 14B 的组件、可选图像模式。
8. [官方 TI2V 5B 模板 JSON](https://raw.githubusercontent.com/Comfy-Org/workflow_templates/refs/heads/main/templates/video_wan2_2_5B_ti2v.json)——本章视频节点与数据流拆解。
9. [ComfyUI 官方节点源码](https://github.com/Comfy-Org/ComfyUI/blob/master/nodes.py)——经典加载、LoRA 与 ControlNet 节点职责。
10. [ComfyUI Server Routes](https://docs.comfy.org/development/comfyui-server/comms_routes)——schema、队列、历史与输出查询。
@@ -0,0 +1,190 @@
# 16|现有工作流拆解与搭建练习
[返回知识库目录](README.md) · [生成方式选择](14_文生视频与图生视频的选择.md) · [工作流搭建与排错](15_ComfyUI工作流搭建与排错.md)
本章用你已有项目说明“画面意图如何落到节点和连线”。案例是《明天的来电》的 S01 图生视频图,以及较早项目中的 Wan 5B 研究图。本轮只读检查,不提交渲染、不修改旧项目工作流。
资料核查:2026-10-29。服务器当时可访问,报告 ComfyUI **0.39.0**;这些是本次环境快照,不是其他机器的安装要求。
## 1. 先把四种“验证通过”分开
| 层级 | 本例的证据 | 能说明什么 | 不能说明什么 |
|---|---|---|---|
| 文件与历史 | S01 保存 API 与历史真正执行的图完全相等;记录为 success、completed=true | 这份图确实曾被成功执行 | 当前所有依赖仍与当时完全一致 |
| 当前节点接口 | 对16个节点逐个核对实时 schema,必填输入与引用输出类型未发现错误 | 当前节点存在,接线声明相容 | 张量尺寸、数值稳定性和内容质量一定正确 |
| 当前模型列表 | 本例5个模型或 LoRA 文件均在对应 loader 的可选列表中 | 文件名当前可被 loader 识别 | 每种量化、LoRA组合或硬件执行都已重新测试 |
| 本轮实际生成 | 未提交新任务 | 本章没有消耗一轮新生成来证明效果 | 原参考图片现在仍可加载、任意新尺寸都能成功 |
具体节点、连线、模型与验证边界保存在[工作流接口核对.json](工作流接口核对.json)。它是审计记录,不是可以直接提交的工作流。
## 2. 实际文件在哪里
下列链接指向制作电脑上的原项目,不随这个文档仓库打包;在别的电脑阅读时,需要使用自己的工作流与输入素材。
- [S01 的 GUI 工作流](F:/AI视频项目/short_drama_batch_20261028/C01_mystery/jobs/S01/workflow_gui.json):打开画布学习16个节点和19条连线。
- [S01 的 API 工作流](F:/AI视频项目/short_drama_batch_20261028/C01_mystery/jobs/S01/workflow_api.json):学习程序实际执行的字段与引用。
- [S01 的执行历史](F:/AI视频项目/short_drama_batch_20261028/C01_mystery/jobs/S01/history.json):核对真正执行的图与输出状态。
- [S01 的作业记录](F:/AI视频项目/short_drama_batch_20261028/C01_mystery/jobs/S01/job.json):对应项目的作业状态。
学习时先复制成自己的新版本,再替换首图和镜头描述。原执行文件可以继续作为历史依据。
## 3. 为什么说这次执行的是图生视频
看这条真实连线:
```text
LoadImage(ID 1,输出0:IMAGE)
→ MiniMaxH3ImageToVideo(ID 104)的 first_frame 输入
```
首图接入 `first_frame`,因此本次是首帧 I2V。判断依据是输入职责和实际连线,不是文件名、模型名或工作流标题。本手册所举的 Wan2.2 TI2V-5B 支持文字或图片模式,也不能据此判断某一次执行没有接图。首图提供起始视觉依据,不锁定未见背面、完整三维结构或后续动作时序;转身、环绕和交接仍须审片。
本次接口中,`MiniMaxH3ImageToVideo` 的必填项是 `clip / vae / prompt / width / height / length`,`first_frame / last_frame` 是可选图片输入。接口上的“可选”只描述字段要求;切到另一种模式,还应确认所选权重、模板与整个流程支持该任务。官方提供了不同模式模板,适合用来做准确对照。[Comfy H3 官方指南](https://docs.comfy.org/tutorials/video/minimax/minimax-h3)
## 4. 把16个节点分成六组读
### 4.1 主模型与加速分支
```text
UNETLoader 6
→ LoraLoaderModelOnly 121
├→ BasicGuider 16
└→ BasicScheduler 9
```
主模型负责生成,模型专用的 Turbo LoRA 改变这里的 MODEL 流。该图用的是 **ModelOnly** loader,CLIP 分支没有经过它;不要因为普通图片教程里出现了 `LoraLoader`,就给这里补一个并不存在的 CLIP 改动。
这份 LoRA 的用途是本项目的加速组合,没有证据说明它是为片中角色训练的身份 LoRA。减少步数必须与对应权重和采样方案相容;不能把“8步”当作随便换模型后仍成立的质量承诺。
### 4.2 文本、首图与视频潜空间
```text
CLIPLoader 13 ────────────────┐
VAELoader 11(视频VAE)───────┼→ MiniMaxH3ImageToVideo 104
LoadImage 1(首图)───────────┘ ├ 输出0:CONDITIONING → Guider 16
└ 输出1:LATENT → Sampler 14
```
提示词在104里与所需输入一起处理。它不仅输出条件,也准备带视频时间维度的潜空间;因此普通文生图中一个 `EmptyLatentImage` 不能不经模型适配地替代这个节点。
### 4.3 采样器不是一个“神奇黑盒按钮”
| ID / 节点 | 交给采样过程的是什么 | 本图设置或来源 |
|---|---|---|
| 15 `RandomNoise` | 起始噪声 | `noise_seed` |
| 16 `BasicGuider` | 模型与条件形成的引导 | 模型来自121,条件来自104输出0 |
| 17 `KSamplerSelect` | 采样算法对象 | `res_multistep` |
| 9 `BasicScheduler` | 采样噪声级别序列 SIGMAS | `simple`、8 steps、denoise 1.0 |
| 14 `SamplerCustomAdvanced` | 综合上述对象处理潜空间 | 初始 latent 来自104输出1 |
这里的 `BasicGuider` 只有模型与 conditioning 输入,没有普通正负提示成对输入。照搬其他模型的“加一个负向分支”并不能自动改善它。要按当前模型官方流程决定负向条件和引导方式。
### 4.4 一份采样结果,分别解出视频与声音
```text
SamplerCustomAdvanced 14(输出0)
├→ VAEDecode 10 + 视频VAE 11 → IMAGE 帧批次 ┐
└→ VAEDecodeAudio 23 + 音频VAE 24 → AUDIO ─┴→ CreateVideo 91
```
两个解码器取自同一采样结果,使用各自的 VAE。这里不能把音频 VAE 当作视频 VAE 使用,也不能把视频分支换成普通图片模型的 VAE。更不能把这条联合音视频路径推广为所有视频模型都具备原生音频。
### 4.5 封装和保存是两个职责
```text
CreateVideo 91(帧、音频、24fps)
→ SaveVideo 92(文件名前缀、容器/编码设置)
```
`CreateVideo` 把输入组合成 VIDEO,`SaveVideo` 才是这个例子中的保存终点。构图、角色一致性与对白质量仍要观看输出,文件存在不代表内容合格。
## 5. 节点 ID、输出 slot 和参数怎样对应
以下是从本例抽出的教学片段,省略了其余节点,并替换了原提示词;**不能单独提交运行**:
```json
{
"104": {
"class_type": "MiniMaxH3ImageToVideo",
"inputs": {
"clip": ["13", 0],
"vae": ["11", 0],
"first_frame": ["1", 0],
"prompt": "这里填写自己的镜头描述",
"width": 960,
"height": 544,
"length": 192
}
}
}
```
- `"104"` 是这个图里的节点 ID,不是所有 H3 图固定使用的编号。
- `class_type` 指具体节点实现,不能随意改成界面中文标题。
- `["13", 0]` 表示13号节点的第0个输出,slot 从0起数。
- `width: 960` 是直接填写的参数,不是连线。
- 本图104的第0输出是 CONDITIONING,第1输出才是 LATENT。两者如果接反,数字格式看似合法,类型却不相容。
GUI 文件还包含画布坐标、连线、控件与分组。修改 GUI 后,重新导出 API 比按猜测修改 `widgets_values` 的位置顺序更可靠。模型文件名、输入图与节点版本也要一起记录。[Comfy 工作流概念](https://docs.comfy.org/basic-concepts/workflow)
## 6. 本例参数只能当作基线记录
| 项目 | 该次图内的值 | 学习时注意 |
|---|---|---|
| 主模型 | `minimax_h3_fl2va_pruned_int8_convrot.safetensors` | 量化、架构和 loader 兼容需要对应环境验证 |
| 加速 LoRA | `minimax_h3_fl2v_turbo_8step_v1.0_comfyui_bf16.safetensors`,strength 1.0 | 名称和强度都属于这个组合 |
| 文本编码器 | `qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors`,type=minimax | 名字含 CLIP 的 loader 不代表内部一定是传统 CLIP 模型 |
| 视频 VAE | `minimax_h3_video_vae_fp16.safetensors` | 和音频 VAE 分开 |
| 音频 VAE | `minimax_h3_audio_vae_fp32.safetensors` | 不替代视频解码器 |
| 尺寸 / 帧数 | 960×544,192帧 | 不等于最终剪辑输出尺寸;帧数约束按具体模型确定 |
| 封装帧率 | 24fps | 192÷24是名义8秒,实际文件时长需媒体探测 |
| 采样设置 | 8步、res_multistep/simple、denoise 1.0 | 不外推为通用最快配置 |
改变分辨率、时长、量化或 LoRA 都可能改变内存和数值行为。已经成功过的8秒图,也不能证明任意长片段或多人动作都稳定。
## 7. 新手照着怎样练搭建
这是练习安排,不会因阅读本章自动排队任务。
1. **先读闭环。** 在 GUI 副本里从保存节点逆着线走,找出帧、声音、采样、条件和模型的来源。能回答每条线是什么类型,再动手删改。
2. **替换首图与描述。** 在界面上传自己的图片,让 `LoadImage` 使用服务端实际收到的文件;远程 Linux ComfyUI 不能直接读取 Windows 的 `F:/...` 路径。
3. **保留已知基线。** 起初保持对应模板的模型、编码器、VAE、采样器与调度参数;尺寸和帧数调整也遵守模型限制。
4. **只更改一个创作变量。** 比较相同构图下静止、缓慢转头、一次递物等动作,不同时更换模型、首图、运镜、步数和 LoRA。
5. **记录运行与画面。** 检查任务完成、文件可播放、时长与声音,并观看关键动作、首尾帧和前后镜连续性。
6. **再添加一项功能。** 需要另一种控制时,选择该模型支持的参考、首尾帧或控制模板;需要放大时在输出路径另加明确阶段,分别验证。
7. **保存两个格式与依赖。** 画布版用于打开编辑,API版用于程序调用;记录它们对应同一版本。
如果想练纯文生视频,另开官方 T2V 模板,确认未接首帧、尾帧或参考图/视频等视觉输入,且当前路径确为文字驱动,再和 I2V 做同一镜头任务的对照。不要把这份已接首图的图改个文件名就当作 T2V 基线。
## 8. Wan 5B 的本地参考为什么不能与 H3 混接
[本地 Wan 参考 API](F:/AI视频项目/moon_repair_20261016/research/wan5b_reference_from_gui.api.json)的路径是:
```text
UNETLoader → ModelSamplingSD3 → KSampler → VAEDecode → VHS_VideoCombine
CLIPLoader → 正向/负向 CLIPTextEncode ────→ KSampler
LoadImage → Wan22ImageToVideoLatent ──────→ KSampler.latent_image
Wan2.2 VAE ───→ 视频 latent 准备与 VAEDecode
```
这也是 I2V:`LoadImage` 接到了 `start_image`。图中使用 Wan2.2 5B、对应的 Wan2.2 VAE,以及 UMT5 编码器;它与 H3 的条件处理、采样组织和音频路径不同。本地保存版使用 VHS 输出,官方当前示例也可采用其他保存节点;不要因输出节点不同就把整个模型链混换。[Wan2.2 官方教程](https://docs.comfy.org/tutorials/video/wan/wan2_2)
同目录的[竖屏候选图](F:/AI视频项目/moon_repair_20261016/research/wan5b_i2v_portrait_candidate.api.json)仍含 `REPLACE_WITH_UPLOAD_RETURNED_PATH.png`。它不能原样运行,81帧设置也不能借后来73帧的成片记录冒称已经验证。学习时区分“研究候选”“真实提交图”“成功输出”,保留每一步的证据。
## 9. 复制前的五个检查问题
- 这张图实际是文生、首图驱动,还是参考驱动?输入线在哪里?
- 我想锁定的是身份、首帧、动作还是镜头路线,当前输入方式真的约束了它吗?
- 模型、编码器、VAE、加速 LoRA、采样路径是否属于兼容的一套?
- 改图后能从保存终点追到完整输入吗?图片、视频和声音类型是否匹配?
- 我的“可用”证据到哪一层:只有能打开、接口通过、跑完过,还是已经观看并验收?
## 10. 依据与边界
- 原项目 GUI、API、作业和历史文件:本章节点 ID、连线与已执行证据的直接来源。
- [本轮工作流接口核对](工作流接口核对.json):当前节点与模型列表的只读核实,不代表新渲染成功。
- [Comfy H3 官方指南](https://docs.comfy.org/tutorials/video/minimax/minimax-h3):模板模式与多模态工作流入口。
- [Comfy Wan2.2 官方教程](https://docs.comfy.org/tutorials/video/wan/wan2_2):5B 文/图双模式与模型组件的对应关系。
- [Comfy 工作流概念](https://docs.comfy.org/basic-concepts/workflow):节点、类型、连线和保存。
本章没有重分发模型或输入图片,没有新建可直接执行的完整工作流。上面的图示和片段用于教你读懂和搭建;真正运行时,以完整模板、实机接口与自己的素材为准。
@@ -0,0 +1,391 @@
{
"checked_date": "2026-10-29",
"base_url": "http://192.168.10.51:8188",
"source_workflow": "F:\\AI视频项目\\short_drama_batch_20261028\\C01_mystery\\jobs\\S01\\workflow_api.json",
"nodes": 16,
"class_types": 15,
"schema_errors": [],
"selected_models": [
{
"node": "6",
"input": "unet_name",
"file": "minimax_h3_fl2va_pruned_int8_convrot.safetensors",
"visible": true
},
{
"node": "121",
"input": "lora_name",
"file": "minimax_h3_fl2v_turbo_8step_v1.0_comfyui_bf16.safetensors",
"visible": true
},
{
"node": "13",
"input": "clip_name",
"file": "qwen3vl_32b_minimax_h3_nvfp4_awq.safetensors",
"visible": true
},
{
"node": "11",
"input": "vae_name",
"file": "minimax_h3_video_vae_fp16.safetensors",
"visible": true
},
{
"node": "24",
"input": "vae_name",
"file": "minimax_h3_audio_vae_fp32.safetensors",
"visible": true
}
],
"node_summary": [
{
"id": "6",
"class_type": "UNETLoader",
"inputs": [
"unet_name",
"weight_dtype"
],
"output_types": [
"MODEL"
]
},
{
"id": "121",
"class_type": "LoraLoaderModelOnly",
"inputs": [
"model",
"lora_name",
"strength_model"
],
"output_types": [
"MODEL"
]
},
{
"id": "13",
"class_type": "CLIPLoader",
"inputs": [
"clip_name",
"type",
"device"
],
"output_types": [
"CLIP"
]
},
{
"id": "11",
"class_type": "VAELoader",
"inputs": [
"vae_name"
],
"output_types": [
"VAE"
]
},
{
"id": "24",
"class_type": "VAELoader",
"inputs": [
"vae_name"
],
"output_types": [
"VAE"
]
},
{
"id": "104",
"class_type": "MiniMaxH3ImageToVideo",
"inputs": [
"clip",
"vae",
"prompt",
"width",
"height",
"length",
"first_frame"
],
"output_types": [
"CONDITIONING",
"LATENT"
]
},
{
"id": "15",
"class_type": "RandomNoise",
"inputs": [
"noise_seed"
],
"output_types": [
"NOISE"
]
},
{
"id": "16",
"class_type": "BasicGuider",
"inputs": [
"model",
"conditioning"
],
"output_types": [
"GUIDER"
]
},
{
"id": "17",
"class_type": "KSamplerSelect",
"inputs": [
"sampler_name"
],
"output_types": [
"SAMPLER"
]
},
{
"id": "9",
"class_type": "BasicScheduler",
"inputs": [
"model",
"scheduler",
"steps",
"denoise"
],
"output_types": [
"SIGMAS"
]
},
{
"id": "14",
"class_type": "SamplerCustomAdvanced",
"inputs": [
"noise",
"guider",
"sampler",
"sigmas",
"latent_image"
],
"output_types": [
"LATENT",
"LATENT"
]
},
{
"id": "10",
"class_type": "VAEDecode",
"inputs": [
"samples",
"vae"
],
"output_types": [
"IMAGE"
]
},
{
"id": "23",
"class_type": "VAEDecodeAudio",
"inputs": [
"samples",
"vae"
],
"output_types": [
"AUDIO"
]
},
{
"id": "91",
"class_type": "CreateVideo",
"inputs": [
"images",
"audio",
"fps",
"bit_depth"
],
"output_types": [
"VIDEO"
]
},
{
"id": "92",
"class_type": "SaveVideo",
"inputs": [
"video",
"filename_prefix",
"format",
"codec"
],
"output_types": [
"VIDEO"
]
},
{
"id": "1",
"class_type": "LoadImage",
"inputs": [
"image"
],
"output_types": [
"IMAGE",
"MASK"
]
}
],
"edges": [
{
"from": "6:0",
"to": "121.model",
"type": "MODEL"
},
{
"from": "13:0",
"to": "104.clip",
"type": "CLIP"
},
{
"from": "11:0",
"to": "104.vae",
"type": "VAE"
},
{
"from": "1:0",
"to": "104.first_frame",
"type": "IMAGE"
},
{
"from": "121:0",
"to": "16.model",
"type": "MODEL"
},
{
"from": "104:0",
"to": "16.conditioning",
"type": "CONDITIONING"
},
{
"from": "121:0",
"to": "9.model",
"type": "MODEL"
},
{
"from": "15:0",
"to": "14.noise",
"type": "NOISE"
},
{
"from": "16:0",
"to": "14.guider",
"type": "GUIDER"
},
{
"from": "17:0",
"to": "14.sampler",
"type": "SAMPLER"
},
{
"from": "9:0",
"to": "14.sigmas",
"type": "SIGMAS"
},
{
"from": "104:1",
"to": "14.latent_image",
"type": "LATENT"
},
{
"from": "14:0",
"to": "10.samples",
"type": "LATENT"
},
{
"from": "11:0",
"to": "10.vae",
"type": "VAE"
},
{
"from": "14:0",
"to": "23.samples",
"type": "LATENT"
},
{
"from": "24:0",
"to": "23.vae",
"type": "VAE"
},
{
"from": "10:0",
"to": "91.images",
"type": "IMAGE"
},
{
"from": "23:0",
"to": "91.audio",
"type": "AUDIO"
},
{
"from": "91:0",
"to": "92.video",
"type": "VIDEO"
}
],
"render_submitted": false,
"archive_evidence": {
"api_equals_executed_prompt": true,
"status": "success",
"completed": true,
"gui_nodes": 16,
"gui_links": 19
},
"validation_scope": [
"current node classes and required inputs",
"connected output slots and declared types",
"selected model filenames visible to loaders",
"saved API compared with archived executed prompt"
],
"limitations": [
"No render was submitted during this documentation task.",
"Current reference image availability and full runtime tensor compatibility were not re-tested.",
"Examples are historical local workflows; this JSON is an audit record, not an executable workflow."
],
"comfyui_version": "0.39.0",
"schema_excerpt": {
"MiniMaxH3ImageToVideo": {
"required": {
"clip": "CLIP",
"vae": "VAE",
"prompt": "STRING",
"width": "INT",
"height": "INT",
"length": "INT"
},
"optional": {
"first_frame": "IMAGE",
"last_frame": "IMAGE"
},
"output": [
"CONDITIONING",
"LATENT"
],
"output_name": [
"positive",
"LATENT"
]
},
"Wan22ImageToVideoLatent": {
"required": {
"vae": "VAE",
"width": "INT",
"height": "INT",
"length": "INT",
"batch_size": "INT"
},
"optional": {
"start_image": "IMAGE"
},
"output": [
"LATENT"
],
"output_name": [
"LATENT"
]
}
}
}
+29 -13
View File
@@ -1,17 +1,18 @@
{ {
"checked_date": "2026-10-29", "checked_date": "2026-10-29",
"status": "passed", "status": "passed",
"numbered_chapters": 13, "numbered_chapters": 16,
"markdown_files": 14, "markdown_files": 17,
"chinese_characters": 50533, "chinese_characters": 65839,
"external_urls_unique": 58, "external_urls_unique": 76,
"relative_links_checked": 132, "relative_and_local_links_checked": 168,
"tables_checked": 69, "tables_checked": 86,
"utf8_no_bom_and_lf": true, "utf8_no_bom_and_lf": true,
"code_fences_balanced": true, "code_fences_balanced": true,
"main_handbook_unchanged_sha256": "0621be2600a4449b4d8a06923cc70bc703e8615fd2db4075552a9bf701c7a1a4", "main_handbook_unchanged_sha256": "0621be2600a4449b4d8a06923cc70bc703e8615fd2db4075552a9bf701c7a1a4",
"case_studies": 10, "case_studies": 10,
"content_review": "cross-reviewed; corrected causal timing, prop ownership, exit blocking and one unavailable source link", "content_review": "cross-reviewed storytelling, spatial continuity, mode selection, workflow types and archived execution evidence",
"workflow_audit": "16 H3 nodes, 19 connections, 5 visible model/LoRA files; archived API equals executed prompt",
"generated_video_tested": false, "generated_video_tested": false,
"files": [ "files": [
{ {
@@ -61,8 +62,8 @@
}, },
{ {
"name": "10_AI转译与实操模板.md", "name": "10_AI转译与实操模板.md",
"bytes": 16542, "bytes": 16851,
"sha256": "01243d16461d50fab03af2b09288661e977edd5a5b6ae639c0b8cb6e33ca26f9" "sha256": "d94d73ce544d21c8f84ec4017c2164088d7291b747df69157fa3b7cbc1e6bd1e"
}, },
{ {
"name": "11_练习路径与检查表.md", "name": "11_练习路径与检查表.md",
@@ -71,18 +72,33 @@
}, },
{ {
"name": "12_术语索引与资料来源.md", "name": "12_术语索引与资料来源.md",
"bytes": 13675, "bytes": 14669,
"sha256": "f3bf8737a7fd2199888b4aa08f18491b2395cff2969ef908dfb59f1b6f248b3f" "sha256": "cc10112a14f78fa56da5ee93fec8104f216f1c610f3297669861ea7957dbf4fa"
}, },
{ {
"name": "13_表现手法与风格系统.md", "name": "13_表现手法与风格系统.md",
"bytes": 9895, "bytes": 9895,
"sha256": "5e106e22e8cf508902c531584623914c1f71cf42e60e41c2081e961d5bee3d7d" "sha256": "5e106e22e8cf508902c531584623914c1f71cf42e60e41c2081e961d5bee3d7d"
}, },
{
"name": "14_文生视频与图生视频的选择.md",
"bytes": 21921,
"sha256": "ea5ff1c09d5490fd219aa468e1021330fe88b7631c0eda1d35de541c2ea8c66a"
},
{
"name": "15_ComfyUI工作流搭建与排错.md",
"bytes": 27901,
"sha256": "8c75fb1d00240a96bd5798dbf5f1c752825ffdb6b599fb5979c32ce087e609c7"
},
{
"name": "16_现有工作流拆解与搭建练习.md",
"bytes": 13116,
"sha256": "30f53e689e0252f8bdd06c43814e9c4f52aeba3da218cc16fb91356d4032fb85"
},
{ {
"name": "README.md", "name": "README.md",
"bytes": 5102, "bytes": 6249,
"sha256": "9484b77f897e95f61625ea1e117c5d0d0f1b740012df031ce685c4831b7735c2" "sha256": "fd7e731140f35ff66e91c261d88d7236aa100388a109b33ab6cd2bb682475801"
} }
], ],
"errors": [] "errors": []