先说结果:跟着这篇走完,你会拿到一条 40~60 秒的竖屏短视频——8 个左右的镜头、同一个主角贯穿始终、有对白和环境音、节奏对得上、可以直接发出去。整个流程不依赖任何"灵光一现"的运气,而是一套能重复用的工序:先有分镜表,再有提示词;先定音频骨架,再做画面;一次只让一个镜头动起来。
很多人用视频模型失败,不是因为模型不行,而是因为把"写提示词"当成了第一步。真正可控的做法是反过来的:先决定这条片子有几个镜头、每个镜头发生什么、谁在什么时候说话,最后才逐条去生成。
前置条件清单
- 账号与入口:能使用 Sora 2 的账号(网页端或 API 均可)。不同套餐对时长、分辨率、并发生成数的限制不一样,具体限额与参数名以官方页面为准。
- 一张分镜表:哪怕只有 8 行,写在文档或表格里都行。这是整条流程的"施工图"。
- 角色参考素材:主角的正面、侧面、半身照各 1 张,背景越干净越好。有品牌角色/固定人物时这一步是刚需。
- 剪辑软件:任何一款都行(桌面端、云端剪辑器、手机端 App 都够用)。后面给了一条 ffmpeg 的参考命令,不用也没关系。
- 命名规范与文件夹:建议从一开始就定好,否则 40 个 take 混在一起,你会找不到哪条能用的。
```
project/
storyboard.md
refs/character_front.jpg
refs/character_side.jpg
shots/s01_prompt.txt # 每个镜头的提示词原文
shots/s01_take1.mp4
shots/s01_take2.mp4
audio/vo.srt
edit/
```
步骤一:先把"想法"拆成分镜表
不要写"一个女孩在雨天便利店门口等车"这种一句话创意,那是主题不是分镜。把它拆成镜头,每行写清楚五件事:景别、主体动作、机位、场景光线、音频。
| 镜号 | 景别/机位 | 主体动作 | 场景与光线 | 音频 |
|---|---|---|---|---|
| S01 | 中景,固定 | 女孩站在便利店门口,抬头看雨 | 夜晚,店内白光外溢,霓虹反光 | 雨声 + 店内收银提示音 |
| S02 | 特写,手持微晃 | 她攥紧手里的塑料袋 | 同上,非光源在画面右侧 | 雨声持续 |
| S03 | 过肩,缓慢推近 | 一辆车从雨里驶来,停住 | 车灯扫过湿地面 | 雨声 + 引擎声由远及近 |
| S04 | 近景,固定 | 她开口说一句台词 | 车窗光打在脸上 | 台词 + 雨声 |
拆镜头有个硬性原则:一个镜头只安排一个动作。写"S01:她走进便利店、买了伞、又走出来"——模型会给你三段都不像的东西。拆成三个镜头,每个都能一次过。
生成音频的版本尤其要注意:一个镜头内的台词不要超过一句。台词越长,口型、节奏、情绪跑偏的概率越高。
步骤二:把每一行分镜翻译成提示词
提示词不需要华丽,需要结构化。用这个六要素模板,逐格填空:
```text
[主体] 20 岁出头的女孩,短发,米色风衣,右肩挎黑色帆布包
[动作] 站在便利店门口,缓慢抬头看向画面上方
[镜头] 中景,固定机位,微微仰角,画面留出上方空间
[场景与光线] 夜晚街道,便利店白光从画面左侧照出,湿地面反射霓虹
[风格] 写实,电影感,浅景深,轻微颗粒
[音频] 持续雨声,远处车流;无人声
```
一个完整的例子(S03):
```text
中景过肩镜头,女生背对镜头站在便利店门口,一把黑色雨伞靠在腿边。
一辆银灰色轿车从画面深处雨中驶来,减速,停在路边。车头灯扫过湿润的
柏油路面,形成一道反光。夜晚,便利店白光来自画面左侧。写实电影风格,
浅景深,轻微胶片颗粒,手持微晃。
音频:持续雨声,轿车引擎声由远及近,最后两秒出现刹车声,无人声对白。
```
几条实操经验:
- 用肯定句描述画面。"不要出现路人"模型理解得很差;改成"画面中只有她一个人,街道空旷"。
- 时间顺序写清楚。"先……随后……最后两秒……"比一堆形容词有用得多。
- 风格词越靠后越好,把主体和动作放最前面。
- 提示词原文存盘。同一个镜头要重生成 3 次时,你会庆幸自己存了
s01_prompt.txt。
步骤三:锁死角色一致性
这是"分镜可控"和"东拼西凑"的分界线。三个手段叠加使用:
1. 参考图 / 角色功能:上传角色照片,让模型把它当作外观依据。
2. 固定描述串:把角色外观写成一个"常量",每个镜头原样复制,一个词都不改。改一个"短发"变"齐肩发",前后两镜就不是同一个人了。
3. 首帧接力:用上一个镜头的最后一帧,或单独生成的角色定妆图,作为下一镜头的首帧输入。图生视频通常比纯文生视频稳定得多。
用代码管理这个常量会省很多事:
```python
示意代码:批量拼装提示词并保存,具体调用方式以官方文档为准
CHARACTER = "20岁出头的女孩,黑色短发,米色风衣,右肩挎黑色帆布包"
STYLE = "写实电影风格,浅景深,轻微胶片颗粒"
shots = [
{"id": "s01", "action": "站在便利店门口,缓慢抬头看向画面上方",
"camera": "中景,固定机位,微微仰角", "light": "夜晚,便利店白光来自画面左侧",
"audio": "持续雨声,远处车流,无人声"},
{"id": "s02", "action": "低头,手指攥紧手里的塑料袋",
"camera": "特写,手持微晃", "light": "同上,主光源在画面右侧",
"audio": "雨声持续"},
]
for s in shots:
prompt = "\n".join([
f"[主体] {CHARACTER}",
f"[动作] {s['action']}",
f"[镜头] {s['camera']}",
f"[场景与光线] {s['light']}",
f"[风格] {STYLE}",
f"[音频] {s['audio']}",
])
with open(f"shots/{s['id']}_prompt.txt", "w", encoding="utf-8") as f:
f.write(prompt)
print(prompt)
```
步骤四:盯住物理与连续性
模型最容易翻车的地方不是"画得不好看",而是"物理不对":雨往上飘、杯子从桌上滑到手里、车速忽快忽慢、影子方向变了。逐镜头生成时,跨镜头的连续性靠一张检查表来兜底:
| 检查项 | 看什么 |
|---|---|
| 光源方向 | 主光在左还是右,前后镜头是否一致 |
| 道具位置 | 伞在左手还是右手,包在肩上还是手里 |
| 服装状态 | 有没有突然变干、变湿、换颜色 |
| 运动速度 | 车、雨、人走路的节奏是否连贯 |
| 屏幕方向 | 人物朝左走还是朝右走(决定越轴) |
发现某一镜头物理崩了,不要试图用剪辑掩盖,直接重生成。修一个 5 秒镜头的成本,远低于观众看到"杯子穿越"后划走。
步骤五:先定音频骨架,再做画面对齐
如果生成结果带音频,最好把音频当作剪点而不是附属品。做法是:
1. 先写一张台词/音效时间表,明确每句台词落在哪个镜头、大概多长。
2. 让每个镜头只说一句台词,短句优先。
3. 生成后先单独听音频。台词含糊、节奏不对、口型对不上——直接重生成,别浪费时间剪画面。
4. 环境音要跨镜头连续(比如雨声),否则剪出来会有明显的"声音断层"。
台词表用字幕格式存,后面剪辑时可以直接当字幕用:
```srt
1
00:00:06,000 --> 00:00:08,200
车来了。
2
00:00:09,500 --> 00:00:11,800
我等了很久了。
```
步骤六:批量生成与筛选
每个镜头先生成 2~3 个 take,别一条条精雕细琢——先广撒网,再挑,效率高得多。挑片顺序:
1. 物理和手势有没有明显错误 → 有错直接弃
2. 角色像不像 → 不像直接弃
3. 动作和镜头描述是否符合 → 再看
4. 音频能不能用
留下的那条立刻重命名成 s01_final.mp4,把其余挪进 _discard/。文件夹整洁度直接决定你后面还有没有耐心剪完。
步骤七:二次剪辑
剪辑的顺序建议是先音后画:
1. 把每个 sNN_final.mp4 拖进时间线,按镜号排好。
2. 先把音频轨拼顺:台词对齐、环境音垫底、加上背景音乐。
3. 再修画面:切掉动作起手的废帧、调整节奏、必要时倒放或变速。
4. 用 J cut / L cut 让转场自然——下一个镜头的声音提前 0.3~0.5 秒进来,是最廉价的"专业感"。
5. 统一调色:跨镜头生成时色温经常会飘,套一个统一的调色预设能救回不少。
6. 加字幕,导出。
如果不想开剪辑软件,纯命令行也能拼一版粗剪:
```bash
1) 统一规格(竖屏 1080x1920、30fps、音视频参数一致)
ffmpeg -i s01_final.mp4 -vf "scale=1080:1920,setsar=1,fps=30" \
-c:v libx264 -crf 18 -pix_fmt yuv420p -c:a aac s01.mp4
对每个镜头重复上面的命令,输出 s01.mp4 s02.mp4 ...
2) 生成拼接清单
printf "file 's01.mp4'\nfile 's02.mp4'\nfile 's03.mp4'\n" > list.txt
3) 无损拼接
ffmpeg -f concat -safe 0 -i list.txt -c copy rough_cut.mp4
```
注意第一步的规格统一是必须的:分辨率、帧率、音轨采样率不一致,concat 出来的文件会花屏或者音画不同步。
常见坑与排错
| 现象 | 大概率原因 | 怎么办 |
|---|---|---|
| 人物换了张脸 | 角色描述串被改动,或没用参考图 | 把描述串当常量逐字复制;补参考图 |
| 动作做一半卡住 | 一个镜头塞了两个以上动作 | 拆镜头,一镜一动作 |
| 台词口型对不上 | 台词太长,或音频后生成 | 句子压短,先出音频再定画面 |
| 影子方向前后矛盾 | 镜头间的光线描述没统一 | 在提示词里固定"主光来自画面左侧" |
| 拼接后花屏/断续 | 各片段规格不一致 | 先统一转码再 concat |
| 画面像幻灯片 | 模型没动,或动作太含蓄 | 把动作写成"缓慢抬头""手指收紧"这类明确的动态 |
| 声音忽大忽小 | 每段环境音独立生成 | 剪辑里统一响度,加一层连续的环境底噪 |
下一步建议
- 先跑通一条 4 镜头 15 秒的片子,再扩展到 8~10 个镜头。流程才是难点,时长不是。
- 建一个自己的"提示词片段库":常用的镜头运动、光线、风格各存几条,下次直接拼。
- 准备 2~3 个固定角色,做成可以反复使用的角色素材包。系列内容的复用率会非常高。
- 记录每次重生成的原因。写满一页后你会发现,90% 的失败集中在三四个固定问题上,改掉它们,一次过的比例会明显上升。
模型能力在变,界面和参数也在变,遇到拿不准的地方,以官方页面为准。但上面这套工序——分镜表 → 结构化提示词 → 锁角色 → 查物理 → 定音频 → 批生成 → 精剪——是跟模型迭代无关的部分,换个工具照样能用。
