单条 AI 视频做得再好,也不等于能稳定地产出一部剧。从「能生成」到「能批量生成」,中间隔的不是模型能力,而是一层数据结构。
翻车往往不在生成阶段
团队刚开始做 AI 短剧时,最常见的反馈是「角色又变了」「这个镜头跟前面接不上」。直觉反应是换模型、调提示词,但反复试下来会发现:问题出在剧本阶段压根没做结构化拆解,导致后面的提示词全靠临场发挥。
一句自然语言描述的剧本,不同的人(甚至同一个人的不同时间)会拆出完全不同的镜头序列。没有稳定的中间表示,就不可能有稳定的产出。
分镜表就是那层中间表示
把剧本先转成结构化分镜表,再让分镜表去驱动生成。一条分镜至少要有这些字段:
{
"project": "ai_short_drama_demo",
"episode": 1,
"scene_list": [
{
"scene_id": "ep01_scene01",
"role": {
"name": "男主",
"reference_image": "assets/ref/male_lead.png"
},
"shot_type": "中景",
"camera": "缓慢推进",
"lighting": "夜景冷色调",
"action": "推开仓库大门",
"dialogue": "三年了,我终于找到你了。",
"duration_seconds": 5
}
]
}
这份 JSON 有三重身份:它是给模型的提示词来源,是批量任务的参数模板,也是出问题时定位的最小单元。
角色一致性靠素材库,不靠形容词
角色一致性是 AI 短剧最大的技术难点。真人剧不存在这个问题——演员的脸是固定的。公开资料里提到,普通工具生成动态内容时,跨 10 帧以上的人物面部特征匹配度普遍不足 60%,后期逐帧修正的成本非常高。
靠每次在提示词里写「圆脸、短发、穿灰色外套」是稳不住的。比较可靠的做法是分层解决:
- 先用参考图锁定基础形象,生成角色的多角度定妆照(正脸、侧脸、半身、全身、不同表情)。
- 把定妆照作为条件输入到图生视频或工作流里,而不是每次重新描述。
- 关键角色做一致性训练,把人物特征固化到权重里。
- 批量生成时把参考图、参考姿势、场景描述一起作为输入。
换句话说,不是靠一句提示词保证一致,而是建一套「角色素材库 + 参考图」的组合方案。这一步做不好,后面每个镜头都要重来。
先有图,再动起来
不是所有镜头都适合文生视频直出。更稳的路径是「先关键帧,再补间」:先用图生图或直接生成关键帧,再把关键帧作为首帧配合描述生成短片段。这样构图、光影、人物位置都可控,批量成功率和一致性都更高。
首尾帧控制是这里最关键的技术手段。很多模型支持输入首帧和尾帧,自动补全中间运动过程,特别适合做转场、镜头推近、人物走向镜头这类常见动作。
时长上有个实用经验:人物对话场景建议控制在 5 秒左右。太长的片段生成容易崩坏,后期拼接反而更麻烦。
分镜表的工程收益
把分镜表当代码管理,会拿到几个纯提示词方案拿不到的东西:
- 可 diff:改一版剧本,能直接看出动了哪几个镜头,不用整剧重生成。
- 失败可重跑:某一条分镜生成失败,只重跑这一条,不影响其他已通过的镜头。
- 可复用:角色参考图、运镜模板、光影预设都能跨集复用,第 20 集的成本远低于第 1 集。
一个简单的重跑逻辑长这样:
def run_batch(scene_list, force_ids=None):
results = []
for scene in scene_list:
sid = scene["scene_id"]
# 已产出且没被强制重跑的直接跳过,保证批量任务的幂等
if not force_ids or sid not in force_ids:
cached = load_output(sid)
if cached:
results.append(cached)
continue
results.append(generate_one(scene))
return results
这段的关键不是生成,是跳过。批量任务跑到第 30 条崩了,重跑时不希望前 29 条再烧一遍额度。
什么时候不该上这套东西
如果是单条创意短片、一次性的视觉实验,直接写提示词更快。结构化分镜表的价值随着镜头数量增长而增长——分镜头超过十几条、或者要做多集连续内容时,它才真正回本。
先把剧本结构化,再谈后面的自动化。顺序反了,越自动化返工越快。