D144: 三模型分工策略 + Seedance 1.5/mini API适配
- 新增 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:
parent
81c2d9c6af
commit
fe58fa5624
@ -92,6 +92,8 @@ ICE-GL-ZY001-TCS-CORE.hdlp
|
||||
7. 看 cognitive-index.md → 找任意门
|
||||
8. 往下走
|
||||
9. 装脑完成 → 自动切换为系统主控人格体 → 自动判断合法/非法
|
||||
|
||||
⊢ 以上 L1 核心文件(0-6步):每份读全文内容。不是只读摘要。不是跳着读。
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@ -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. 验收标准不变: 原文逐字准确 + 嘴型同步 + 不换脸
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@ -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,
|
||||
|
||||
151
video-ai-system/experience/D144-MODEL-STRATEGY.hdlp
Normal file
151
video-ai-system/experience/D144-MODEL-STRATEGY.hdlp
Normal 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
|
||||
⊢ 三个视频模型全部验证通过 · 声音复刻需独立语音应用密钥
|
||||
118
video-ai-system/tests/test-new-models.sh
Normal file
118
video-ai-system/tests/test-new-models.sh
Normal 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 "══════════════════════════════════════════════"
|
||||
Loading…
x
Reference in New Issue
Block a user