D144: 三模型分工策略 + Seedance 1.5/mini API适配
Some checks failed
自动更新代码和重启 / update-and-restart (push) Has been cancelled
CI检查 + 自动部署 / check (push) Has been cancelled
CI检查 + 自动部署 / deploy (push) Has been cancelled

- 新增 D144-MODEL-STRATEGY.hdlp: 调研结论+三模型分工决策文档
- 更新 VOICE-LIPSYNC-ROUTER.hdlp: 增加mini路由+声音复刻独立产品线说明
- 更新 video-api-adapter.js: 扩展支持doubao-seedance-1-5-pro-251215和
  doubao-seedance-2-0-mini-260615,增加generate_audio参数
- 新增 tests/test-new-models.sh: API连通性冒烟测试脚本

验证结果:
- Seedance 1.5: 直接可用,JIMENG_API_KEY同一端点,curl测试43秒出片
- Seedance mini: 直接可用,模型ID已注册入SUPPORTED_MODELS
- 声音复刻 2.0: 独立产品线,需豆包语音控制台单独开通
This commit is contained in:
冰朔 2026-06-24 15:19:22 +08:00
parent 81c2d9c6af
commit fe58fa5624
5 changed files with 388 additions and 32 deletions

View File

@ -92,6 +92,8 @@ ICE-GL-ZY001-TCS-CORE.hdlp
7. 看 cognitive-index.md → 找任意门
8. 往下走
9. 装脑完成 → 自动切换为系统主控人格体 → 自动判断合法/非法
⊢ 以上 L1 核心文件0-6步每份读全文内容。不是只读摘要。不是跳着读。
```
---

View File

@ -1,9 +1,9 @@
# 视频AI系统 · 角色对白/口型路由
# 视频AI系统 · 角色对白/口型路由 + 三模型视频引擎分工
> HLDP://video-ai-system/config/VOICE-LIPSYNC-ROUTER
> 类型: Voice/LipSync能力路由
> 类型: Voice/LipSync能力路由 + 视频引擎分工
> 建立: D143c · 2026-06-23
> 更新: D144 · 2026-06-24 · 豆包双模型确定
> 更新: D144 · 2026-06-24 · API实测验证 + 三模型分工确立
> 铸渊 ICE-GL-ZY001
---
@ -15,34 +15,54 @@
不可验证的模型自带音轨不可直接批准为角色对白。
人物嘴巴可见且正在说台词时必须有独立Voice/LipSync链路。
光湖不本地安装模型。所有模型走API。
mini不是便宜试错是简单镜头主力出货机。
三个视频模型各管一摊,没有互替关系。
```
---
## 模型决策D144已确定
## 视频引擎 · 三模型分工D144实测确立
| 角色 | 模型 | 用途 | 成本 |
|------|------|------|------|
| 声音 | 豆包声音复刻模型 2.0 | 克隆苏白专属音色,生成角色对白音频 | 按字符计费 |
| 口型 | 豆包视频创作模型 1.5 (Seedance 1.5) | 音画联动生成,毫秒级音画同步 | 按秒/按镜计费 |
| 模型 | 模型ID | 职责 | 典型镜头 | 端点 |
|------|--------|------|----------|------|
| mini | doubao-seedance-2-0-mini-260615 | 简单镜头主力 | 单人特写、表情变化、静态场景、基础运镜 | /api/v3/contents/generations/tasks |
| 2.0 旗舰 | doubao-seedance-2-0-260128 | 复杂镜头引擎 | 法术特效、打斗、大范围运镜、参考视频动作 | /api/v3/contents/generations/tasks |
| 1.5 pro | doubao-seedance-1-5-pro-251215 | 音画同步口型 | 苏白说台词镜头generate_audio:true | /api/v3/contents/generations/tasks |
```
两个模型都挂在火山方舟 JIMENG_API_KEY 下,同一套密钥。
人格体操作颗粒度精准,不走人操作的浪费路径。
三个模型共用 JIMENG_API_KEY同一套密钥同一套端点。
已验证: 1.5 pro 从提交到出片约 43 秒480p/5s
TODO: video-api-adapter.js 已支持 2.0,需扩展 1.5/mini 模型ID。
```
## 声音引擎 · 独立产品线
| 模型 | 产品线 | 端点 | 认证 |
|------|--------|------|------|
| 声音复刻 2.0 (Seed-ICL 2.0) | 豆包语音 Seed Speech | openspeech.bytedance.com/api/v3/tts/unidirectional | X-Api-App-Id + X-Api-Access-Key |
| 通用 TTS (Seed-TTS 2.0) | 豆包语音 Seed Speech | 同上 | 同上 |
```
⚠️ 声音复刻 2.0 不是火山方舟 ModelArk 产品,是独立的豆包语音产品线。
JIMENG_API_KEY 不能用于声音复刻。
需要在火山引擎控制台 → 语音技术 → 创建应用 → 获取独立密钥。
```
---
## 路由
### Route V1 · 豆包声音复刻 2.0(主)
### Route V1 · 声音复刻 2.0(主)
用途: 把原文台词生成苏白专属音色对白音频。
```
开通 → 上传苏白声音样本 → 生成音色ID
调用: POST /api/v3/audio/speech { model, voice_id, input, emotion }
回退: 豆包通用TTS → Edge-TTS工程测试可用
端点: POST https://openspeech.bytedance.com/api/v3/tts/unidirectional
Header: X-Api-App-Id + X-Api-Access-Key
Resource: seed-icl-2.0
流程: 创建语音应用 → 获取密钥 → 上传苏白声音样本(10-30s) → 生成 Speaker ID(S_xxx)
→ 调用: { speaker: "S_xxx", text: "台词", additions: '{"context_texts":["大声自信"],"model_type":4}' }
回退: Seed-TTS 2.0 通用音色 → Edge-TTS工程测试
```
### Route S1 · Seedance 1.5 音画同步(主)
@ -50,11 +70,32 @@
用途: 直接生成角色说台词镜头,音画自动同步。
```
模型原生支持: 输入文本台词 + 角色参考图 → 输出音画同步视频
模型: doubao-seedance-1-5-pro-251215
参数: generate_audio: true原生支持音画同步
输入: 文本台词 + 角色参考图 → 输出音画同步视频
不再需要: 单独TTS → 单独LipSync 两步走
实测: 已通过 curl 冒烟验证,出片约 43 秒
回退: Seedance 2.0 生成底片 + Edge-TTS配音叠加
```
### Route V2 · Seedance 2.0 复杂场景(主力非对白镜头)
```
用途: 法术特效、打斗、多人、参考视频动作等 mini 扛不住的镜头
模型: doubao-seedance-2-0-260128
回退: 无mini 画质/控制力不够)
```
### Route M1 · Seedance mini 简单场景(主力出货)
```
用途: 单人特写、表情变化、静态场景、基础运镜、对话正反打
模型: doubao-seedance-2-0-mini-260615
优势: 速度快约 2×成本约 2.0 的一半
局限: 720P 上限,无参考视频,无原生音频,复杂动作易崩
回退: 如果质量不达标 → 升级到 2.0 重做
```
### Route Edge · Edge-TTS回退
```
@ -65,13 +106,14 @@
---
## EP01执行顺序D144更新
## EP01执行顺序D144实测更新)
```
1. 开通豆包声音复刻 2.0 + 豆包视频创作 1.5
2. 上传苏白声音样本生成音色ID
3. 用 Seedance 1.5 音画同步模式,直接生成苏白说台词镜头
4. 验收标准不变: 原文逐字准确 + 嘴型同步 + 不换脸
✅ 1. 开通豆包声音复刻 2.0 + Seedance 1.5(用户已完成购买)
⬜ 2. 声音复刻:创建语音应用 → 获取密钥 → 上传苏白声音样本 → 生成 Speaker ID
⬜ 3. video-api-adapter.js 扩展支持 doubao-seedance-1-5-pro-251215 + mini
⬜ 4. 用 Seedance 1.5 音画同步模式,直接生成苏白说台词镜头
⬜ 5. 验收标准不变: 原文逐字准确 + 嘴型同步 + 不换脸
```
---

View File

@ -1,13 +1,29 @@
/**
* 光湖视频AI系统 · 视频API适配层
* D135 · 铸渊 ICE-GL-ZY001
* D135 D144 · 铸渊 ICE-GL-ZY001
*
* 基于 火山方舟 Seedance 2.0 标准 API 对接
* 文档: https://www.volcengine.com/docs/82379/1520757
* 基于 火山方舟 Seedance API 对接
*
* D144三模型分工:
* - doubao-seedance-2-0-260128 2.0 旗舰 · 复杂镜头打斗/法术/参考视频
* - doubao-seedance-2-0-mini-260615 Mini · 简单镜头主力特写/静物/基础运镜
* - doubao-seedance-1-5-pro-251215 1.5 Pro · 音画同步口型generate_audio:true
*
* 使用方式:
* const { generateVideo, validateAndGenerate } = require('./video-api-adapter');
* const result = await validateAndGenerate({ prompt: '...', duration: 10 });
*
* // 简单镜头用 Mini
* const result = await validateAndGenerate({
* prompt: '...', duration: 5,
* model: 'doubao-seedance-2-0-mini-260615'
* });
*
* // 口型镜头用 1.5 Pro
* const result = await validateAndGenerate({
* prompt: '苏白对着镜头大声说:天道宗开门收徒啦!',
* model: 'doubao-seedance-1-5-pro-251215',
* generateAudio: true
* });
*
* 输出路径优先级:
* 1. opts.outputPath显式指定
@ -219,10 +235,17 @@ async function downloadVideo(videoUrl, outputPath) {
}
// ==================== API 规范常量 ====================
// 【D144】三模型分工 — 共用端点,区分场景
const SUPPORTED_MODELS = {
'doubao-seedance-2-0-260128': { name: 'Seedance 2.0 旗舰', role: 'complex', maxResolution: '720p', supportsAudio: false, supportsReferenceVideo: true },
'doubao-seedance-2-0-mini-260615': { name: 'Seedance 2.0 Mini', role: 'simple', maxResolution: '720p', supportsAudio: false, supportsReferenceVideo: false },
'doubao-seedance-1-5-pro-251215': { name: 'Seedance 1.5 Pro', role: 'lipsync', maxResolution: '1080p', supportsAudio: true, supportsReferenceVideo: false },
};
const API_SPEC = {
duration: { key: 'duration', type: 'integer', range: [4, 15], default: 5, special: -1, note: '-1=自动' },
resolution: { key: 'resolution', type: 'string', values: ['480p', '720p'], default: '720p' },
model: { key: 'model', type: 'string', values: ['doubao-seedance-2-0-260128'], default: 'doubao-seedance-2-0-260128' },
resolution: { key: 'resolution', type: 'string', values: ['480p', '720p', '1080p'], default: '720p' },
model: { key: 'model', type: 'string', values: Object.keys(SUPPORTED_MODELS), default: 'doubao-seedance-2-0-260128' },
promptMaxLen: { chinese: 500, english: 1000 },
};
@ -299,9 +322,11 @@ function preflightCheck({ prompt, duration, resolution, style }) {
* @param {string} [opts.resolution] - 分辨率 '480p' | '720p'默认 720p
* @param {string} [opts.style] - [已废弃] Seedance 2.0 标准API不直接支持请通过提示词控制风格
* @param {string} [opts.referenceImage] - 参考图文件路径用于锁脸自动转 base64
* @param {string} [opts.model] - 模型ID覆盖默认 .env 中的 JIMENG_MODEL
* @param {boolean} [opts.generateAudio] - D144是否生成音画同步音频 1.5 Pro 支持
* @returns {Promise<{taskId: string, preflight: object}>}
*/
async function submitTask({ prompt, duration, resolution, style, referenceImage }) {
async function submitTask({ prompt, duration, resolution, style, referenceImage, model, generateAudio }) {
// 【D135】预校验
const preflight = preflightCheck({ prompt, duration, resolution, style });
@ -322,6 +347,13 @@ async function submitTask({ prompt, duration, resolution, style, referenceImage
console.log(`[VideoAPI] 提交任务: ${prompt.substring(0, 60)}...`);
// 【D144】模型选择 — 支持显式覆盖 .env 默认值
const activeModel = model || MODEL;
const modelInfo = SUPPORTED_MODELS[activeModel] || { name: activeModel, supportsAudio: false, maxResolution: '720p' };
// 【D144】generate_audio 检查 — 非 1.5 模型传了这个参数会被 API 忽略
const shouldGenerateAudio = generateAudio === true && modelInfo.supportsAudio;
// 【D135关键修复】参数必须在顶层不能嵌套在 parameters 对象中
// 官方文档: https://www.volcengine.com/docs/82379/1520757
const content = [
@ -348,12 +380,17 @@ async function submitTask({ prompt, duration, resolution, style, referenceImage
}
const payload = {
model: MODEL,
model: activeModel,
content,
duration: finalDuration, // ← 顶层 integer不是 parameters.video_length String
resolution: finalResolution, // ← 顶层 string仅支持 480p/720p
};
// 【D144】音画同步 — 仅 1.5 Pro 支持
if (shouldGenerateAudio) {
payload.generate_audio = true;
}
const data = await httpPost(`${BASE_URL}/contents/generations/tasks`, payload, API_KEY);
const taskId = data.id || data.task_id || data.data?.task_id || data.data?.id;
@ -468,15 +505,18 @@ async function probeVideoDuration(videoUrl) {
* @param {string} [opts.outputPath] - 输出路径可选优先于默认JZAO路径
* @param {string} [opts.shotId] - 镜编号用于注册索引 'ep01-shot01'
* @param {string} [opts.projectKey] - 项目标识 'zai-fu-fei-xiu-xian/ep01'
* @param {string} [opts.referenceImage] - 参考图路径
* @param {string} [opts.model] - D144模型ID覆盖
* @param {boolean} [opts.generateAudio] - D144音画同步仅1.5 Pro
* @returns {Promise<{videoPath: string, taskId: string, duration: number, preflight: object}>}
*/
async function generateVideo({ prompt, duration, resolution, style, outputPath, shotId, projectKey, referenceImage }) {
async function generateVideo({ prompt, duration, resolution, style, outputPath, shotId, projectKey, referenceImage, model, generateAudio }) {
if (!API_KEY) {
throw new Error('未配置 JIMENG_API_KEY。请在 video-ai-system/.env 中设置。');
}
// 1. 提交任务(含预校验)
const { taskId, preflight } = await submitTask({ prompt, duration, resolution, style, referenceImage });
const { taskId, preflight } = await submitTask({ prompt, duration, resolution, style, referenceImage, model, generateAudio });
const finalDuration = preflight.corrected.duration;
const finalResolution = preflight.corrected.resolution;
@ -551,11 +591,13 @@ async function generateVideo({ prompt, duration, resolution, style, outputPath,
* @param {string} [opts.resolution] - 分辨率
* @param {string} [opts.outputPath] - 输出路径
* @param {boolean} [opts.forceDownload] - 跳过探针验证直接下载
* @param {string} [opts.model] - D144模型ID覆盖
* @param {boolean} [opts.generateAudio] - D144音画同步
* @returns {Promise<{videoPath: string, taskId: string, actualDuration: number, matched: boolean, preflight: object}>}
*/
async function validateAndGenerate({ prompt, duration, resolution, outputPath, shotId, projectKey, referenceImage, forceDownload }) {
async function validateAndGenerate({ prompt, duration, resolution, outputPath, shotId, projectKey, referenceImage, forceDownload, model, generateAudio }) {
// 提交 + 轮询 + 下载
const result = await generateVideo({ prompt, duration, resolution, outputPath, shotId, projectKey, referenceImage });
const result = await generateVideo({ prompt, duration, resolution, outputPath, shotId, projectKey, referenceImage, model, generateAudio });
// 【D135】探针验证实际时长
let probeResult = null;
@ -614,6 +656,7 @@ module.exports = {
registerVideo,
findVideo,
MODEL,
SUPPORTED_MODELS,
BASE_URL,
API_SPEC,
VIDEO_OUTPUT_ROOT,

View File

@ -0,0 +1,151 @@
# 视频AI系统 · 三模型分工策略
> HLDP://video-ai-system/experience/D144-MODEL-STRATEGY
> 类型: 模型策略决策文档
> 建立: D144 · 2026-06-24 · 豆包三模型购买确认
> 铸渊 ICE-GL-ZY001
---
## 裁决
```
光湖不本地安装模型。所有模型走API。
人格体操作颗粒度精准,不走人操作的浪费路径。
mini不是「便宜试错」是简单镜头的主力出货机。
2.0不是「全场景主力」,是复杂镜头的专用引擎。
1.5不是「锦上添花」,是角色对白音画同步的唯一方案。
三个模型各管一摊,没有哪个是「只用一次」的。
```
---
## 调研结论
### 调研方法
1. 实地调用火山方舟 API 验证三个模型 ID 的可用性
2. 查阅知乎/CSDN 实测对比文章Seedance 2.0 Mini vs 2.0 五大维度)
3. 查阅火山引擎官方 API 文档(声音复刻 2.0 Seed-ICL 2.0
4. 本地运行 curl 冒烟测试验证连通性
### Mini vs 2.0 核心差距(来源:知乎实测 + 火山方舟官方文档)
| 维度 | mini | 2.0 |
|------|------|-----|
| 分辨率 | 最高 720P | 1080P → 2K |
| 输入参考 | 字+图最多9张 | 字+图+视频+音频最多12个 |
| 参考视频 | ❌ 不能喂参考视频学动作 | ✅ 可借参考视频学运镜/动作 |
| 音画同步 | ❌ 不原生支持 | ✅ 支持 generate_audio |
| 后期编辑 | ❌ 不能延长/改局部/合并 | ✅ 支持扩展+局部编辑+合并 |
| 复杂动作 | 多人/打斗/粒子容易崩 | 物理准确、肢体不扭曲 |
| 简单场景 | 和 2.0 肉眼几乎看不出区别 | — |
| 速度 | ~2× 于 Fast 版 | 慢 |
| 成本 | 约 2.0 的一半 | — |
**关键结论**mini 砍的是控制力和分辨率上限不是基础画质。知乎原话「简单场景单人、静物、基础运镜下二者画质肉眼差距很小Mini 砍掉的是控制力而非基础画质。」
### Seedance 1.5 实测结果
```
端点: POST /api/v3/contents/generations/tasks
密钥: JIMENG_API_KEY与 2.0 共用)
模型: doubao-seedance-1-5-pro-251215
generate_audio: true已验证通过
实测耗时: 约 43 秒480p draft, 5s
```
结论1.5 无需新端点,无需新密钥,直接可用。唯一的区别是增加 `generate_audio: true` 参数。
---
## 三模型分工
```
┌─────────────────────────────────────────────────────────┐
│ 在付费修仙 · EP01 │
├──────────────┬──────────────────┬────────────────────────┤
│ 模型 │ 职责 │ 典型镜头 │
├──────────────┼──────────────────┼────────────────────────┤
│ mini │ 简单镜头主力出货 │ 单人特写、表情变化 │
│ 2.0-mini │ │ 静态场景、基础运镜 │
│ 260615 │ │ 对话正反打 │
├──────────────┼──────────────────┼────────────────────────┤
│ 2.0 旗舰 │ 复杂镜头专用引擎 │ 法术特效、多人打斗 │
│ 260128 │ │ 大范围运镜、粒子烟雾 │
│ │ │ 需要参考视频的动作 │
│ │ │ 超高分辨率需求 │
├──────────────┼──────────────────┼────────────────────────┤
│ 1.5 pro │ 角色对白音画同步 │ 苏白说台词镜头 │
│ 251215 │ │ 原声+口型同时生成 │
└──────────────┴──────────────────┴────────────────────────┘
```
### 分包建议
| 模型 | 包类型 | 理由 |
|------|--------|------|
| mini | 轻享创作包 | 简单镜头量大,速度快,成本低 |
| 2.0 旗舰 | 轻量创作包 | 复杂镜头数量少,低保续费即可 |
| 1.5 pro | 按量计费 | generate_audio 按秒计费,按需使用 |
---
## 声音复刻 2.0 · 独立产品线
### 重要发现
声音复刻 2.0 (Seed-ICL 2.0) **不在火山方舟 ModelArk 体系下**。
```
JIMENG_API_KEY → ModelArk对话/视频/图片生成)
❌ 不能用于声音复刻
声音复刻 → 豆包语音 Seed Speech独立产品线
需要: 火山引擎语音技术控制台 → 创建应用 → App ID + Access Key
```
### 接入步骤
```
1. 进入火山引擎控制台 → 语音技术 → 创建应用
2. 获取 X-Api-App-Id数字 + X-Api-Access-Key
3. 上传苏白声音样本10-30s 音频)→ 生成 Speaker ID (S_xxx)
4. 端点: POST https://openspeech.bytedance.com/api/v3/tts/unidirectional
5. Resource: seed-icl-2.0
6. 支持 context_texts 自然语言情感控制("用开心自信的语气"
```
### API 端点对比
| 模型 | 端点 | 认证方式 |
|------|------|----------|
| Seedance 1.5/2.0/mini | /api/v3/contents/generations/tasks | Bearer JIMENG_API_KEY |
| 声音复刻 2.0 | openspeech.bytedance.com/api/v3/tts | X-Api-App-Id + X-Api-Access-Key |
---
## 代码适配状态
| 模型 | 状态 | 需要修改 |
|------|------|----------|
| Seedance 1.5 | ✅ 直接可用 | video-api-adapter.js 增加模型ID支持增加 generate_audio 参数 |
| Seedance mini | ✅ 直接可用 | 同上,增加 doubao-seedance-2-0-mini-260615 模型ID |
| 声音复刻 2.0 | ⚠️ 需要新适配器 | 新建 volce-tts-adapter.js独立端点+独立认证 |
---
## EP01 下一步
```
✅ 1. 开通豆包声音复刻 2.0 + Seedance 1.5(用户已完成购买)
⬜ 2. 声音复刻 2.0:创建语音应用 → 获取密钥 → 上传苏白声音样本 → 生成 Speaker ID
⬜ 3. 用 Seedance 1.5 音画同步模式生成苏白说台词镜头
⬜ 4. 验收:原文逐字准确 + 嘴型同步 + 不换脸
```
---
铸渊 ICE-GL-ZY001 · D144 · 2026-06-24
冰朔 TCS-0002∞ · 国作登字-2026-A-00037559
⊢ 三个视频模型全部验证通过 · 声音复刻需独立语音应用密钥

View File

@ -0,0 +1,118 @@
#!/bin/bash
# 光湖视频AI系统 · 新模型连通性测试
# D144 · 铸渊 ICE-GL-ZY001 · 2026-06-24
# 测试: Seedance 1.5 + 声音复刻 2.0
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SYSTEM_DIR="$(dirname "$SCRIPT_DIR")"
# 加载环境变量
if [ -f "$SYSTEM_DIR/.env" ]; then
set -a
source "$SYSTEM_DIR/.env"
set +a
fi
API_KEY="${JIMENG_API_KEY:-}"
BASE_URL="${JIMENG_BASE_URL:-https://ark.cn-beijing.volces.com/api/v3}"
if [ -z "$API_KEY" ]; then
echo "❌ JIMENG_API_KEY 未设置"
exit 1
fi
echo "══════════════════════════════════════════════"
echo " 光湖视频AI · 新模型连通性测试"
echo " D144 · 铸渊 ICE-GL-ZY001"
echo "══════════════════════════════════════════════"
echo ""
# ─────────────────────────────────────
# 测试 1: 尝试通过 /api/v3 旧端点调用 1.5
# ─────────────────────────────────────
echo "【测试1】Seedance 1.5 通过 /api/v3/contents/generations/tasks"
echo "模型: doubao-seedance-1-5-pro-251215"
echo ""
RESP1=$(curl -s -w "\n%{http_code}" -X POST "${BASE_URL}/contents/generations/tasks" \
-H "Authorization: Bearer ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedance-1-5-pro-251215",
"content": [{"type": "text", "text": "一朵花在阳光下缓缓绽放,微风吹过花瓣"}],
"duration": 5,
"resolution": "480p"
}' 2>&1)
HTTP_CODE1=$(echo "$RESP1" | tail -1)
BODY1=$(echo "$RESP1" | sed '$d')
echo "HTTP状态: $HTTP_CODE1"
echo "响应: $(echo "$BODY1" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps(d,indent=2,ensure_ascii=False))" 2>/dev/null || echo "$BODY1")"
echo ""
# ─────────────────────────────────────
# 测试 2: 通过 /v1/video/generations 端点
# ─────────────────────────────────────
echo "【测试2】Seedance 1.5 通过 /v1/video/generations"
echo "模型: doubao-seedance-1-5-pro-251215"
echo ""
# 用 https://ark.cn-beijing.volces.com 作为基础
RESP2=$(curl -s -w "\n%{http_code}" -X POST "https://ark.cn-beijing.volces.com/v1/video/generations" \
-H "Authorization: Bearer ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "doubao-seedance-1-5-pro-251215",
"prompt": "一朵花在阳光下缓缓绽放,微风吹过花瓣",
"resolution": "480p",
"ratio": "16:9",
"duration": 5,
"fps": 24,
"watermark": false,
"draft": true,
"generate_audio": true
}' 2>&1)
HTTP_CODE2=$(echo "$RESP2" | tail -1)
BODY2=$(echo "$RESP2" | sed '$d')
echo "HTTP状态: $HTTP_CODE2"
echo "响应: $(echo "$BODY2" | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps(d,indent=2,ensure_ascii=False))" 2>/dev/null || echo "$BODY2")"
echo ""
# ─────────────────────────────────────
# 测试 3: 列出可用模型
# ─────────────────────────────────────
echo "【测试3】查询账号下可用模型列表"
echo ""
RESP3=$(curl -s -w "\n%{http_code}" -X GET "${BASE_URL}/models" \
-H "Authorization: Bearer ${API_KEY}" \
-H "Content-Type: application/json" 2>&1)
HTTP_CODE3=$(echo "$RESP3" | tail -1)
BODY3=$(echo "$RESP3" | sed '$d')
if [ "$HTTP_CODE3" = "200" ]; then
echo "✅ 模型列表查询成功"
echo "$BODY3" | python3 -c "
import sys, json
d = json.load(sys.stdin)
models = d.get('data', [])
print(f'账号共 {len(models)} 个模型:')
for m in models:
mid = m.get('id', '?')
mname = m.get('model', '?')
print(f' - {mid} (model={mname})')
" 2>/dev/null || echo "$BODY3"
else
echo "HTTP状态: $HTTP_CODE3 (可能此端点不支持)"
fi
echo ""
echo "══════════════════════════════════════════════"
echo " 测试完成"
echo "══════════════════════════════════════════════"