语音合成 API
用 OpenAI 兼容入口或原生入口把文本合成为语音(MiniMax Speech 2.8 与豆包语音),以及豆包声音复刻。
| 项目 | 取值 |
|---|---|
| Base URL | https://api.hop-base.com |
| OpenAI 兼容入口 | POST /v1/audio/speech |
| 原生入口(完整参数、流式;仅 MiniMax) | POST /v1/t2a_v2 |
| 声音复刻(豆包) | POST /v1/voice_clone |
本页讲两家语音模型。MiniMax Speech 2.8 属于独立分组 MiniMax 语音 官方直连,下面各节默认讲它;字节跳动豆包语音(seed-tts-2.0、seed-audio-1.0)属于另一个分组,只走 OpenAI 兼容入口,见豆包语音;同一分组的声音复刻 seed-icl-2.0 见豆包声音复刻。密钥包含对应分组才能调用;可以直接把分组加到已有的对话或视频密钥上,不必另建。
合成语音
两个入口都同步返回整段音频。想直接套用 OpenAI SDK,用 OpenAI 兼容入口;需要完整参数与流式输出,用原生入口。
MiniMax Speech 2.8 把文本同步合成为音频,响应就是音频本身,没有任务要轮询。它与其他模型共用同一个 Base URL(见页首表格)和 Bearer 鉴权,没有单独的音频域名或凭证。
| 模型 ID | 定位 |
|---|---|
speech-2.8-hd | 音质最高 |
speech-2.8-turbo | 更快、单价更低 |
模型 ID 区分大小写、无别名,tts-1 / tts-1-hd 不被识别。请使用已开通该分组的密钥,并用 GET /v1/models 确认。
| 入口 | 适合 | 文本上限 |
|---|---|---|
POST /v1/audio/speech | 直接套用 OpenAI SDK | 4096 字符 |
POST /v1/t2a_v2 | 完整参数与流式输出 | 10000 字符 |
curl https://api.hop-base.com/v1/audio/speech \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"model": "speech-2.8-turbo",
"input": "你好,世界。",
"voice": "Chinese (Mandarin)_News_Anchor",
"response_format": "mp3"
}' \
--output hello.mp3OpenAI 兼容入口
POST /v1/audio/speech 接受 OpenAI 的请求结构,响应直接是音频字节。字段说明也见 API 参考。
| 参数 | 必填 | 类型与限制 | 默认值 | 说明 |
|---|---|---|---|---|
model | 必填 | speech-2.8-hd / speech-2.8-turbo | — | 区分大小写 |
input | 必填 | 字符串,1-4096 字符 | — | — |
voice | 可选 | 系统或克隆音色 ID,或 OpenAI 音色名 | 按文本语言,见下方 | — |
response_format | 可选 | mp3 / opus / flac / wav / pcm | mp3 | aac 返回 400 |
speed | 可选 | 数字 0.25-4 | 1.0 | 超出范围返回 400 |
- 不传
voice时,文本含汉字用Chinese (Mandarin)_News_Anchor,否则用English_expressive_narrator。 - OpenAI 音色名同样落到该默认音色。
speed在范围内的值会被钳到 0.5-2。- 不支持
stream_format,传了返回 400。
- 可用的 OpenAI 音色名:
alloy、ash、ballad、cedar、coral、echo、fable、marin、nova、onyx、sage、shimmer、verse。 opus为 24 kHz 的 Ogg 封装。instructions接受但忽略。- 其他字段一律返回 400
unknown field,包括sample_rate、language_boost、voice_setting等原生字段。需要它们请用原生入口。 - 响应
Content-Type随response_format分别为audio/mpeg、audio/ogg、audio/flac、audio/wav、audio/pcm。
用官方 openai SDK 时,只需改 Base URL 与 model / voice 取值:
from openai import OpenAI
client = OpenAI(base_url="https://api.hop-base.com/v1", api_key="sk-your-key")
response = client.audio.speech.create(
model="speech-2.8-turbo",
voice="Chinese (Mandarin)_News_Anchor",
input="你好,世界。",
response_format="mp3",
)
response.write_to_file("hello.mp3")
# 长文本:边收边写盘,不在内存里攒完整段音频
with client.audio.speech.with_streaming_response.create(
model="speech-2.8-turbo",
voice="Chinese (Mandarin)_News_Anchor",
input="这里放一段较长的文案。",
) as streamed:
streamed.stream_to_file("long.mp3")原生入口
POST /v1/t2a_v2 原样接受 MiniMax T2A v2 请求体,网关不认识的字段也原样透传。JSON 响应同样沿用官方结构(错误除外)。
data.audio 是十六进制编码的音频,extra_info 带 usage_characters 与音频元数据。传 stream: true 切换为 SSE,写法见流式输出。
import requests
resp = requests.post(
"https://api.hop-base.com/v1/t2a_v2",
headers={"Authorization": "Bearer sk-your-key"},
json={
"model": "speech-2.8-hd",
"text": "你好,世界",
"voice_setting": {"voice_id": "Chinese (Mandarin)_News_Anchor", "speed": 1.0},
"audio_setting": {"format": "mp3", "sample_rate": 32000},
},
)
body = resp.json()
open("hello.mp3", "wb").write(bytes.fromhex(body["data"]["audio"]))
print(body["extra_info"]["usage_characters"]) # 计费字符数网关在原生入口只做三件事:
- 校验
model、text长度、stream与output_format。 - 把
voice_setting.speed钳到官方区间。 - 限制请求体 ≤1 MiB。
其余字段原样透传,超出官方范围的值由服务返回 400。下面各表的取值与默认值均为官方口径。
| 参数 | 必填 | 类型与限制 | 默认值 | 说明 |
|---|---|---|---|---|
model | 必填 | speech-2.8-hd / speech-2.8-turbo | — | — |
text | 必填 | 字符串,1-10000 字符 | — | 段落用换行分隔 |
stream | 可选 | true / false | false | true 时响应切换为 SSE |
stream_options.exclude_aggregated_audio | 可选 | true / false | false | true 时末块不再携带完整音频 |
language_boost | 可选 | auto,或下方语言之一 | 不设置 | 增强对该语言或方言的识别 |
pronunciation_dict.tone | 可选 | 原文/替换 字符串数组 | — | 多条规则同时生效 |
voice_modify | 可选 | 见下方 | — | 按官方语义透传,网关侧未校验 |
output_format | 可选 | hex | hex | 传 url 返回 400 |
text的行内控制标记见「文本内联控制」。官方建议超过 3000 字符走流式。language_boost可选语言:Chinese、Chinese,Yue、English、Arabic、Russian、Spanish、French、Portuguese、German、Turkish、Dutch、Ukrainian、Vietnamese、Indonesian、Japanese、Italian、Korean、Thai、Polish、Romanian、Greek、Czech、Finnish、Hindi、Bulgarian、Danish、Hebrew、Malay、Persian、Slovak、Swedish、Croatian、Filipino、Hungarian、Norwegian、Slovenian、Catalan、Nynorsk、Tamil、Afrikaans。language_boost取auto由模型自动判断;粤语音色需要Chinese,Yue。pronunciation_dict.tone的替换可以是普通文本(omg/oh my god)或日文假名(東京/トウキョウ)。- 替换也可以是括号里带声调 1-5 的拼音(
处理/(chu3)(li3))或 IPA(resume/(rɪˈzjuːm))。 voice_modify的pitch、intensity、timbre取 -100 到 100 的整数。- 官方语义:
pitch低沉 → 明亮,intensity有力 → 柔和,timbre浑厚 → 清脆。 voice_modify.sound_effects取spacious_echo/auditorium_echo/lofi_telephone/robotic,音效一次只能一种。- 使用音效时,非流式支持
mp3/wav/flac,流式只支持mp3。
| 参数 | 必填 | 类型与限制 | 默认值 | 说明 |
|---|---|---|---|---|
voice_id | 必填 | 系统音色或克隆音色 ID | — | 见系统音色、声音克隆 |
speed | 可选 | 0.5-2 | 1.0 | 超出范围的值由网关钳到该区间 |
vol | 可选 | 大于 0、最大 10 | 1.0 | 音量 |
pitch | 可选 | -12 到 12 的整数 | 0 | 0 为原始音高 |
emotion | 可选 | 见下方 | 由文本自动判断 | 只在需要固定情绪时指定 |
text_normalization | 可选 | true / false | false | 中英文数字读法归一,延迟略增 |
latex_read | 可选 | true / false | false | 仅中文;公式用 $$ 包裹 |
emotion取happy/sad/angry/fearful/disgusted/surprised/calm/fluent/whisper。fluent、whisper官方只写明 2.6 系列可用;whisper在 Speech 2.8 上明确不支持。latex_read会把language_boost强制为Chinese。
| 参数 | 必填 | 类型与限制 | 默认值 | 说明 |
|---|---|---|---|---|
format | 可选 | mp3 / pcm / flac / wav / opus | mp3 | opus 为 Ogg/Opus 封装 |
sample_rate | opus 时必填 | 8000 / 16000 / 22050 / 24000 / 32000 / 44100 | 官方未写明 | — |
bitrate | 可选 | 32000 / 64000 / 128000 / 256000 | 官方未写明 | 仅 mp3 生效 |
channel | 可选 | 1 / 2 | 1 | 单声道 / 立体声 |
force_cbr | 可选 | true / false | false | 固定码率;仅流式 mp3 生效 |
opus必须显式传sample_rate。sample_rate与bitrate官方未写明默认值,官方示例分别用32000与128000。
- 写法是
<#x#>,x为秒数,范围 0.01-99.99,最多两位小数,例如你好<#0.5#>世界。 - 只能放在两段可朗读文本之间,两个标记连用会被拒绝。
- 每个标记计 1 个计费字符。
- 紧跟在目标字词后,用半角括号写带声调 1-5 的拼音、IPA,或带声调 1-6 的粤拼。
- 示例:
This is (he2)平, not (huo4)面.、pronounced (lɪv) as a verb、去街市買啲(sung3)。
语气词(仅 Speech 2.8)
(laughs) (chuckle) (coughs) (clear-throat) (groans) (breath) (pant) (inhale) (exhale) (gasps)
(sniffs) (sighs) (snorts) (burps) (lip-smacking) (humming) (hissing) (emm) (sneezes)系统音色
MiniMax 官方系统音色列表里的音色(24 种语言、332 个)全部可用,voice_id 照官方列表原样传即可。下表只是起步示例。
voice_id 一列请原样使用,大小写、空格、括号都不能改。「名称」是官方标签。
voice_id | 语言 | 名称 |
|---|---|---|
English_expressive_narrator | 英语 | Expressive Narrator |
English_radiant_girl | 英语 | Radiant Girl |
English_magnetic_voiced_man | 英语 | Magnetic-voiced Male |
English_compelling_lady1 | 英语 | Compelling Lady |
English_Aussie_Bloke | 英语 | Aussie Bloke |
English_captivating_female1 | 英语 | Captivating Female |
English_Upbeat_Woman | 英语 | Upbeat Woman |
English_Trustworth_Man | 英语 | Trustworthy Man |
Chinese (Mandarin)_Reliable_Executive | 普通话 | Reliable Executive |
Chinese (Mandarin)_News_Anchor | 普通话 | News Anchor |
Chinese (Mandarin)_Unrestrained_Young_Man | 普通话 | Unrestrained Young Man |
Chinese (Mandarin)_Mature_Woman | 普通话 | Mature Woman |
Arrogant_Miss | 普通话 | Arrogant Miss |
Robot_Armor | 普通话 | Robot Armor |
Chinese (Mandarin)_Kind-hearted_Antie | 普通话 | Kind-hearted Antie |
Chinese (Mandarin)_HK_Flight_Attendant | 普通话 | HK Flight Attendant |
Japanese_IntellectualSenior | 日语 | Intellectual Senior |
Japanese_DecisivePrincess | 日语 | Decisive Princess |
Japanese_LoyalKnight | 日语 | Loyal Knight |
Spanish_SereneWoman | 西班牙语 | Serene Woman |
Spanish_MaturePartner | 西班牙语 | Mature Partner |
Spanish_CaptivatingStoryteller | 西班牙语 | Captivating Storyteller |
Cantonese_GentleLady | 粤语 | Gentle Lady |
- 粤语音色需要
language_boost: "Chinese,Yue"。 - 中文文本请选普通话音色。
- 2026-09-16 逐个核验,官方列表里只有两个音色不可用:服务端对它们返回 "voice id not exist"。
- 这两个是
Cantonese_ProfessionalHost (F)与Cantonese_ProfessionalHost (M)。 - 用
POST /v1/get_voice传{"voice_type": "system"}可以查询系统音色列表。
流式输出
原生入口传 stream: true 后切换为 SSE。每个 data: {...} 事件带一段十六进制音频,末块 data.status 为 2 并附 extra_info。逐行读响应体,把每个事件的音频片段解码后追加写入文件。
默认末块的 data.audio 会把整段音频再发一遍,直接追加会得到双份音频。设 stream_options.exclude_aggregated_audio: true 后,末块只带 extra_info。
import json
import requests
with requests.post(
"https://api.hop-base.com/v1/t2a_v2",
headers={"Authorization": "Bearer sk-your-key"},
json={
"model": "speech-2.8-turbo",
"text": "这里放一段较长的文案。",
"stream": True,
"stream_options": {"exclude_aggregated_audio": True},
"voice_setting": {"voice_id": "Chinese (Mandarin)_News_Anchor"},
"audio_setting": {"format": "mp3", "sample_rate": 32000},
},
stream=True,
timeout=(10, 300),
) as resp, open("long.mp3", "wb") as out:
resp.raise_for_status()
for line in resp.iter_lines():
if not line.startswith(b"data:"):
continue
event = json.loads(line[5:])
base = event.get("base_resp") or {}
if base.get("status_code", 0) != 0: # 中途失败:不计费,流随即结束
raise RuntimeError(base.get("status_msg"))
data = event.get("data") or {}
if data.get("audio"):
out.write(bytes.fromhex(data["audio"]))
if data.get("status") == 2:
print(event["extra_info"]["usage_characters"]) # 计费字符数延迟与超时
短文本(一两句话)实测:同步入口约 1.5-2.4 秒返回整段音频;stream: true 时首个音频块约 1 秒到达。
延迟随文本长度增长,长文本请走流式(MiniMax 建议超过 3000 字符即流式)。同步请求的客户端超时沿用并发、超时与计费里其他同步接口的口径:读超时不低于 300 秒。
声音克隆
用你自己的录音克隆出音色,之后在两个入口里像系统音色一样使用。流程与 MiniMax 官方声音克隆 API 一致,官方 SDK 代码改 Base URL 与密钥即可复用。密钥所属分组须包含 MiniMax 语音模型。
只克隆你本人的声音,或已取得说话人明确书面授权的声音。合法使用(包括深度合成与肖像、声音相关规定)由你负责。
1. 上传音频
POST /v1/files/upload 以 multipart/form-data 提交,只接受下面两个字段,其他字段返回 400。
| 参数 | 必填 | 类型与限制 | 默认值 | 说明 |
|---|---|---|---|---|
purpose | 必填 | voice_clone / prompt_audio | — | 见下方 |
file | 必填 | 单个文件,扩展名 .mp3 / .m4a / .wav,≤20 MB | — | 格式与大小在上传时校验 |
voice_clone是要克隆的录音,prompt_audio是可选的示例片段。- 时长:
voice_clone10 秒至 5 分钟,prompt_audio短于 8 秒。 - 时长在克隆时校验。
curl https://api.hop-base.com/v1/files/upload \
-H "Authorization: Bearer sk-your-key" \
-F purpose=voice_clone \
-F file=@my_voice.mp3
# → {"file":{"file_id":123456789,"bytes":…,"created_at":…,"filename":"my_voice.mp3","purpose":"voice_clone"},"base_resp":{…}}2. 克隆音色
POST /v1/voice_clone 传入 file_id 与你自己起的 voice_id。带上 text 与 model 可拿到试听音频。
curl https://api.hop-base.com/v1/voice_clone \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"file_id": 123456789,
"voice_id": "MyNarrator01",
"text": "Hello, this is my cloned voice.",
"model": "speech-2.8-hd",
"need_noise_reduction": true
}'
# 响应:input_sensitive、input_sensitive_type、demo_audio(api.hop-base.com 上的试听下载链接,24 小时内有效;不传 text 时为空)、extra_info.usage_characters(试听计费字符数)、base_resp| 参数 | 必填 | 类型与限制 | 默认值 | 说明 |
|---|---|---|---|---|
file_id | 必填 | 第 1 步返回的整数 | — | 只能用一次 |
voice_id | 必填 | 8-256 个字符,规则见下方 | — | 帐户内唯一 |
clone_prompt | 可选 | 对象,见下方 | — | 示例片段 |
text | 可选 | 试听文本,≤1000 字符 | — | 返回试听音频,按语音字符计费 |
model | 传 text 时必填 | speech-2.8-hd / speech-2.8-turbo | — | — |
language_boost | 可选 | 与原生入口相同 | — | — |
text_validation | 可选 | 预期文本,≤200 字符 | — | 用语音识别比对源音频 |
accuracy | 可选 | 数字 0-1 | 0.7 | text_validation 的通过阈值 |
need_noise_reduction | 可选 | 布尔 | false | — |
need_volume_normalization | 可选 | 布尔 | false | — |
aigc_watermark | 可选 | 布尔 | false | — |
voice_id由字母、数字、-、_组成,以字母开头,不以-或_结尾。clone_prompt写作{"prompt_audio": <file_id>, "prompt_text": "…"},两个键都必填。prompt_text是示例片段的逐字文本,以标点结尾。
使用克隆音色
把你的 voice_id 填到 /v1/audio/speech 的 voice,或 /v1/t2a_v2 的 voice_setting.voice_id(以及 timber_weights[].voice_id)。
curl https://api.hop-base.com/v1/audio/speech \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{"model": "speech-2.8-turbo", "input": "Hello again.", "voice": "MyNarrator01"}' \
--output cloned.mp3- 上传的文件只能用一次:克隆成功后源音频与示例音频都会自动删除,再次克隆须重新上传。
- 克隆失败则保留文件,可换参数重试。
- 上传后 24 小时内未使用的文件自动删除。删除文件不影响已克隆的音色。
- 克隆后 7 天内未用于合成的音色自动删除,且不收克隆费。
- 音色只属于你的帐户(企业帐户下由企业主名下成员的密钥共享);其他帐户即使知道
voice_id也用不了。
POST /v1/get_voice列出你的音色(voice_id、description、created_time)。POST /v1/delete_voice删除音色并释放名字。GET /v1/files/list/GET /v1/files/retrieve/POST /v1/files/delete管理尚未使用的上传文件。- 已上传的音频不支持下载。
# 列出克隆音色("system" 为系统音色,"all" 为全部;"voice_generation" 始终为空)
curl https://api.hop-base.com/v1/get_voice \
-H "Authorization: Bearer sk-your-key" -H "Content-Type: application/json" \
-d '{"voice_type": "voice_cloning"}'
# 删除克隆音色
curl https://api.hop-base.com/v1/delete_voice \
-H "Authorization: Bearer sk-your-key" -H "Content-Type: application/json" \
-d '{"voice_type": "voice_cloning", "voice_id": "MyNarrator01"}'
# 尚未使用的上传文件:列表、查询、删除
curl "https://api.hop-base.com/v1/files/list?purpose=voice_clone" -H "Authorization: Bearer sk-your-key"
curl "https://api.hop-base.com/v1/files/retrieve?file_id=123456789" -H "Authorization: Bearer sk-your-key"
curl https://api.hop-base.com/v1/files/delete \
-H "Authorization: Bearer sk-your-key" -H "Content-Type: application/json" \
-d '{"file_id": 123456789, "purpose": "voice_clone"}'计费
语音按计费字符数计费。权威值是原生响应里的 extra_info.usage_characters;OpenAI 兼容入口只返回音频,同一个数字请到控制台「使用记录」看 tts_characters。
每个 Unicode 字符计 1,汉字额外再计 1,即一个汉字按 2 计。标点、空格、emoji 与 <#0.5#> 这类停顿标记各计 1。
Hello, world.→ 13 个计费字符你好,世界→ 5 个字符,其中 4 个汉字 → 9 个计费字符
被 400 拒绝或合成过程中失败的请求不计费,流式没有收到末块也不计费。官方牌价(每百万字符)见价格页,你所在分组的实际单价以登录后的模型广场为准。
克隆费上传与克隆免费。克隆费只收一次,在音色首次合成成功时一并扣除,那次合成的使用记录明细里多一项 voice_clone_activation。
试听 text 只按语音字符计费,不算首次使用;失败的请求不计费。克隆费见价格页。
错误与建议
两个入口的错误都是非 200 状态码加 {"error":{…}},不是官方的 base_resp。网关自身校验(模型、文本、格式、语速、未知字段)不带 code,以 message 为准。
| 状态码 | 原因 | 处理 |
|---|---|---|
| 400 | 取值超出范围,或传了 stream_format / output_format: "url" | 按 message 指出的字段修正;不要原样重试 |
| 400 | opus 没带 sample_rate | 显式传 sample_rate |
| 400 | 音色 ID 不存在,或克隆音色已删除、已过期 | 从系统音色原样取 ID,或重新克隆 |
| 400 | 文本超长(4096 / 10000 字符) | 分段后逐段发送 |
| 400 | 不支持的格式,如 response_format: "aac" | 改用 mp3 / opus / flac / wav / pcm |
| 400 | 声音克隆的文件、音色名、时长或比对问题 | 按下方报文处理 |
| 402 | 帐户余额或密钥额度用完 | 充值或调整密钥额度;不要循环重试 |
| 404 | 模型不在密钥所属分组 | 用 GET /v1/models 确认 |
| 429 | 触发限流或并发上限 | 按 Retry-After 稍后重试并降低并发 |
| 503 | 当前没有可用服务 | 退避重试(2 秒、5 秒、15 秒,最多三次) |
声音克隆的 400 包括:file_id 已用过或已过期、voice_id 已被占用、音频时长超出范围,或 text_validation 比对未通过。常见报文与改法:
400 voice id not exist 音色 ID 不存在,或克隆音色已删除 / 过期
400 file_id ... does not exist; uploaded files are single-use and expire 24 hours after upload 重新上传
400 voice_id ... already exists 换名字或删除旧音色
400 (克隆)音频时长超出范围 源音频 10 秒-5 分钟,示例音频短于 8 秒
400 (克隆)语音识别比对未通过 仅传 text_validation 时出现:修正预期文本或调低 accuracy
503 voice cloning is temporarily unavailable 稍后重试
400 sensitive content / >10% invalid chars 改写或清理文本
400 invalid request parameters; check text, voice_setting and audio_setting (opus requires an explicit sample_rate)
413 request body exceeds the 1048576 byte limit (got N bytes) 请求体超过 1 MiB
502 response_size_limit_exceeded (audio over 64 MiB) 改用 stream: true、缩短文本或降低码率
流式中途失败:最后推一条 data: {"base_resp":{...}} 后断流,不计费豆包语音
字节跳动豆包语音的两个模型属于独立分组 豆包语音 云厂商,密钥包含该分组才能调用;可以直接把它加到已有密钥上。它们只走 OpenAI 兼容入口 POST /v1/audio/speech,同步返回整段音频,不支持流式;原生入口 /v1/t2a_v2 不支持这两个模型,调用返回 400 并提示改用 /v1/audio/speech。
| 模型 ID | 定位 | 官方价 |
|---|---|---|
seed-tts-2.0 | 豆包语音合成模型 2.0(Doubao-Seed-TTS-2.0),文本转语音 | ¥3 / 万字符 |
seed-audio-1.0 | 豆包音频生成模型 1.0(Seed-Audio 1.0),按一段场景描述生成带语气、音效的音频 | ¥1 / 分钟(按生成音频时长) |
seed-icl-2.0 | 豆包声音复刻 2.0,用你复刻的音色合成,见豆包声音复刻 | ¥3 / 万字符 |
curl https://api.hop-base.com/v1/audio/speech \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"model": "seed-tts-2.0",
"input": "你好,欢迎使用豆包语音合成。",
"voice": "zh_female_vv_uranus_bigtts"
}' \
-o out.mp3用官方 openai SDK 时,只需改 Base URL 与 model / voice 取值。seed-audio-1.0 的 input 写场景与台词:
from openai import OpenAI
client = OpenAI(base_url="https://api.hop-base.com/v1", api_key="sk-your-key")
response = client.audio.speech.create(
model="seed-tts-2.0",
voice="zh_female_vv_uranus_bigtts",
input="你好,欢迎使用豆包语音合成。",
)
response.write_to_file("out.mp3")
# 场景音频:input 写「场景描述 + 台词」,生成约需 10-30 秒
scene = client.audio.speech.create(
model="seed-audio-1.0",
voice="alloy", # SDK 要求传 voice;OpenAI 音色名等同不指定,声音由描述决定
input="先是一声手机震动的声音,随后一名男子(中青年,嗓音低沉)用严肃语气说道:“钟sir,你是什么时候被收买的?”",
timeout=300,
)
scene.write_to_file("scene.mp3")豆包语音参数
| 参数 | 必填 | 类型与限制 | 默认值 | 说明 |
|---|---|---|---|---|
model | 必填 | seed-tts-2.0 / seed-audio-1.0 | — | 区分大小写 |
input | 必填 | 字符串;seed-tts-2.0 不超过 5000 字符,seed-audio-1.0 不超过 3000 字符 | — | 按字符计,汉字、字母、标点各算 1 个;超出返回 400 input_too_long |
voice | 可选 | 豆包音色 ID,或 OpenAI 音色名 | 见下方 | 音色不存在返回 400 unknown_voice |
response_format | 可选 | seed-tts-2.0:mp3 / opus / aac / wav / pcm;seed-audio-1.0:mp3 / wav / pcm / flac | mp3 | 列表外的格式返回 400 |
speed | 可选 | 0.5 到 2.0 | 1.0 | 超出范围返回 400 |
instructions | 可选 | 字符串 | — | 可以传,但不生效;语气、情绪请写进 input |
seed-tts-2.0:不传voice,或传alloy等 OpenAI 标准音色名时,按文本语言自动选默认音色:中文用zh_female_vv_uranus_bigtts,其他语言用en_female_dacey_uranus_bigtts。可指定其他 2.0 音色(ID 以_uranus_bigtts结尾,如zh_male_m191_uranus_bigtts)。seed-audio-1.0:input写「场景描述 + 台词」,如上方示例。不传voice或传 OpenAI 标准音色名时,声音由描述决定;也可以指定豆包音色 ID。描述过长时,要生成的音频可能超出模型的时长上限,返回 400duration_out_of_range,缩短后再发。- 输出:
seed-tts-2.0为 24 kHz 单声道(pcm为 24 kHz、16 位单声道原始数据,与 OpenAI 一致);seed-audio-1.0为 48 kHz 双声道。 - 不支持流式,传
stream_format返回 400。音色与文本语言不匹配(如英文音色念纯中文)而没有生成任何音频时,返回 400no_audio。 - 更长的文本请在客户端按上限分段,逐段请求后拼接。
耗时与计费
seed-tts-2.0:短句约 1-3 秒,2000 字约 70 秒。seed-audio-1.0:约 10-30 秒。- 两者都要等整段音频生成完才返回。客户端读超时沿用并发、超时与计费里同步接口的口径:不低于 300 秒。
seed-tts-2.0按输入字符数计费,seed-audio-1.0按生成音频的时长计费,官方价见上方型号表;你所在分组的实际单价以登录后的模型广场为准。被 400 拒绝或生成失败的请求不计费。
上表各项不符合时返回 400,按报错修正后再发,不要原样重试;用 /v1/t2a_v2 调用也返回 400。402、404、429、503 的含义与处理同上方错误与建议。
豆包声音复刻
用一段你自己的录音复刻出专属音色,再用它合成语音。模型是 seed-icl-2.0(豆包声音复刻 2.0),与豆包语音同在「豆包语音 云厂商」分组,密钥包含该分组才能调用。流程分三步:POST /v1/voice_clone 上传录音拿到 voice_id(hbv_ 开头),再把它填进 POST /v1/audio/speech 的 voice 合成;不用时可查询或删除。
请求格式与上方 MiniMax 声音克隆不同:录音直接以 base64 放在 JSON 里,不用先上传文件;三个复刻接口的请求体都必须带 "model": "seed-icl-2.0"。同时使用 MiniMax 声音克隆与豆包声音复刻时,建议两者各用一把密钥。
只复刻你本人的声音,或已取得说话人明确书面授权的声音。合法使用(包括深度合成与肖像、声音相关规定)由你负责。
测试期名额:测试期每个帐户最多保留 1 个复刻音色。想换声音,先删除旧音色再复刻,或带上原 voice_id 重新训练。复刻音色名额有限,满额时返回 503 voice_capacity_full,稍后再试即可。
1. 复刻音色
POST /v1/voice_clone,请求体为 JSON,上限 16 MiB。
| 参数 | 必填 | 类型与限制 | 默认值 | 说明 |
|---|---|---|---|---|
model | 必填 | seed-icl-2.0 | — | 区分大小写 |
audio | 必填 | 录音的 base64,或 data:audio/…;base64,…;解码后不超过 10 MB | — | 格式为 wav / mp3 / ogg / m4a / aac / pcm |
format | 可选 | wav / mp3 / ogg / m4a / aac / pcm | 自动识别 | 不传时按 data URI 的类型或文件头识别;pcm 须为 24 kHz 单声道,并且必须显式传 format |
text | 可选 | 字符串,不超过 1000 字符 | — | 录音的逐字文本。与录音差距大时复刻失败,返回 400 audio_text_mismatch;没把握就不传 |
language | 可选 | 语言代码,见下方 | — | 录音的语言 |
demo_text | 可选 | 4-300 字符 | — | 传了会在响应里返回用新音色朗读这段文本的试听音频,按合成价计费 |
denoise | 可选 | 布尔 | — | 复刻前先对录音降噪 |
voice_id | 可选 | 你已有的 hbv_… | — | 传了就在这个音色上重新训练,覆盖原声音、voice_id 不变,消耗一次训练次数;不传则新建 |
language可选值:zh、en、ja、es、id、pt、de、fr、ko、it、th、vi、ru、fil、ms、ar、es-mx、pt-br、pl、tr、sv。- 复刻同步完成:实测 17 秒的录音约 33 秒返回。客户端读超时请设为不低于 300 秒。
# 把录音转成 base64 写进请求体(jq 1.6+)
jq -n --rawfile audio <(base64 < my_voice.wav | tr -d '\n') \
'{model: "seed-icl-2.0", audio: $audio, language: "zh", demo_text: "你好,这是我复刻出来的声音。"}' > clone.json
curl https://api.hop-base.com/v1/voice_clone \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
--max-time 300 \
-d @clone.json{
"voice_id": "hbv_k3m9x2p7q8r4t6w1y5z0a2b4",
"status": "ready",
"language": "zh",
"remaining_trainings": 14,
"created_at": 1792051200,
"demo_audio": "<base64 音频>",
"demo_audio_format": "wav"
}| 字段 | 说明 |
|---|---|
voice_id | 复刻音色 ID,合成时填到 voice |
status | ready 可以合成;training 还在训练,稍后用 POST /v1/get_voice 查询;failed 训练失败,可带上 voice_id 重新训练或删除 |
language | 录音语言 |
remaining_trainings | 这个音色还能训练的次数(每个音色共 15 次);用完后只能删除再复刻 |
created_at | 创建时间,Unix 秒 |
demo_audio / demo_audio_format | 只在传了 demo_text 时返回:试听音频的 base64 与格式 |
2. 用复刻音色合成
POST /v1/audio/speech,model 填 seed-icl-2.0,voice 填复刻得到的 voice_id。其余参数、可选格式与上限与 seed-tts-2.0 相同(见豆包语音参数):input 不超过 5000 字符,response_format 可选 mp3 / opus / aac / wav / pcm,speed 为 0.5-2.0,输出 24 kHz 单声道,同步返回整段音频,不支持流式。
curl https://api.hop-base.com/v1/audio/speech \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{"model": "seed-icl-2.0", "input": "今天的会议改到下午三点。", "voice": "hbv_k3m9x2p7q8r4t6w1y5z0a2b4"}' \
-o cloned.mp3seed-icl-2.0只能用你自己复刻的音色:不传voice、传系统音色或 OpenAI 音色名,返回 400voice_required。- 复刻音色只能配
seed-icl-2.0,配其他模型返回 400unknown_voice。 - 复刻音色只属于你的帐户(企业帐户下由企业主名下成员的密钥共享);其他帐户即使知道
voice_id也用不了。
3. 查询与删除
两个接口都免费,请求体同样要带 model。
# 列出你的复刻音色(带 voice_id 则只查这一个)
curl https://api.hop-base.com/v1/get_voice \
-H "Authorization: Bearer sk-your-key" -H "Content-Type: application/json" \
-d '{"model": "seed-icl-2.0"}'
# → {"voices":[{"voice_id":"hbv_k3m9x2p7q8r4t6w1y5z0a2b4","status":"ready","language":"zh","remaining_trainings":14,"created_at":1792051200}]}
# 删除复刻音色
curl https://api.hop-base.com/v1/delete_voice \
-H "Authorization: Bearer sk-your-key" -H "Content-Type: application/json" \
-d '{"model": "seed-icl-2.0", "voice_id": "hbv_k3m9x2p7q8r4t6w1y5z0a2b4"}'
# → {"voice_id":"hbv_k3m9x2p7q8r4t6w1y5z0a2b4","deleted":true}带 voice_id 查询时直接返回该音色的对象(字段同复刻响应,不含试听音频)。删除后这个 voice_id 不能再用,名额随即释放。
声音复刻计费
- 用复刻音色合成:按输入字符数计费,官方价 ¥3 / 万字符,与
seed-tts-2.0相同。 - 试听:
demo_text按同一价格计字符。 - 复刻本身、查询、删除都不收费,目前不收复刻费。失败的请求不计费。
你所在分组的实际单价以登录后的模型广场为准。
声音复刻报错
错误格式与其他接口相同:非 200 状态码加 {"error":{"message","type","code"}}。参数校验类错误不带 code,以 message 为准。
| 状态码 | code | 原因 | 处理 |
|---|---|---|---|
| 400 | — | 缺 model 或不是 seed-icl-2.0;audio 不是合法 base64、超过 10 MB、格式不支持或识别不出;text 超长、language 不支持、demo_text 长度不对;voice_id 不是 hbv_ 开头 | 按 message 修正 |
| 400 | voice_limit_reached | 帐户已有 1 个复刻音色 | 删除旧音色,或带上它的 voice_id 重新训练 |
| 400 | audio_text_mismatch | 录音与 text 不符 | 改正 text,或不传 |
| 400 | invalid_audio | 录音被拒,如时长、采样率或编码不符合要求 | 换一段清晰的录音 |
| 400 | no_trainings_left | 这个音色的训练次数已用完 | 删除后重新复刻 |
| 400 | unknown_voice | voice_id 不存在、已删除或不属于你的帐户;或复刻音色配了 seed-icl-2.0 以外的模型 | 用 POST /v1/get_voice 确认 |
| 400 | voice_required | 用 seed-icl-2.0 合成时没有传复刻音色 | 先复刻,再把 voice_id 填到 voice |
| 400 | voice_not_ready | 音色还在创建或训练 | 稍后再试 |
| 400 | voice_training_failed | 音色训练失败 | 带上 voice_id 重新训练,或删除 |
| 409 | voice_clone_in_progress | 同一帐户的另一个复刻或删除请求还没结束 | 等它结束后再发 |
| 413 | — | 请求体超过 16 MiB | 压缩或截短录音 |
| 503 | voice_capacity_full | 复刻音色名额暂满 | 稍后再试 |
| 503 | voice_unavailable、voice_registry_unavailable | 服务暂时不可用 | 退避重试 |
下一步
- 可用模型——所有模型 ID 及其分组
- 创建语音 API 参考
- MiniMax 海螺 H3 视频 API
- 错误码与重试
- 并发、超时与计费