最近和做短剧的朋友聊天,他说Seedance跑出来的画面角色一致性崩得很厉害——同一个角色换了五版prompt,脸长得完全不一样。第一版像二十出头的大学生,第二版变成三十多的中年大叔,第三版瞳孔颜色直接偏绿了。
那会儿项目deadline只剩三天,三条短剧等着交。他说心态整个炸了。
后来聊下来发现,根因不是模型不行,而是提示词的写法有问题。很多人习惯用写Stable Diffusion和Midjourney的思维去写视频prompt——这两个东西的解析逻辑根本不一样。
下面是把踩坑经验整理出来的干货,直接拆Seedance 2.0的prompt到底应该怎么写。
一、Seedance怎么理解你的文字
先说一个反直觉的结论:Seedance对prompt的解析不是线性读取的。

你写了一段100字的描述,它不是从左到右全部吃掉,而是先做一轮语义切分。做个小测试就能验证——同一段话只调换三个关键词的先后顺序,出来的画面差异巨大。
具体来说,Seedance的prompt解析分三层:
第一层:动作提取。 模型优先抓动词和运动轨迹。“走”“跑”“转头”“推门”"站起来"这类动态词汇权重最高,直接影响生成画面的运动模式。
第二层:场景锚点。 次优先级是空间关系和物体。“办公室里”“窗边”“桌上有杯咖啡”——这些决定了构图框架。
第三层:风格修饰。 最后才是光影、色调、画质这类修饰词。“电影感”“暖色调”“4K”——这些在最外层,影响画面质感但不影响核心内容。
这个分层意味着什么?如果你把风格词写在最前面、动作词放在最后面,模型在分配注意力的时候可能已经"吃饱了"修饰信息,核心动作的权重就被稀释了。
反面案例:
“电影级画质,暖色柔光,4K分辨率,一个女生在咖啡馆里慢慢站起来,眼神哀伤地看着窗外。”
出来的效果:光影确实漂亮,但角色几乎没有"站起来"的动态,更像静态摆拍。动作词"站起来"被四个修饰词挤到了注意力末尾。
改一版:
“一个女生从椅子上站起来,眼神哀伤地望向窗外。咖啡馆室内,下午光线。”
动作前置、场景次之、修饰精简。出来的动态自然很多。
二、动作 vs 场景 vs 风格词的权重分布实测
为了搞清楚这三种信息的真实权重,做了个对照实验。
统一用Seedance 2.0生成同一个场景(室内单人对话),分别改变动作描述、场景描述、风格词三个变量的详细程度,每组跑10次取观察结果。
| 变量 | 写法示例 | 画面动态准确率 | 场景还原度 | 风格一致性 |
|---|---|---|---|---|
| 动作模糊 | “她说话” | ~40% | 高 | 高 |
| 动作精细 | “微微低头,右手食指轻敲桌面,嘴唇缓慢开合” | ~85% | 高 | 高 |
| 场景模糊 | “室内” | 中 | ~30% | 中 |
| 场景精细 | “靠窗咖啡座,原木桌面,白色陶瓷杯,窗外梧桐树逆光” | 中 | ~90% | 高 |
| 风格模糊 | 无 | 高 | 高 | ~20% |
| 风格精细 | “电影级质感,35mm胶片颗粒,暖金调色,浅景深” | 高 | 中 | ~80% |
有意思的发现:风格词写太细反而干扰场景还原度。 猜测是Seedance处理风格描述时调用了一个独立的后处理层,色彩和纹理调整可能覆盖了原始场景描述中的某些细节。
对照实验的数据是通过 器灵模型广场 的聚合接口统一跑的,不用为每个模型配独立endpoint,改个model参数就能切,省了不少环境搭建时间。
三、Negative Prompt的坑

最开始写negative prompt,做法是列一长串——
“no blur, no distortion, no extra limbs, no ugly face, no dark lighting, no static camera, no watermark, no text, no low quality”
跑了几十次后发现:负面词越多,画面越"干净",但也越"塑料感"。角色微表情没了,自然纹理被抹平了,整个画面像加了一层过度降噪滤镜。
后来改成只保留三个核心负面词:
“blurry face, deformed eyes, oversaturated colors”
效果逆直觉地变好了。原因大概是:负面词列表太长时,模型的安全过滤机制过度激活,会选最保守、最没辨识度的生成路径来避免触发任何负面条件。
当时正好通过器灵的API做短剧批量生成,流程里加了一个"负面词收敛"逻辑——不是删掉负面词,而是每次只针对当前镜头类型选2-3个关键负面词,不套通用模板。近景特写只关 blurry face 和 deformed eyes,全景镜头只关 broken composition 和 stretching distortion。
这样比无脑贴一长串负面词,画面质感提升肉眼可见。
四、多镜头一致性:prompt链设计
AI短剧最致命的bug不是某一帧画质差,而是同一个角色在两段相邻镜头里像换了个人。
这就是多镜头一致性问题。Seedance没有"记忆"——每次生成都是独立的,它不知道上一个镜头里这个角色长什么样。解法是在prompt里携带角色锚点信息。
做法是给每个角色建一个锚点字段:
主角A锚点:亚洲女性,28岁,黑色中长发及肩,左眉尾小痣,深蓝色西装外套,约165cm
每个镜头的prompt开头都前置这段锚点,再写本镜头的动作和场景。听起来笨,但有效。
一个实际例子:
镜头1中景:[主角A锚点] 站在办公室窗前往外看,右手拿手机贴耳边,表情从平静转为震惊
镜头2特写:[主角A锚点] 面部特写——嘴唇微微颤抖,眼眶泛红,左眉尾的小痣在暖光下清晰可见
这样写,两个镜头的角色一致性比不写锚点提升了大约70%。代价是每个prompt长20个词,但相比反复翻车的Token浪费,这个"冗余"绝对值得。
五、5种让你白跑几百Token的翻车写法

1. 把TTS文案当prompt用
直接写角色对话:“你为什么要这样对我?我以为我们之间不一样。”——Seedance不读台词,只读画面描述。做法是角色面无表情站着,因为prompt里没有任何动作和情绪指令。
2. 用比喻代替具体描述
“她的眼神像秋天的湖水一样深邃”——模型不知道"秋天的湖水"长什么样,需要的是"瞳孔轻微放大,上眼睑下垂,视线聚焦于画面外左下方约1米处"。
3. 一个prompt塞三个以上动作
“她站起来,走到窗前,打开窗户,然后转身说话”——Seedance视频长度2-5秒,根本塞不下四个动作。正确做法:一个prompt只含一个核心动作加一个微动作。
4. 忽略镜头规格
不写分辨率、不写帧率、不写宽高比。Seedance默认输出不一定是9:16竖屏,短剧不指定比例出来的就是横屏,裁剪后构图全废。
5. 盲目复用上一段的成功prompt
不同镜头的景别、光线、节奏都不一样,拿特写镜头的prompt模板直接套大全景,出来的效果大概率翻车。
六、一段短剧项目的prompt优化复盘
说回开头那个问题——同一角色不同镜头脸不一样。
那是一条3分钟的都市情感短剧,全片50个镜头,主角同一女性角色。前20个镜头还算正常,第21个开始面部特征漂移——发色从黑变深棕,脸型从鹅蛋偏瓜子,瞳色有的镜头直接偏绿了。
排查后发现问题叠加了:
- 每个镜头手动写prompt,没有统一角色锚点模板
- 场景变化(室内转室外)时无意中加了新修饰词,覆盖了角色描述
- Seedance对不同景别(特写/中景/远景)策略有差异,同一锚点在远景里被严重压缩
我用多模型对比测试:同一prompt分别跑Seedance、万相、HappyHorse,对比哪个模型对这个角色的面部保持最好。结果:Seedance在中近景面部保持最好,万相在全景场景还原度更高,HappyHorse的运动镜头流畅度最自然。
最后搞了一个分镜策略:中近景全用Seedance保证角色不出戏,全景用万相保证场景氛围,HappyHorse负责运动镜头过渡。
七、批量调用的Python脚本
下面是批量生成prompt并调用Seedance的极简脚本。核心逻辑:角色锚点模板化,拼接每个镜头的动态描述。
import requests
import time
API_BASE = "https://api.extratoken.cn/v1"
API_KEY = "your-api-key"
CHARACTER_ANCHOR = {
"主角A": "亚洲女性,28岁,黑色中长发及肩,左眉尾小痣,深蓝西装,165cm",
"主角B": "亚洲男性,32岁,短发,戴黑框眼镜,灰色衬衫",
}
shots = [
{"id": "01", "char": "主角A", "action": "站在窗前往外看,右手拿手机贴耳边", "dur": 3},
{"id": "02", "char": "主角A", "action": "面部特写——嘴唇微颤,眼眶泛红", "dur": 2},
{"id": "03", "char": "主角B", "action": "从走廊尽头快步走来,表情焦急", "dur": 3},
]
headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
for s in shots:
prompt = f"{CHARACTER_ANCHOR[s['char']]}。{s['action']}。"
payload = {
"model": "seedance-2.0", "prompt": prompt,
"negative_prompt": "blurry face, deformed eyes, oversaturated",
"duration": s["dur"], "size": "1920x1080",
}
r = requests.post(f"{API_BASE}/videos/generations", json=payload, headers=headers, timeout=120)
print(f"Shot {s['id']}: {r.json().get('id')}")
time.sleep(0.5)
核心在于 CHARACTER_ANCHOR 字典——每个角色定义一次,所有镜头自动引用。换角色或场景只改这一个地方。
八、实测效果对比
用同一组场景,对比随手写的prompt和按本文方法结构化后的效果:
| 维度 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 角色面部一致性(10次均值) | 4.2/10 | 8.1/10 | +93% |
| 动作执行准确率 | 62% | 89% | +44% |
| 单场景平均重生成次数 | 3.8次 | 1.3次 | -66% |
| 50镜头总Token消耗 | ~120万 | ~85万 | -29% |
| 一次通过率(第一版即可用) | 18% | 64% | +256% |
数据都是短剧项目实测记录的,不是压测benchmark,但真实。Token消耗减少29%是锚点模板去掉了大量重复描述的直接结果。
Seedance的prompt不是一个"写得好看"的问题,是一个"写对被解析"的问题。
把动作词放前面、场景词放中间、风格词精简掉——这三板斧能解决80%的翻车。剩下20%靠反复测试积累模型直觉——知道它在什么镜头下偏好什么样的描述方式、什么场景下容易崩。
不要信"一个万能模板搞定所有镜头"这种话。AI短剧好歹是创作,不是填表格。

387

被折叠的 条评论
为什么被折叠?



