最近在帮团队搭 AI 短剧测试项目时,遇到最多的需求不是“画面再精致一点”,而是“同一个角色在多个镜头里怎么能长得一样”。尤其是做《替换人生》这类带身份变换设定的短剧,角色外观的连续性直接决定成片能不能看。如果每个分镜脸都不一样,观众三秒就会出戏。
这篇文章围绕“AI 短剧中角色一致性生成与视频制作”展开,把从角色设计、分镜生成、图生视频、配音合成到成片输出的完整流程拆开讲一遍,并附上可复用的 Python 脚本和 FFmpeg 命令。适合刚接触 AI 短剧制作的创作者,也适合想把 AIGC 能力接入业务系统的开发同学参考。
1. 背景:AI 短剧与“角色替换”类创作需求
1.1 为什么 AI 短剧值得关注
传统短剧制作需要演员、摄影、场地、后期,成本高、周期长,修改一次就要重新沟通。AI 短剧把这条链路压缩成了“一个人 + 一套工具 + 一台显卡不错的主机”,创作者只需要有剧本、审美和剪辑基础,就能在几天内做出一个可发布的成片。
从实际项目反馈来看,AI 短剧的核心优势有三个:
- 成本低:不需要搭建物理场景,背景可以由模型生成。
- 迭代快:不满意直接改 Prompt 重新生成,不用重新约演员。
- 视觉上限高:可以生成现实拍摄很难实现的奇幻场景、身份切换、年代跨越等设定。
这些问题共同指向一个关键能力:角色一致性。场景可以换,镜头可以换,但角色的形象、服装、气质必须稳定。
1.2 “角色替换”类题材的技术本质
像《替换人生》这类带有角色身份替换设定的作品,技术本质其实不是“换脸”,而是“可控角色生成”。
需要做的工作包括:
- 定义角色外观:脸型、发型、服装、饰品、身材比例。
- 在不同场景和镜头角度下保持外观一致。
- 在剧情需要时让角色变化身份或换装。
- 让角色“动起来”时,五官和动作不发生严重变形。
这里面涉及的技术点包括文本生成图像、LoRA 模型微调、ControlNet 姿态控制、图生视频、数字人驱动等。下面会逐一展开。
1.3 本文适合谁,能收获什么
本文适合以下读者:
- 想做 AI 短剧但不知道从哪里开始的新手。
- 已经会用 Stable Diffusion 或 Midjourney,但角色总是“每张图都像换了一个人”的创作者。
- 想把 AI 生成能力封装成服务,接入业务系统的后端开发者。
- 需要给团队搭建 AI 内容生产流程的运营或技术负责人。
读完之后,你会掌握一条可落地的 AI 短剧制作工作流,并能自己写出批量生成素材和合成视频的脚本。
2. 整体技术方案与工具选型
2.1 一条完整的 AI 短剧生产链路
我实际跑通过一条比较稳定的生产链路,拆解如下:
剧本 → 分镜脚本 → 角色设定卡 → 图生图生成关键帧 → 图生视频 → 配音 → 字幕 → 剪辑合成 → 成片每一步都是为了减少后续改动成本:
- 剧本写不好,后续所有素材全部白费。
- 角色设定卡不统一,生成 100 张图也选不出 10 张能用的。
- 关键帧不稳定,视频生成后角色会“漂移”。
所以不要只关注工具,要先设计好流程。
2.2 开源与在线工具怎么搭配
目前主流方案有两类:
第一类:本地开源方案
以 Stable Diffusion 生态为主,可以完全自己控制模型和数据,适合需要批量生成、对隐私要求高、想要深度定制的工作室或开发者。
核心组件:
- 图像生成:Stable Diffusion WebUI 或 ComfyUI。
- 角色一致性:LoRA 模型训练。
- 图生视频:AnimateDiff 等开源扩散模型。
- 视频后期:FFmpeg。
- 配音:开源 TTS 或云端 TTS。
第二类:在线平台方案
市面上的在线视频生成平台很多,例如可灵、即梦、Vidu 等,界面和参数会持续更新,但核心操作思路类似:上传参考图 → 输入动作描述 → 生成几秒视频片段。
在线平台的优势是上手快、不需要显卡,劣势是角色一致性控制空间有限、批量生产时效率较低,而且部分平台对商用素材有额外限制。
建议的组合方式:用本地工具生成角色和图片素材,用在线平台或本地模型生成视频动态。
2.3 环境准备:硬件和基本目录
本地方案建议硬件要求:
- GPU:NVIDIA 显卡,显存建议 8GB 以上,更高显存可生成更高分辨率。
- 内存:16GB 以上。
- 硬盘:建议 100GB 以上可用空间,模型文件普遍较大。
- 操作系统:Windows、Linux、macOS 均可,但 NVIDIA 显卡在 Windows 和 Linux 下兼容性更好。
版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示配置思路。
建议的目录结构:
ai-drama/ ├── prompt/ # 角色设定卡、分镜提示词 ├── models/ # 大模型、LoRA 模型 ├── images/ # 生成的图片素材 │ ├── keyframes/ # 关键帧 │ └── refined/ # 重绘后的素材 ├── videos/ # 视频片段 ├── audio/ # 配音和背景音乐 ├── output/ # 最终成片 └── scripts/ # Python/Shell 脚本这样分类之后,素材管理会清晰很多,批量生成时也不会乱。
3. 角色设计与一致性控制
3.1 角色一致性为什么是难点
Stable Diffusion 这类扩散模型每次生成时,隐性空间中的噪声起点不同,所以同样的 Prompt 也可能得到完全不同的脸。这是角色不一致的根本原因。
解决思路有两个方向:
- 提升 Prompt 对角色特征的约束力:把角色的五官、发型、服装写得很详细。
- 引入可复用的角色特征模型:使用 LoRA 等微调技术,把角色的特征固化到一个小模型中。
实践中,单纯写 Prompt 很难完全稳定,尤其是亚洲人面孔、特定发型、特定服装。所以高效做法是“固定角色描述 + LoRA 模型 + 固定 Seed”三者结合。
3.2 用固定“角色设定卡”统一 Prompt
在实际项目中,每生成一组素材,我会先写一份角色设定卡,然后复制到每个分镜的 Prompt 中。
角色设定卡示例:
[角色卡] female character, 25 years old, long black straight hair with bangs, wearing a white blouse and black suit skirt, round face, big dark brown eyes, light skin, gentle smile, detailed face, upper body composition, studio lighting每次生成时,前面的角色部分保持不变,只改后面的动作、场景、镜头描述。
这样做的好处是:即便角色仍然有细节漂移,至少气质、发型、服装能保持一致,后期筛选和重绘压力会小很多。
3.3 使用 LoRA 固化角色外观
如果项目里同一个角色需要大量镜头,强烈建议训练一个角色 LoRA。
训练 LoRA 的大致流程:
- 收集 15~30 张角色参考图,图片要覆盖正面、侧面、不同表情和场景。
- 对参考图进行预处理,裁剪尺寸统一,例如 512×512。
- 给每张图写标签,可以用 BLIP 或 WD14 Tagger 自动打标。
- 使用 kohya_ss 或其他 LoRA 训练脚本进行训练。
- 训练完成后,将 LoRA 文件放到
models/lora目录。 - 生成图片时,在 Prompt 中触发对应 LoRA。
这里需要提醒:训练 LoRA 对新手有一定门槛,建议先把手动 Prompt 流程跑通,确认角色方案稳定之后再做 LoRA,否则很容易花很多时间训练一个不满意的模型。
3.4 多视角素材生成示例
下面是一个常见思路:先用固定角色 Prompt 生成正面全身图,再通过图生图方式生成侧面、背面和不同景别。
多视角生成时,在角色设定卡后面追加镜头描述即可:
正面全身照:full body, front view, standing, neutral pose 侧面近景:close-up, side profile view, 45-degree angle 背影:full body, back view, walking, motion blur一般来说,角色模型如果比较稳定,同一视角连续生成 4~6 张图,能选出 1~2 张可用的素材。
4. 分镜生成:从剧本到图片素材
4.1 分镜脚本怎么拆
剧本要先拆成分镜,分镜描述要尽量具体,包括:景别、人物、动作、环境、光线、氛围。
一个简单的分镜表格模板:
| 镜号 | 景别 | 人物位置 | 动作 | 场景 | 光线 |
|---|---|---|---|---|---|
| 01 | 中景 | 女主站在窗前 | 回头微笑 | 房间晨光 | 自然光 |
| 02 | 近景 | 女主坐下 | 低头看手机 | 咖啡馆 | 暖色灯光 |
| 03 | 远景 | 女主走在天桥 | 停下 | 城市夜景 | 霓虹光 |
分镜越细,生成图片时 Prompt 越好写,视频生成时动作也越可控。
4.2 文生图参数详解
以 Stable Diffusion WebUI 为例,常用参数如下:
- Prompt:角色设定卡 + 镜头描述 + 画质词。
- Negative Prompt:写不希望出现的内容,比如
lowres, bad anatomy, bad hands, extra fingers, blurry, jpeg artifacts。 - Steps:采样步数,一般 20~30,太高不一定更好。
- CFG Scale:提示词相关度,一般 7~9,太高容易色彩过饱和。
- Sampler:常用 DPM++ 2M Karras 或 Euler a,不同模型有各自的偏好。
- Size:建议先生成 512×768 或 768×1024,根据显卡调整。
- Seed:固定种子,方便复现和微调。
很多新手会忽视 Negative Prompt,但它对画面质量影响很大。例如不写bad hands,模型可能生成六根手指。
4.3 批量调用图生成 API 的 Python 示例
如果使用的是 Stable Diffusion WebUI,启动时可以加上--api参数开启 API 接口。下面是一个批量生成图片的 Python 示例。
# 文件路径:scripts/batch_txt2img.py import base64 import json import os import requests # WebUI 默认地址 API_URL = "http://127.0.0.1:7860/sdapi/v1/txt2img" # 角色设定卡,建议从文件读取,这里直接写示例 CHARACTER_CARD = ( "female character, 25 years old, long black straight hair with bangs, " "wearing a white blouse and black suit skirt, round face, " "light skin, gentle smile, detailed face" ) # 每个分镜单独定义 SCENES = [ { "name": "scene_001", "prompt": CHARACTER_CARD + ", full body, front view, standing in a bright room", "negative_prompt": "lowres, bad anatomy, bad hands, extra fingers, blurry", "steps": 25, "cfg_scale": 7.5, "width": 512, "height": 768, "seed": 20240101, }, { "name": "scene_002", "prompt": CHARACTER_CARD + ", close-up, side profile view, sitting in a cafe", "negative_prompt": "lowres, bad anatomy, bad hands, extra fingers, blurry", "steps": 28, "cfg_scale": 8, "width": 512, "height": 768, "seed": 20240102, }, ] def generate_one(scene: dict, output_dir: str): payload = { "prompt": scene["prompt"], "negative_prompt": scene["negative_prompt"], "steps": scene["steps"], "cfg_scale": scene["cfg_scale"], "width": scene["width"], "height": scene["height"], "seed": scene["seed"], } response = requests.post(API_URL, json=payload) response.raise_for_status() data = response.json() # WebUI 返回的 images 是 base64 字符串列表 for idx, img_b64 in enumerate(data.get("images", [])): img_bytes = base64.b64decode(img_b64) output_path = os.path.join(output_dir, f"{scene['name']}_{idx}.png") with open(output_path, "wb") as f: f.write(img_bytes) print(f"[OK] {output_path}") if __name__ == "__main__": os.makedirs("images/keyframes", exist_ok=True) for s in SCENES: generate_one(s, "images/keyframes")这段代码做的事情很简单:遍历场景列表,把参数 POST 到本地 WebUI,保存返回的图片。实际项目中,场景列表可以从 CSV 或 JSON 文件读取,方便批量管理。
4.4 用图生图和局部重绘修正细节
文生图直接生成的图片经常有小瑕疵,比如手部变形、面部表情不符合剧情。这时可以借助图生图或局部重绘修复。
操作思路:
- 把生成好的关键帧拖进图生图面板。
- 调整重绘幅度,一般在 0.3~0.5,太低看不出变化,太高会改变角色外貌。
- 用局部重绘涂抹需要修改的区域,例如面部、手部。
- 在 Prompt 中补充期望的细节,例如
closed mouth, natural hand pose。
遇到手部问题,最实用的建议是:先重新生成,或者换一个动作描述。局部重绘手部容易“越修越坏”,不如换图快。
5. 图生视频:让静态画面动起来
5.1 图生视频的工作原理
图生视频的基本逻辑是:给模型一张参考图,模型根据运动描述生成连续帧。常见的技术包括 AnimateDiff、视频扩散模型等。
与文生视频相比,图生视频的优点是可以严格控制起始画面的构图和角色外观,所以更适合短剧这种需要镜头衔接的创作场景。
5.2 常用生成方式与参数
在线平台通常只需要上传图片、输入动作描述、选择时长,然后等待生成。参数方面,不同平台界面差异大,但核心关注点一致:
- 动作幅度:幅度过大容易出现肢体变形,幅度过小画面看起来像幻灯片。
- 时长:短剧常用 3~5 秒一个镜头,太长容易出问题。
- 运动方向:描述清楚角色是原地动作、转身还是移动。
本地开源方案中,AnimateDiff 是常见选择。在 ComfyUI 中,核心流程通常是:
加载图片 → AnimateDiff 模块 → 正向/负向提示词 → KSampler → VAE Decode → 保存视频节点名称会随版本变化,建议到对应项目仓库查看最新工作流示例。
5.3 多镜头连贯的策略
多镜头连贯是整个流程中最“吃经验”的部分。我的经验是:
- 先确定每个镜头的起止画面。如果镜头 1 是女主站着,镜头 2 是女主坐下,那么两个镜头的关键帧必须保持服装、发型一致。
- 动作不要跨镜头。每个镜头只生成一个简单动作,复杂动作拆成两个镜头。
- 生成视频后立即检查首尾帧。首帧通常能继承参考图,尾帧最容易崩。
- 多生成几个候选。同参数多生成 3~4 个版本,从中选一个最稳定的。
6. 配音、字幕与合成输出
6.1 TTS 配音选型
短剧对配音的自然度要求比较高。目前 TTS 工具选择很多,开源方案可以做基础配音,云端方案情感更丰富。
需要注意的点:
- 语速要符合短剧节奏,一般比新闻播报稍快。
- 对话要分角色,最好给每个角色固定音色。
- 生成配音后要人工听一遍,重点关注重音和停顿是否合理。
6.2 字幕文件的自动化生成
字幕可以用语音转写工具生成。流程是:先得到配音音频,再转写文本和时间轴,最后输出 SRT 或 ASS 字幕文件。
SRT 格式示例:
1 00:00:01,000 --> 00:00:04,000 你真的要替换他的人生吗? 2 00:00:05,000 --> 00:00:08,500 我已经没有退路了。字幕文件生成后,可以在剪辑软件中导入,也可以直接通过 FFmpeg 烧录进视频。
6.3 用 FFmpeg 脚本合成成片
假设你已经有一段视频片段和一个配音文件,可以用 FFmpeg 合成:
ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -shortest output.mp4其中:
-c:v copy表示视频编码不变,直接复制,速度快。-c:a aac表示音频转成 AAC 编码。-shortest表示以较短的输入流为基准结束输出。
如果有多个视频片段,可以先合并,再合成音频:
# 先创建文件列表 list.txt # 内容示例: # file 'videos/scene_001.mp4' # file 'videos/scene_002.mp4' ffmpeg -f concat -safe 0 -i list.txt -c copy videos/concat.mp4 ffmpeg -i videos/concat.mp4 -i audio/final_audio.wav -c:v copy -c:a aac -shortest output/final.mp47. 常见问题与排查思路
7.1 高频问题排查表
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 角色每张图长得都不一样 | Prompt 不够固定,未使用角色卡 | 使用统一角色设定卡,固定 Seed,训练 LoRA |
| 生成的手部变形 | 扩散模型对手部理解能力弱 | 写 negative prompt,减少手指特写,用图生图换动作 |
| 视频生成后角色脸崩 | 动作幅度过大或参考图不清晰 | 降低动作幅度,使用高清参考图,多生成候选 |
| 视频闪烁严重 | 帧间连续性差 | 增加帧数,使用视频模型推荐的参数,减少镜头移动 |
| 显存不足 | 分辨率或帧数设置过高 | 降低分辨率,分批生成,使用模型优化选项 |
| 生成速度很慢 | GPU 太弱或参数过高 | 降低 step 数,使用更快采样器,升级硬件 |
7.2 一个“角色脸崩”的定位案例
之前测试一个分镜时,第一帧图片很正常,但生成视频后第三帧开始五官扭曲。排查过程如下:
- 先把原图单独生成一次视频,确认问题是否能复现。
- 复现后,把动作描述从“缓慢转头微笑”改成“保持静止,微眨眼”。
- 生成后画面稳定多了。
这说明问题出在动作幅度和模型能力不匹配,而不是 Prompt 错误。遇到类似情况,先简化动作再逐步增加复杂度。
8. 合规、版权与内容安全边界
8.1 素材来源与肖像授权
AI 生成内容不能完全脱离法律和版权约束,尤其是商用项目:
- 使用真实人物照片训练模型或生成形象,必须获得本人授权。
- 平台生成的素材,要确认是否允许商用、是否需要标识。
- 参考其他人作品时,不要直接模仿他人创作的人物或场景。
8.2 AI 生成内容的标识义务
目前国内对 AI 生成内容有明确的标识要求,发布平台通常会要求标注“内容由 AI 生成”。在工程实践上,建议在视频开头或简介中加入 AI 标识,不仅合规,也能避免观众误解。
8.3 技术应用底线
AI 生成内容必须用于合法合理场景,不得用于生成违法、低俗、侵权或危害他人权益的内容。技术本身是中性的,创作者和使用者需要承担对应的责任。如果你在做工具开发,建议在生成环节加入内容过滤机制,保护用户的同时也保护自己。
9. 工程化与效率提升建议
9.1 素材管理规范
短剧项目素材多且杂,文件名建议统一命名规则:
{剧名}_{集数}_{镜号}_{版本}_{生成时间}.png示例:
replace_life_s02_e01_scene001_v3_202401011200.png这样选素材、回退版本都会方便很多。
9.2 批次生成与抽帧质检流程
批量生成素材时,不要一次性生成几百张就完事。更好的流程是:
- 每个镜头先生成 4 张候选图。
- 人工选择 1 张最满意的。
- 选中的图生成 2~3 个视频候选。
- 抽帧检查首帧、中段、尾帧三个画面,确认角色没有明显变形。
批量脚本可以把“生成 → 筛选 → 返回结果”做成一个小工具,减少人工重复操作。
9.3 从本地工作流走向 API 服务化
如果你不只是做单条内容,而是要给团队或业务系统提供生成能力,建议把工作流封装成服务:
- 将 Prompt、角色配置、分镜参数统一写入配置文件。
- 通过消息队列提交生成任务,避免接口长时间阻塞。
- 生成结果写入对象存储或数据库,提供回调和任务查询接口。
- 对关键操作进行日志记录,方便定位生成失败原因。
架构不一定要复杂,先做到“配置化 + 任务化 + 可追踪”,就能比纯手动操作提升很多效率。
10. 总结与下一步学习路线
AI 短剧的制作本质上是一场“可控性”的较量。通过角色设定卡、LoRA、固定 Seed、图生视频和 FFmpeg 合成,可以搭建一条从剧本到成片的完整工作流。
建议下一步按顺序学习:
- 先掌握 Stable Diffusion 文生图和图生图,理解 Prompt 和采样参数。
- 学习 ComfyUI 的基础节点和工作流拼接。
- 开始训练一个自己的角色 LoRA。
- 尝试用图生视频生成一个 5 秒内的镜头。
- 用 FFmpeg 完成一次完整剪辑合成。
真正动手时,建议从一个 30 秒以内的剧情开始,先把全流程跑通,再逐步加长。角色一致性不可能一步到位,每多生成一批素材,就多一些筛选和修正经验。等你能稳定生成同一个角色的一组分镜,再开始扩展镜头数量。这套流程,越早跑通,后面的创作效率就越高。