大易个人语音合成
音色配置
| 项目 | 值 |
|---|---|
| API Key | fc029d08-ddeb-4a96-9c7a-014e8ef19a74 |
| Speaker ID | S_Zaze8Ci72 |
| 引擎 | 声音复刻 2.0(seed-icl-2.0) |
| API基础地址 | https://openspeech.bytedance.com |
| APP ID | 4704327718 |
用法
加载本技能后,直接说:
> 合成:我是易寰,从今天开始我的命运会发生改变
如需调节语速,说:
> 合成:文本内容,语速慢一点
如需指定语速值,说:
> 合成:文本内容,语速-30
合成接口(新版 req_params 格式)
接口: POST /api/v3/tts/unidirectional
请求头(必填):
- X-Api-Key — API Key
- X-Api-Resource-Id — 固定值 seed-icl-2.0
- X-Api-Request-Id — UUID,每个请求唯一,不能省略
Payload 格式(新版,必须用 user/req_params 结构):
payload = {
"user": {"uid": "dayi"},
"req_params": {
"text": "要合成的文本",
"speaker": "S_Zaze8Ci72",
"audio_params": {
"format": "mp3",
"sample_rate": 24000
}
}
}
响应是流式的(chunked JSON),必须用 stream=True + iter_content 读取:
session = requests.Session()
response = session.post(url, headers=headers, json=payload, stream=True, timeout=60)
audio_data = b""
for chunk in response.iter_content(chunk_size=None):
if chunk:
try:
data = json.loads(chunk.decode('utf-8'))
if 'data' in data and data['data']:
audio_chunk = base64.b64decode(data['data'])
audio_data += audio_chunk
except:
pass
注意: 新版 API 流式读取,数据字段名是 data(base64编码),直接拼接即可。
语速/情感调参(实测校准数据)
| 参数 | 位置 | 说明 | 建议值 |
|---|---|---|---|
| 语速 | req_params.audio_params.speech_rate |
[-50, 100],负值变慢正值变快 | 0 正常 |
| 音量 | req_params.audio_params.loudness_rate |
[-50, 100] | 0 正常 |
| 音调 | 当前版本不支持 | — | — |
⚠️ 重要:时长非确定性(2026-07-01 实测发现)
豆包语音合成引擎每次请求存在±3秒的随机时长差异。相同文案、相同参数、重复请求,时长相异。 不要依赖经验校准表做精确时长预估——它反映单次测试趋势,不保证每次一致。
最佳策略: 固定 speech_rate=0(正常语速),通过调整文案字数来控制时长。每次合成后校验实际时长。
长文本时长参考(speech_rate=0):
| 含标点字数 | 实测时长范围 |
|---|---|
| ~130字 | 28-31秒 |
| ~160字 | 36-40秒 |
| ~195字 | 38-42秒 |
| ~200字 | 42-45秒 |
经验值: 目标40秒口播 → 190-200字(含标点)文案,speech_rate=0。字数增减20字对应约±4秒。
实测样本(2026-07-01,同一195字文案,两次请求):
- 请求1: 38.9秒
- 请求2: 42.0秒
- 均值: ~40.5秒(±1.6秒)
声音复刻训练(音色克隆)
接口: POST https://openspeech.bytedance.com/api/v3/tts/voice_clone
请求头: 同合成接口(X-Api-Key + X-Api-Request-Id),不需要 X-Api-Resource-Id
后付费模式 payload:
{
"speaker_id": "custom_speaker_id", // 固定值,必须传
"custom_speaker_id": "dayi_koubo", // 自定义音色代号
"language": 0, // 0=中文
"audio": {
"data": "base64编码的音频数据",
"format": "wav"
},
"extra_params": {
"demo_text": "可选的试听文本"
}
}
常见错误码:
| 状态码 | code | message | 原因 | 解决 |
|---|---|---|---|---|
| 400 | 45000000 | error extract basicHttpRoutingPreference missing X-Api-Request-Id | 缺少请求头 X-Api-Request-Id |
加上UUID |
| 403 | 45000030 | requested resource not granted | 后付费资源未开通 | 去火山引擎控制台开通声音复刻2.0后付费 |
| 500 | 55000000 | resource ID is mismatched | Resource ID 与音色不匹配 | 检查 X-Api-Resource-Id 是否正确 |
| 400 | 45001109 | WERError | 音频与text字段文本差异过大 | 确认text与实际念诵文本一致 |
extra_params 可选参数(2026-07-02 从API-V3文档补充):
| 参数 | 类型 | 说明 | 建议 |
|---|---|---|---|
enable_audio_denoise |
bool | 是否开启降噪(1.0默认true,2.0默认false) | 样本噪声大时开启,质量好时关闭 |
enable_audio_denoise_with_snr |
bool | 配合降噪检测阈值使用 | 需同时开启enable_audio_denoise |
denoise_max_snr_thresh |
int | 降噪检测阈值,默认50,范围(0,100) | — |
reject_min_snr_thresh |
float | 信噪比低于该值拒绝复刻,默认5 | 过高会降低复刻成功率 |
voice_clone_denoise_model_id |
string | 人声美化模型,默认SpeechInpaintingV2,可换VocalDiffusionV2_44k |
复刻结果有明显噪声时可切换 |
voice_clone_enable_mss |
bool | 音源分离(去除背景音乐),默认false | 对于有背景音的样本开启 |
enable_crop_by_asr |
bool | ASR截断,避免字音被切开,默认false | 对于长音频建议开启 |
disable_volume_normalization |
bool | 关闭音量归一化,默认false(开启归一化) | 关闭后音量更接近prompt,音色相似度更高 |
demo_text |
string | 试听文本,4-300字 | 越长注册越耗时,建议50-100字 |
返回参数说明:
| 字段 | 说明 |
|---|---|
speaker_id |
音色ID |
status |
0=未找到, 1=训练中, 2=训练成功可合成, 3=失败, 4=已激活 |
model_type |
声音复刻2.0: 4=ICL V2, 5=ICL V3 |
demo_audio |
训练成功时返回试听链接(1小时有效) |
available_training_times |
剩余训练次数 |
重要规则:
- 后付费训练成功后首次合成即转正,转正后不可再训练该ID
- 复刻后7天内不合成自动删除(释放ID)
- V3版音色可同时在声音复刻1.0、2.0、豆包端到端实时语音模型上使用(V1版不行)
- 预付费音色先下单槽位再使用;后付费试听不收费,合成即收音色槽位费
注意
- 合成前必须先确认
X-Api-Resource-Id正确(目前是seed-icl-2.0) - 不要用旧版
app/user/audio/requestpayload 格式,新版必须用user/req_params - 流式读取时每个 chunk 都是完整 JSON 行,用 iter_content 逐行 parse