字节跳动 Seedance 2.0 视频生成模型(含虚拟人 / 真人形象素材接口),通过 SalpX 统一 base_url 调用。固定时长按次计费、自动失败退款、OpenAI SDK 兼容。
SalpX 把 Seedance 2.0 包装为固定时长 / 按次计费的产品,方便对接而无需理解秒计费。
https://www.salpx.com/v1Authorization: Bearer <SalpX Token>POST /v1/videosGET /v1/videos/{task_id}/v1/videos/doubao-seedance-2-0/private-avatar/*、/real-avatar/*task_id,需轮询查询状态SalpX 把秒级计费的 Seedance 2.0 包装成"固定时长 + 按次"产品:模型名末尾的 -10s / -15s 决定生成时长,价格也按这个固定。
t2v=文生视频 i2v=图生视频 mm=多模态 avatar=形象素材专用
| 模型 | 类型 | 清晰度 | 时长 | 价格 (USD) |
|---|---|---|---|---|
seedance-2-10s | t2vi2vmm | 720p (默认) | 10s | $10.80 |
seedance-2-15s | t2vi2vmm | 720p (默认) | 15s | $16.20 |
seedance-2-480p-10s | t2vi2vmm | 480p | 10s | $5.40 |
seedance-2-480p-15s | t2vi2vmm | 480p | 15s | $8.10 |
| 模型 | 类型 | 清晰度 | 时长 | 价格 (USD) |
|---|---|---|---|---|
seedance-2-fast-10s | t2vi2vmm | 720p (默认) | 10s | $8.64 |
seedance-2-fast-15s | t2vi2vmm | 720p (默认) | 15s | $12.96 |
seedance-2-fast-480p-10s | t2vi2vmm | 480p | 10s | $4.32 |
seedance-2-fast-480p-15s | t2vi2vmm | 480p | 15s | $6.48 |
| 模型 | 类型 | 说明 | 时长 | 价格 (USD) |
|---|---|---|---|---|
doubao-seedance-2-0-10s | t2vi2vavatar | 支持引用 avatar 素材(asset://<ASSET_ID>) | 10s | $10.80 |
doubao-seedance-2-0-15s | t2vi2vavatar | 同上 | 15s | $16.20 |
curl https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2-fast-10s", "prompt": "一只蓝色果冻水母在霓虹海中游动,电影感", "aspect_ratio": "16:9" }'
返回:
{
"task_id": "task_BbdMw8n5VowzJLgQbZA1MRNB2qoDYCJS",
"object": "video",
"model": "seedance-2-fast",
"status": "",
"progress": 0,
"created_at": 1781705051
}curl https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2-15s", "prompt": "镜头从首帧平滑过渡到尾帧,光影摇曳", "metadata": { "content": [ {"type":"image_url","image_url":{"url":"https://your-cdn.com/first.jpg"},"role":"first_frame"}, {"type":"image_url","image_url":{"url":"https://your-cdn.com/last.jpg"},"role":"last_frame"} ] } }'
媒体一律放 metadata.content,每项带 role。图生视频 role:first_frame(首帧)/ last_frame(尾帧)。只做首帧图生视频则单张 first_frame 即可。文本必须放顶层 prompt,不要写进 content。
模型 seedance-1-5-pro:时长 duration 可指定 4–12 秒(按秒计费),分辨率 480p/720p/1080p@24fps,可加 "audio": true 生成原生音频(含 8 语种口型)。首尾帧结构与上面完全一致——放 metadata.content,用 first_frame / last_frame 标 role(不是 image_with_roles)。
curl https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-1-5-pro", "prompt": "画面从白天渐变到夜晚,城市灯光逐盏亮起,电影感运镜", "duration": 8, "resolution": "1080p", "aspect_ratio": "9:16", "audio": true, "metadata": { "content": [ {"type":"image_url","image_url":{"url":"https://your-cdn.com/day.jpg"},"role":"first_frame"}, {"type":"image_url","image_url":{"url":"https://your-cdn.com/night.jpg"},"role":"last_frame"} ] } }'
只做首帧则单张 first_frame;duration 越大费用越高(按秒)。任务查询、报错处理与 Seedance 2.0 一致,见 3.5 / 3.7。
Seedance 2.0 可同时参考图片、视频、音频。全部放 metadata.content,role 用 reference_image / reference_video / reference_audio;提示词里用「图片1」「视频1」「音频1」引用(序号=同类素材出现顺序,从 1 起)。
curl https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2-15s", "prompt": "首帧用图片1,全程用视频1的运镜、音频1作背景乐……", "metadata": { "content": [ {"type":"image_url","image_url":{"url":"https://.../pic1.jpg"},"role":"reference_image"}, {"type":"video_url","video_url":{"url":"https://.../v1.mp4"},"role":"reference_video"}, {"type":"audio_url","audio_url":{"url":"https://.../a1.mp3"},"role":"reference_audio"} ], "generate_audio": true } }'
asset://<ASSET_ID>。素材由上游(火山方舟)下载并校验,不合规会返回 400 · InvalidParameter(原样透传)。常见硬性要求:
| 类型 | 要求 |
|---|---|
| 图片 最小边 | 宽、高均 ≥ 300px(实测:1073×152 因高度 152px<300 被拒 expected the height to be at least 300px) |
| 图片 宽高比 | 不要极端横幅/长条(如 7:1);建议贴近目标视频比例 16:9 / 9:16 / 1:1,可减少画面跳变 |
| 图片 格式 | 常见 JPEG / PNG / WEBP |
| URL | 需公网可直接下载(或用火山素材 asset://<ASSET_ID>);私有/需登录/防盗链的 URL 会下载失败 |
| 视频 / 音频 | 视频 ≤3 个、音频 ≤3 个;单个/总时长与格式限制以火山为准 |
curl https://www.salpx.com/v1/videos/<task_id> \ -H "Authorization: Bearer $KEY" # 完成时返回示例: { "task_id": "task_...", "status": "SUCCESS", "results": [ {"url": "https://cdn.toapis.com/videos/abc.mp4"} ] }
约定:文本放顶层 prompt;媒体与火山参数放 metadata。
| 参数 | 位置 | 必填 | 说明 |
|---|---|---|---|
model | 顶层 | 是 | 模型名(决定时长 / 分辨率 / 是否 fast) |
prompt | 顶层 | 是 | 文本描述(中英文均可)。素材用「图片1/视频1/音频1」引用 |
metadata.content | metadata | 否 | 媒体数组:每项 {"type":"image_url|video_url|audio_url","<type>":{"url":"..."},"role":"..."}。role 见 3.2 / 3.3 |
metadata.ratio | metadata | 否 | 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 / adaptive |
metadata.generate_audio | metadata | 否 | 是否同步生成音轨(有声视频) |
metadata.watermark / metadata.seed | metadata | 否 | 水印 / 随机种子 |
callback_url | 顶层 | 否 | 异步完成回调(webhook) |
duration / resolution:由模型名锁定(如 -fast-480p-10s = 10 秒 + 480p)。传了会被服务端忽略。多模态组合非法时,SalpX 在转发火山前直接返回清晰中英 400,不会暴露火山原始报错:
| 命中情况 | code | 报错信息 |
|---|---|---|
| 参考图 > 9 | too_many_reference_images | 参考图最多 9 张 / at most 9 reference images |
| 参考视频 > 3 | too_many_reference_videos | 参考视频最多 3 个 / at most 3 reference videos |
| 参考音频 > 3 | too_many_reference_audios | 参考音频最多 3 个 / at most 3 reference audios |
| 纯音频 / 仅文本+音频 | invalid_audio_only_input | 音频须搭配至少一张参考图或一个参考视频 / audio must be accompanied by an image or video |
用 Seedance 2.0 引用固定形象(虚拟人 / 真人)生成视频时,需要先把素材上传到 TA 侧拿到 ASSET_ID,然后在视频生成时用 asset://<ASSET_ID> 引用。
| 步骤 | 方法 | 路径 |
|---|---|---|
| ① 建素材组 | POST | /v1/videos/doubao-seedance-2-0/private-avatar/groups |
| ② 上传素材 | POST | /v1/videos/doubao-seedance-2-0/private-avatar/assets |
| ③ 查询状态 | GET | /v1/videos/doubao-seedance-2-0/private-avatar/assets/{asset_id} |
| ④ 引用生成 | POST | /v1/videos 用 asset://<ASSET_ID> |
curl https://www.salpx.com/v1/videos/doubao-seedance-2-0/private-avatar/groups \ -H "Authorization: Bearer $KEY" \ -d '{"name": "my-avatars", "description": "..."}' # → {"data":{"group_id":"pg_01KVAZH..."},"success":true}
curl https://www.salpx.com/v1/videos/doubao-seedance-2-0/private-avatar/assets \ -H "Authorization: Bearer $KEY" \ -d '{ "group_id": "pg_01KVAZH...", "asset_type": "image", "source_url": "https://your-cdn.com/portrait.jpg", "name": "actor-A" }' # asset_type: "image" | "video" | "audio" # → {"data":{"asset_id":"ast_..."},"success":true} # 进入异步处理:状态依次 processing → active 或 failed
curl https://www.salpx.com/v1/videos \ -H "Authorization: Bearer $KEY" \ -d '{ "model": "doubao-seedance-2-0-10s", "prompt": "图片1中的人物在咖啡馆里微笑挥手", "metadata": { "content": [ {"type":"image_url","image_url":{"url":"asset://ast_01KV..."},"role":"reference_image"} ] } }'
跟虚拟人接口几乎相同,前面多一步认证(KYC)流程:
| 步骤 | 方法 | 路径 |
|---|---|---|
| ① 发起认证任务 | POST | /v1/videos/doubao-seedance-2-0/real-avatar/verify-tasks |
| ② 查认证任务 | GET | /v1/videos/doubao-seedance-2-0/real-avatar/verify-tasks/{task_id} |
| ③ 查认证结果 | GET | /v1/videos/doubao-seedance-2-0/real-avatar/verify-results |
| ④ 上传素材 | POST | /v1/videos/doubao-seedance-2-0/real-avatar/assets |
| ⑤ 查素材状态 | GET | /v1/videos/doubao-seedance-2-0/real-avatar/assets/{asset_id} |
| ⑥ 引用生成 | POST | /v1/videos |
byted_token,result_code:"10000" 表示通过。具体认证字段(callback_url / locale)请参考 TA 原始文档。
POST /v1/videos 引用素材生成视频时按 doubao-seedance-2-0-* 计费。
| HTTP | 含义 | 是否扣费 |
|---|---|---|
| 400 | 请求参数错误(模型名不存在、缺必填) | 不扣 |
| 401 | Token 无效 | 不扣 |
| 403 | 额度不足 | 不扣 |
| 500 | 上游连接层失败 | 已扣→自动退款 |
| 502 | 上游返回错误 / 异步任务 FAILED | 已扣→自动退款 |
| 504 | 异步任务超时(>20 分钟) | 已扣→自动退款 |
-10s / -15s 两个固定时长?SalpX 主线计费体系是"按次",TA 是"按秒"。为了避免按秒计费的额度复杂度,我们把每个模型拆分成 10 秒 / 15 秒两个 SKU,每次按 SKU 价格扣费。
-480p-* 比 -720p-* 便宜一半?TA 上游成本 480p ≈ 720p 的 50%。SalpX 价格沿用 "上游成本 × 1.2" 公式,所以 480p 卖价也大致是 720p 的一半。
seedance-2 不带后缀)?不能。SalpX 后台只识别带时长 / 分辨率后缀的 SKU,裸模型名会返回 404 model_not_found。
三种方式任选其一:
GET /v1/videos/{task_id} 看 statuscallback_url,任务完成 TA 自动 POST 通知TA 默认保留 7 天。强烈建议拿到 URL 后立刻下载入自己的 OSS,不要长期引用 TA URL。
# pip install openai requests import requests, time API = "https://www.salpx.com/v1" KEY = "sk-..." H = {"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"} # 1. 提交任务 r = requests.post(f"{API}/videos", headers=H, json={ "model": "seedance-2-fast-10s", "prompt": "霓虹城市夜景", "aspect_ratio": "9:16", }) tid = r.json()["task_id"] print("submitted:", tid) # 2. 轮询 for _ in range(120): # 最多 10 分钟 time.sleep(5) s = requests.get(f"{API}/videos/{tid}", headers=H).json() if s.get("status") == "SUCCESS": print("video:", s["results"][0]["url"]) break if s.get("status") == "FAILED": raise RuntimeError(s)
批量定价 / 企业额度 / 私有部署 → 联系 SalpX 商务(控制台 → 个人设置 → 联系我们)。