如何用 Claude Opus 5.5 和 Seedance 2.5 制作 AI 短片
让 Claude Opus 5.5 当导演:它写分镜和提示词,GPT Image 2.5 画角色设定图,Seedance 2.5 逐个镜头生成带声音的视频,一个 API Key 跑通全流程。
以 Markdown 阅读用 Claude Opus 5.5 和 Seedance 2.5 做短片,思路是让 Opus 当导演,画图和拍摄交给另外两个模型。你给 Opus 一个故事点子,它写出固定的角色描述、一段角色设定图提示词,以及每个镜头的视频提示词。GPT Image 2.5 把这些提示词画成角色设定图和首帧。Seedance 2.5 以这些图片为参考,逐个镜头生成带对白和声音的视频。最后把各个镜头拼成一个文件。三个模型在 SeedRouter 上用同一个 API Key 调用。下文所有请求都按 SeedRouter 的 API 文档编写,核对于 2026 年 9 月 30 日。
Claude Opus 5.5 + Seedance 2.5 的工作流是怎样的?
这个思路来自一位创作者 2026 年 9 月在 r/Seedance_AI 分享的工作流(原帖):"我一条提示词都没有手写。我给了 Opus 5.5 一个核心概念,外加几张我想要的风格参考截图。" Opus 写出了角色设定图、首帧、运镜、对白节奏和声音的提示词;GPT Image 2.5 画出角色设定图和首帧;Seedance 2.5 生成各个镜头。
每个模型只负责一件事:
| 步骤 | 模型 | 输入 | 输出 |
|---|---|---|---|
| 1. 规划 | Claude Opus 5.5 | 故事点子,可选风格参考图 | 角色描述、设定图提示词,以及每个镜头的首帧提示词和视频提示词 |
| 2. 设计 | GPT Image 2.5 | 设定图提示词,再以设定图为参考生成各镜头首帧 | 角色设定图和首帧(图片 URL) |
| 3. 拍摄 | Seedance 2.5 | 视频提示词,加上作为参考图的设定图和首帧 | 每个镜头一段带声音的视频 |
| 4. 剪辑 | ffmpeg 或任意剪辑软件 | 各镜头文件 | 完整短片 |
各步骤之间靠 URL 衔接。GPT Image 2.5 返回的图片托管在 SeedRouter 的存储上,而 Seedance 2.5 的参考图正好只收公开 URL,所以第 2 步的输出可以直接用于第 3 步,不需要下载再上传。
开始之前需要准备什么?
- SeedRouter API Key,写进环境变量:
export SEEDROUTER_API_KEY="your-key"- Python 3,并安装
requests和 Anthropic SDK:pip install requests anthropic。 - ffmpeg,最后用来拼接镜头。
- 余额。 每次调用都是一次付费请求。失败的任务不收费,新账户自带少量免费额度。
下面所有 Python 代码片段都共用这两行:
import os
import requests
HEADERS = {"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"}第 1 步:如何让 Claude Opus 5.5 规划分镜?
给 Opus 一段系统提示词,讲清楚 Seedance 2.5 如何理解提示词,并要求它以 JSON 返回规划,方便脚本直接使用。这段系统提示词里的规则来自字节跳动官方的 Seedance 提示词指南,整理在 Seedance 2.5 提示词指南 里:主体和动作放在最前,每个镜头只用一种运镜,较长的镜头按时间段拆分,参考素材按编号称呼。
import json
import anthropic
client = anthropic.Anthropic(
api_key=os.environ["SEEDROUTER_API_KEY"],
base_url="https://api.seedrouter.ai",
)
DIRECTOR = """You are the director of a short film made with AI models.
Return only JSON, no other text, in this shape:
{"character": "...", "sheet_prompt": "...",
"shots": [{"duration": 5, "frame_prompt": "...", "video_prompt": "..."}]}
character: one fixed paragraph describing the main character's face, hair,
build and clothes. Repeat it word for word inside every other prompt.
sheet_prompt: an image prompt for one character reference sheet: a front,
three-quarter, profile and back view, plus four facial expressions, on a plain
light background, with no text other than small panel labels.
shots: 3 to 5 shots, each 4 to 15 seconds.
frame_prompt: an image prompt for the first frame of the shot.
video_prompt: a video prompt for Seedance 2.5. Write it in this order: subject
and action, scene, visual style, camera, audio. Image 1 is the character sheet
and Image 2 is the start frame of the shot; refer to them by those names.
Use one camera move per shot. Say who is holding the camera and how they move.
For shots longer than 5 seconds, split the action into time ranges such as
0-3s. Put dialogue in quotes as: Character's line (emotion): content.
Describe the ambient sound. Do not ask for subtitles or on-screen text.
The character must not look like a real, identifiable person. Use a stylized
look, such as a 3D animated or illustrated character."""
message = client.messages.create(
model="claude-opus-5-5",
max_tokens=16000,
system=DIRECTOR,
messages=[{
"role": "user",
"content": "A lighthouse keeper finds a lost robot on the rocks during a storm and teaches it to wave at passing ships.",
}],
)
text = "".join(block.text for block in message.content if block.type == "text")
plan = json.loads(text)有几处细节要注意:
max_tokens包含思考部分。 Opus 5.5 始终使用自适应思考,Opus 5.5 API 文档 把思考 token 计入max_tokens。要留足空间,否则 JSON 可能被截断。- 不要传
temperature、top_p、top_k,也不要预填 assistant 回复。 采样参数不是默认值、或者预填了回复,Opus 5.5 都会返回 400 错误。想控制思考深度,改用output_config.effort。 - "谁在拿着摄像机"是原帖里的技巧。 作者说,告诉 Opus "我朋友在后座拍"之后,它会自动写出细微的手持抖动、构图反应慢半拍、自动对焦来回找焦,并称"正是这一个情境细节去掉了'AI 感'"。
- 风格参考图是可选的。 Opus 能读图,你可以在 user 消息里加入
image块(URL 来源),放上想要的画面风格截图。
如果 json.loads 报错,把 text 打印出来,再让 Opus 重写一次。在生成任何画面之前先读一遍规划,也是修改故事成本最低的时机:在这里改只花一次文本请求,生成视频之后再改就要花视频的钱。
第 2 步:如何用 GPT Image 2.5 生成角色设定图和首帧?
先把 plan["sheet_prompt"] 发给 GPT Image 2.5。然后把每个镜头的 frame_prompt 连同设定图一起作为参考图发送,这样每张首帧里都是同一个角色。图片任务提交到 /v1/images/generations,从 /v1/tasks/{id} 读取结果:
import time
def image(prompt, size, refs=()):
body = {"model": "gpt-image-2.5-flare", "prompt": prompt, "size": size, "quality": "high"}
if refs:
body["images"] = [{"image_url": url} for url in refs]
task_id = requests.post(
"https://api.seedrouter.ai/v1/images/generations",
headers=HEADERS, json=body, timeout=60,
).json()["id"]
while True:
task = requests.get(
f"https://api.seedrouter.ai/v1/tasks/{task_id}", headers=HEADERS, timeout=30,
).json()
if task["status"] == "completed":
return task["output"]["data"][0]["url"]
if task["status"] == "failed":
raise RuntimeError(task["error"]["message"])
time.sleep(3)
sheet = image(plan["sheet_prompt"], "1536x1024")
frames = [image(shot["frame_prompt"], "1792x1008", [sheet]) for shot in plan["shots"]]这样设置的原因:
1792x1008就是 16:9。 GPT Image 2.5 的size格式是WIDTHxHEIGHT,两条边都必须是 16 的倍数,所以 16:9 的画面要写出具体像素;16:9不是合法的size。它要和你之后给 Seedance 的ratio一致。- 大多数设定图用 Flare 就够了。 Sunburst 在多次编辑中控制更精准,但速度更慢;什么时候值得用它,见 GPT Image 2.5 Flare 与 Sunburst 对比。
- 打草稿时用低一点的
quality。 角色还在反复修改时,low或medium出图更快。确定要拿去拍摄的图再换成high。
为了简短,上面的函数轮询时没有设截止时间。在你自己的代码里,加上时间上限并保存任务 ID,这样中断后可以继续查询同一个任务,而不是重新付费提交。
第 3 步:如何用 Seedance 2.5 逐个生成镜头?
把每个 video_prompt 发给 Seedance 2.5,并附上两张参考图:角色设定图作为 Image 1,该镜头的首帧作为 Image 2,顺序不能错,因为 Seedance 按附加顺序给参考文件编号。视频任务用单独的端点 /v1/contents/generations/tasks,完成时状态为 status: "succeeded":
def shot(prompt, refs, duration):
content = [{"type": "text", "text": prompt}]
for url in refs:
content.append({"type": "image_url", "image_url": {"url": url}, "role": "reference_image"})
task_id = requests.post(
"https://api.seedrouter.ai/v1/contents/generations/tasks",
headers=HEADERS,
json={
"model": "dreamina-seedance-2-5",
"content": content,
"resolution": "480p",
"ratio": "16:9",
"duration": duration,
"generate_audio": True,
},
timeout=60,
).json()["id"]
while True:
task = requests.get(
f"https://api.seedrouter.ai/v1/contents/generations/tasks/{task_id}",
headers=HEADERS, timeout=30,
).json()
if task["status"] == "succeeded":
return task["content"]["video_url"]
if task["status"] in ("failed", "expired"):
raise RuntimeError(task["error"]["message"])
time.sleep(15)
videos = [shot(s["video_prompt"], [sheet, frame], s["duration"]) for s, frame in zip(plan["shots"], frames)]请求参数的考虑:
- 用参考图,而不是首帧。 Seedance 2.5 也可以把镜头锁定到精确的首帧(
role: "first_frame"),但 Seedance 2.5 API 文档 写明首帧模式"不能与参考素材同时使用",那样就用不上角色设定图了。两张图都作为reference_image时,由提示词告诉 Seedance "Image 2 是首帧"。开场会紧贴这张图,但不会逐像素一致。 - 草稿用
480p。 先把每个镜头都用 480p 生成一遍,修正效果不好的提示词,再用同样的提示词以720p或1080p渲染定稿。 generate_audio: true会根据提示词生成对白、环境音和音效,与画面一起生成。- 固定
ratio。 所有镜头的比例和分辨率一致,ffmpeg 拼接时就不需要重新编码。
一个镜头可以是 4 到 30 秒;只要提示词给每个切镜写明时间段,单个任务里也可以包含多次切镜。比如原帖作者的第二场戏,就在 10 秒内按鼓点剪了六个镜头。
如何让每个镜头里的角色保持一致?
一致性靠重复:提示词里重复,参考图也重复。
- 重复同一段描述。 第 1 步生成的
character段落要一字不差地放进每条图片和视频提示词。对同一个角色写两种不同的描述,是模型让角色走样或出现重复角色的原因之一。 - 每个镜头都发同一张设定图。 设定图永远是 Image 1。Seedance 2.5 支持多视角设定图;旧版 Seedance 2.0 可能把多角度设定图当成好几个人,提示词指南 建议给它每个角色一张脸部特写加一张全身图。
- 每次用同样的方式称呼角色,比如"来自 Image 1 的灯塔看守人",不要依赖图片里写的名字。
- 所有镜头保持同一个声音。 Seedance 2.5 最多接受 10 段参考音频(WAV 或 MP3,2 到 30 秒)。在每个镜头里附上同一段声音,并在文本里绑定,写法参照字节跳动官方示例:"Image 1 是主角 John,使用 Audio 1 的音色。"
如果两个镜头必须无缝衔接,还有第二种做法:在第一个镜头上设置 "return_last_frame": true,再把返回的 content.last_frame_url 作为下一个镜头的 first_frame。这样衔接处会被锁定,但下一个镜头就不能再用角色设定图,所以它适合同一场戏里连续的动作,不适合每次切镜都用。
可以用真人照片作为角色吗?
不可以。Seedance 2.5 不接受含有真人面孔的参考图或参考视频,带有真人面孔的任务会失败,且不收费。Seedance 真人报错 解释了字节跳动的规则,以及它在自家平台上提供的替代方案。
这同样影响写实风格的 AI 角色。原帖拍的是一位照片级写实的女性,但字节跳动的文档没有说明其人脸检测如何对待其他模型画出的写实面孔。选用风格化角色,比如上面系统提示词要求的 3D 动画或插画风格,就能避开这个不确定因素。如果你想要写实风格,先用 480p 试一个短镜头,再决定是否围绕它规划整部短片。
如何把镜头拼接成一部短片?
按顺序下载视频,把文件名写进一个文本文件,再用 ffmpeg 拼接:
names = []
for index, url in enumerate(videos):
name = f"shot-{index + 1}.mp4"
with open(name, "wb") as file:
file.write(requests.get(url, timeout=300).content)
names.append(name)
with open("shots.txt", "w") as file:
file.writelines(f"file '{name}'\n" for name in names)ffmpeg -f concat -safe 0 -i shots.txt -c copy film.mp4-c copy 拼接时不重新编码,之所以可行,是因为每个镜头的分辨率、比例和格式都相同。如果设置不一致,去掉 -c copy,让 ffmpeg 重新编码。视频 URL 托管在 SeedRouter 的存储上,想长期保存的文件请下载下来。
用 Seedance 2.5 做一部短片要花多少钱?
每个模型按各自的单位计费,当前价格见各模型页面:
- Claude Opus 5.5 按输入和输出 token 计费,包含思考部分。规划一部短片只需要一次或几次请求。价格。
- GPT Image 2.5 的 Flare 和 Sunburst 按每张交付的图片固定计价。一部短片通常是一张设定图加每个镜头一张首帧,共四到六张。价格。
- Seedance 2.5 按视频 token 计费:输出秒数 × 宽 × 高 × 24 ÷ 1024。16:9 画面每秒在 480p 下是 9,607.5 个 token,720p 是 21,600 个,1080p 是 48,600 个,且 1080p 有单独的费率。价格。
大部分费用花在视频上。480p 草稿用的 token 不到 720p 的一半,所以先用 480p 调好提示词、只在定稿时用更高分辨率渲染,是最省钱的做法。更多计算示例见 Seedance API 价格。
常见问题
Claude Opus 5.5 能自己生成视频吗?
不能。Opus 5.5 是文本模型:它能读图,但不能生成图片或视频。在这个工作流里它负责写提示词,画面和视频由 GPT Image 2.5 和 Seedance 2.5 生成。
可以用 Claude Fable 5.1 代替 Opus 5.5 吗?
可以。Fable 5.1 接受同样的 Messages 请求,把 model 改成 claude-fable-5-1 即可。三者的对比见 Claude Fable 5.1 vs Fable 5 vs Opus 5.5。
用 Seedance 2.5 做的短片最长能有多长?
单个 Seedance 2.5 任务可以生成 4 到 30 秒,或用 duration: -1 让模型自己决定时长。更长的短片由多个镜头拼接而成,所以总时长没有固定上限。
为什么角色在不同镜头之间变样了?
通常是因为各条提示词对角色的描述不一致、部分镜头漏了设定图,或者参考文件的附加顺序和提示词里的编号对不上。检查每条视频提示词是否都包含同一段角色描述,以及设定图是否始终是第一张图。
这个工作流可以用 Seedance 2.0 吗?
可以,请求结构相同,换成它自己的模型 ID 即可。关于角色设定图,给 Seedance 2.0 分开的脸部图和全身图,不要用一张多视角设定图。其他差异见 Seedance 2.5 与 2.0 对比。
做你的第一部 AI 短片
从一个三镜头的故事开始,先用 480p 生成并检查每个镜头,再用更高分辨率渲染最终版本。Seedance 2.5 页面 有当前价格和可以测试单个镜头的 Playground,完整的请求参数见 Seedance 2.5 API 文档、GPT Image 2.5 API 文档 和 Claude Opus 5.5 API 文档。



