跳到正文

语音合成 API

用 OpenAI 兼容入口或原生入口把文本合成为语音(MiniMax Speech 2.8 与豆包语音),以及豆包声音复刻。

项目取值
Base URLhttps://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 SDK4096 字符
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.mp3

OpenAI 兼容入口

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 / pcmmp3aac 返回 400
speed可选数字 0.25-41.0超出范围返回 400
  • 不传 voice 时,文本含汉字用 Chinese (Mandarin)_News_Anchor,否则用 English_expressive_narrator。
  • OpenAI 音色名同样落到该默认音色。
  • speed 在范围内的值会被钳到 0.5-2。
  • 不支持 stream_format,传了返回 400。

用官方 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。下面各表的取值与默认值均为官方口径。

系统音色

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。逐行读响应体,把每个事件的音频片段解码后追加写入文件。

把 exclude_aggregated_audio 设为 true:

默认末块的 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_clone 10 秒至 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-10.7text_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 也用不了。

计费

语音按计费字符数计费。权威值是原生响应里的 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 指出的字段修正;不要原样重试
400opus 没带 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 / flacmp3列表外的格式返回 400
speed可选0.5 到 2.01.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。描述过长时,要生成的音频可能超出模型的时长上限,返回 400 duration_out_of_range,缩短后再发。
  • 输出:seed-tts-2.0 为 24 kHz 单声道(pcm 为 24 kHz、16 位单声道原始数据,与 OpenAI 一致);seed-audio-1.0 为 48 kHz 双声道。
  • 不支持流式,传 stream_format 返回 400。音色与文本语言不匹配(如英文音色念纯中文)而没有生成任何音频时,返回 400 no_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
statusready 可以合成;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.mp3
  • seed-icl-2.0 只能用你自己复刻的音色:不传 voice、传系统音色或 OpenAI 音色名,返回 400 voice_required。
  • 复刻音色只能配 seed-icl-2.0,配其他模型返回 400 unknown_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 修正
400voice_limit_reached帐户已有 1 个复刻音色删除旧音色,或带上它的 voice_id 重新训练
400audio_text_mismatch录音与 text 不符改正 text,或不传
400invalid_audio录音被拒,如时长、采样率或编码不符合要求换一段清晰的录音
400no_trainings_left这个音色的训练次数已用完删除后重新复刻
400unknown_voicevoice_id 不存在、已删除或不属于你的帐户;或复刻音色配了 seed-icl-2.0 以外的模型用 POST /v1/get_voice 确认
400voice_required用 seed-icl-2.0 合成时没有传复刻音色先复刻,再把 voice_id 填到 voice
400voice_not_ready音色还在创建或训练稍后再试
400voice_training_failed音色训练失败带上 voice_id 重新训练,或删除
409voice_clone_in_progress同一帐户的另一个复刻或删除请求还没结束等它结束后再发
413—请求体超过 16 MiB压缩或截短录音
503voice_capacity_full复刻音色名额暂满稍后再试
503voice_unavailable、voice_registry_unavailable服务暂时不可用退避重试

下一步