做短片最怕镜头里角色第一秒还对、第三秒脸就飘了。文本生成视频(T2V)每次采样的随机性很大,连续镜头很难对上同一个脸。图生视频(I2V)加上首尾帧约束,是当前低成本锁住画面最实用的两条主线。本文把「单首帧」和「首尾帧」两条路的工程取舍讲清楚,对照公开方法(Stable Video Diffusion、SEINE 这类首尾帧条件研究),不堆参数名词。
图生视频 把一张图变成几秒
Stable Video Diffusion(SVD)把单张图片作为首帧条件,扩散出 14 到 25 帧的短视频。核心动作是把输入图编码进初始潜变量,后续帧在它的基础上演化运动,而不是从噪声凭空长出来。
python
# SVD image-to-video 最小调用示意(pipeline 来自 diffusers)
from diffusers import StableVideoDiffusionPipeline
pipe = StableVideoDiffusionPipeline.from_pretrained(
"stabilityai/stable-video-diffusion-img2vid-xt",
torch_dtype="fp16",
).to("cuda")
frames = pipe(
image=init_image, # 首帧条件:画面从这张图开始演化
num_frames=25, # 输出帧数
motion_bucket_id=127, # 运动幅度:低=稳,高=剧烈
fps=7, # 帧率
noise_aug_strength=0.1, # 输入图加噪强度
).frames[0]
motion_bucket_id 决定整段的运动量,noise_aug_strength 决定首帧保真度------想角色纹丝不动就调低 bucket。注意加噪强度调太高反而会让首帧糊掉,和直觉相反,要反着调。
首尾帧约束 给镜头钉住两端
T2V 只给一句提示词,模型自由发挥,首尾都不受控。首尾帧约束额外喂入「第一帧图 + 最后一帧图」,让生成轨迹从 A 走到 B。研究侧代表是 SEINE(storyboard-conditioned 的首尾帧条件),产品侧可灵、即梦、Pika 都开了首尾帧入口。
text
条件矩阵对比
T2V :提示词 → 任意起止帧 (随机性最高)
I2V 单首帧 :首图 → 在其上演化运动 (起帧锁死,止帧自由)
I2V 首尾帧 :首图+尾图 → 严格 A→B 过渡 (两端都锁,最适合转场/定格)
实现上,首尾帧通常被编码成两条潜变量约束,去噪网络在每一步同时被两端拉扯,中间帧自然落在插值域。代价是多一次条件编码,但省下重拍和人工修脸的时间。
锁人物 别只靠提示词
连续镜头人物崩坏,根因是每帧独立去噪、没有身份锚。实用三招:
- 用首帧做 I2V,让后续帧继承首帧人脸潜特征,而不是 T2V 重新采样。
- 人物参考图走 IP-Adapter 或人脸 LoRA,把身份投影进交叉注意力。
- 关键定格镜头用首尾帧把「出场帧」和「收尾帧」都钉死,中间交给插值。
bash
# 一条可行的工程串法:先出定妆照,再喂回 I2V
# 1) T2I 出角色定妆照
python gen_first_frame.py --prompt "角色定妆:红衣侦探,侧光" --out shot00.png
# 2) 以 shot00 为首帧做 I2V,得到该镜头的稳定运动
python i2v.py --image shot00.png --motion 96 --out clip.mp4
# 3) 若需定格转场,再补尾帧
python i2v.py --image shot00.png --last-frame shot99.png --out seg.mp4
落到流水线的参数取舍
- 运动幅度:对话、特写调低(bucket 80 到 110),追逐、爆炸调高(160 以上)。
- 帧率:7fps 够叙事,想顺滑就 12 到 24 再插帧。
- 一致性优先级:定妆照 大于 首帧 I2V 大于 首尾帧 大于 纯 T2V。
- 成本:首尾帧比单首帧多一次条件编码,但换来转场可控,总体更省。
首尾帧控制不是银弹,但它把「画面飘」从玄学变成可调参数。把定妆照和首帧固化进 I2V,再用首尾帧收口转场,是当下低成本锁住角色最稳的一条路。