在 AI 短剧的批量生产中,最大的痛点从来不是「能不能生成一张好看的图」,而是「同一个角色能不能在几十个镜头里始终是同一张脸、同一套衣服、同一种画风」。上一期我们已经搭好了 ComfyUI 的基础工作流,这一期就专门攻克角色一致性这道坎,把 ControlNet、参考图与 LoRA 三件套讲透。它们是短剧能连续拍下去、观众不「出戏」的技术底座。

为什么短剧必须解决角色一致性
短剧是「连续叙事」,观众对主角脸的记忆一旦建立,后续任何一次换脸都会瞬间打断沉浸感。传统手绘动画靠的是统一的人设图与反复校准,而 AI 生成天生带有随机性:同样的提示词,换一个种子、换一次采样,出来的就是另一个「长得有点像但绝不是同一个人」的角色。
角色一致性本质上是把生成过程的「自由度」约束起来,让它朝我们指定的方向收敛。ComfyUI 提供了三层约束手段,从松到紧分别是:
- 提示词约束:把角色特征写进 prompt,最弱,只能控制大概风格。
- 参考图约束:用 IP-Adapter 等节点让模型「看着」参考图来画,中等强度。
- 结构化约束:用 ControlNet 锁住姿势、线稿、深度等底层结构,最强,保证「骨架」不变。
实际生产中三者是叠加使用的:LoRA 定义「这是谁」,ControlNet 定义「这个人在做什么动作」,参考图定义「这个镜头的构图和光影」。下面逐一展开。
第一层:LoRA 让角色「认脸」
LoRA(Low-Rank Adaptation)是一种轻量微调技术,它不改动底模的大权重,只在模型旁边挂一个小的低秩矩阵补丁。训练一个角色 LoRA,通常只需要十几张到几十张该角色的多角度、多表情、多光线的清晰图,就能让 Stable Diffusion 系列底模「记住」这个人。
训练角色 LoRA 的要点如下:
- 素材质量优先:每张图主角清晰、面部不遮挡、分辨率统一(建议 512×512 或 768×768)。
- 角度要全:正脸、左右侧脸、半侧、俯仰角都要有,否则生成时脸型会「漂移」。
- 触发词固定:训练时给角色起一个独一无二的触发词,例如
@sdqz_sister,生成时必须带上这个词才会激活 LoRA。 - 训练步数克制:步数过多会「过拟合」,角色脸记住了但灵活性下降,连动作都学不会了。
一个标准的 ComfyUI LoRA 加载配置如下,把 LoraLoader 节点接入主链路即可:
{
"type": "LoraLoader",
"inputs": {
"model": ["CheckpointLoader", 0],
"clip": ["CheckpointLoader", 1],
"lora_name": "sdqz_sister_v1.safetensors",
"strength_model": 0.85,
"strength_clip": 0.85
}
}
strength_model 和 strength_clip 通常设为 0.8 左右,低于 1.0 可以给底模留出一定创作空间,避免角色表情僵硬。
第二层:参考图锁定「脸与气质」
LoRA 负责「记住长相」,参考图负责「告诉模型当前镜头要照谁画」。ComfyUI 里最常用的方案是 IP-Adapter(Image Prompt Adapter),它把一张参考图的视觉特征注入到文生图或图生图流程中,让输出图在人物气质、配色、构图上都向参考图靠拢。
IP-Adapter 的典型接入方式是「IPAdapter Apply」,同时给一个权重来控制参考图的影响力。参考权重建议从 0.6 开始试探:
ipadapter:
weight: 0.65
weight_type: "linear"
reference_image: "character_sheet.png"
combine_embeds: "concat"
这里有几个实战经验值得记下来:
- 参考图优先用「角色设定图」(character sheet),一张图包含正脸、侧脸和全身造型,比单张正脸图更稳定。
- 权重过高会导致「整张图照抄参考图」,失去你想要的构图和动作,0.5~0.7 是黄金区间。
- 如果生成结果肤色、发色漂移,尝试把
weight_type换成ease in-out让影响更平滑。
第三层:ControlNet 锁住「姿势与结构」
前两层解决「像谁」,ControlNet 解决「在干嘛、站哪、什么姿势」。它通过额外条件图(如 OpenPose 骨架、Canny 线稿、深度图)直接约束生成过程中的空间结构,是短剧分镜里最硬的约束。
短剧场景里最实用的是 OpenPose 控制。你可以在上一个镜头里把角色的动作骨架提取出来,套用到下一个镜头,保证「同一个动作的不同景别」不会变形。控制流程如下:
# 从已有帧提取 OpenPose 骨架图
python preprocess.py
--model-type openpose
--input frame_0012.png
--output pose_0012.png
# 用骨架图作为 ControlNet 条件重新生成
python main.py
--prompt "same girl raising her hand, cinematic light"
--controlnet-condition pose_0012.png
--controlnet-mode controlnet
ControlNet 在 ComfyUI 里的接线思路是:LoadImage 加载条件图 → ControlNetApply 设置强度和起止步 → 接入采样器。其中 strength 是核心参数:
{
"type": "ControlNetApply",
"inputs": {
"conditioning": ["CLIPTextEncode", 0],
"control_net": ["ControlNetLoader", 0],
"image": ["LoadImage", 0],
"strength": 0.9,
"start_percent": 0.0,
"end_percent": 0.8
}
}
end_percent 设为 0.8 意味着在采样最后 20% 阶段释放约束,让模型补细节,既保住了骨架又不会产生生硬的「贴图感」。
三件套组合:一套可复用的角色一致性工作流
真正生产时,三者不是选择题而是叠加题。下面给出一个「角色一致性出图」的节点链路,从模型加载到出图一气呵成:
workflow:
- CheckpointLoader:
ckpt_name: "realisticVisionV51.safetensors"
- LoraLoader:
lora_name: "sdqz_sister_v1.safetensors"
strength_model: 0.85
- IPAdapterApply:
reference_image: "character_sheet.png"
weight: 0.6
- ControlNetLoader:
control_net: "control_v11p_sd15_openpose"
- ControlNetApply:
strength: 0.9
end_percent: 0.8
- KSampler:
steps: 28
cfg: 6.5
sampler_name: "dpmpp_2m"
scheduler: "karras"
把这套链路存成模板,每个镜头只需替换 reference_image 的条件骨架和 prompt 里的动作描述,就能批量产出「同一个人」的连续镜头。建议固定 seed 做小幅微调(seed 相邻变化),而不是完全随机,这样相邻镜头之间的光影和背景也更连贯。
常见问题与排查
- 角色脸型漂移:先检查 LoRA 是否用触发词正确激活,再确认
strength_model没有低到失效(低于 0.5 基本等于没加载)。 - 姿势不对:ControlNet 强度不足或
end_percent过小,试着把strength提到 1.0、end_percent提到 0.9。 - 整张图像参考图:IP-Adapter 权重过高,降到 0.5 以下再试。
- 背景乱、人物融进背景:提高 CFG(如 8~9),或在 prompt 里明确「clean background, subject isolation」。
- 多角色场景认错人:需要给每个角色分别训练 LoRA 并分别指定触发词,参考图最好用各自的单人设定图。
总结
角色一致性是 AI 短剧从「能看」到「能追」的分水岭。今天的核心可以浓缩成一句话:LoRA 认脸、参考图定气质、ControlNet 锁姿势,三者按「脸 → 气质 → 结构」的优先级叠加,就能稳定地产出连续镜头。掌握这一套之后,你已经具备了批量生产分镜的基础能力,下一期我们正式进入 ComfyUI 的视频生成,用 AnimateDiff 让这些静态角色「动起来」。
下期预告:第 9 天《ComfyUI 视频生成——AnimateDiff 等视频节点实战》,教你如何把一致性角色从单帧变成连贯短片。
















暂无评论内容