先说答案:用 MiniMax 克隆一个音色只需要调两个接口,克隆出来的音色可以直接在 OpenAI 的语音合成 SDK 里用。第一步,把一段 10 秒到 5 分钟的录音(.mp3 / .m4a / .wav,不超过 20 MB)以 purpose=voice_clone 上传到 POST https://api.hop-base.com/v1/files/upload。第二步,用返回的 file_id 加上你自己起的 voice_id,调用 POST /v1/voice_clone。之后在 OpenAI 兼容的 /v1/audio/speech 接口里,把这个 voice_id 作为 voice 传入,模型选 speech-2.8-hd 或 speech-2.8-turbo 即可。用 OpenAI SDK 的话,只需要改 base_url、model 和 voice 三处。上传和克隆本身都免费;价格页公布的克隆费是每个音色 $1.5,在这个音色第一次成功合成时收取一次。合成按字符计费:HD 每百万字符 $100,Turbo 每百万字符 $60,一个汉字按 2 个字符算。克隆后 7 天内没有用来合成的音色会被删除,这种情况不收克隆费。
开始前要准备什么
- 一个 HopBase API Key,所在分组要包含 MiniMax 语音模型(
speech-2.8-hd、speech-2.8-turbo)。可以直接把这个分组加到你现有的对话或视频 Key 上,不用另建。用GET /v1/models确认。 - 一段干净的录音:10 秒到 5 分钟,格式为
.mp3/.m4a/.wav,不超过 20 MB。只有一个人说话、背景噪声小、语速自然,效果最好。 - 这个声音的使用权。只能克隆你本人的声音,或者已取得说话人明确书面授权的声音。合法使用由你负责,包括深度合成和肖像相关的规定。
第一步:上传录音
POST /v1/files/upload 使用 multipart/form-data,只能有 purpose 和 file 两个字段,多传任何字段都会返回 400。
curl https://api.hop-base.com/v1/files/upload \
-H "Authorization: Bearer sk-你的密钥" \
-F purpose=voice_clone \
-F file=@my_voice.mp3
# → {"file":{"file_id":123456789,"bytes":...,"filename":"my_voice.mp3","purpose":"voice_clone"},"base_resp":{...}}
格式和大小在上传时检查,时长在克隆时检查。如果还想给模型一段示例音频,另外用 purpose=prompt_audio 上传,长度要在 8 秒以内。
第二步:克隆音色
curl https://api.hop-base.com/v1/voice_clone \
-H "Authorization: Bearer sk-你的密钥" \
-H "Content-Type: application/json" \
-d '{
"file_id": 123456789,
"voice_id": "MyNarrator01",
"text": "你好,这是我克隆出来的声音。",
"model": "speech-2.8-hd",
"need_noise_reduction": true
}'
主要字段说明:
| 字段 | 规则 |
|---|---|
file_id | 必填,第一步拿到的整数。每个文件只能用一次。 |
voice_id | 必填,8-256 个字符,只能用字母、数字、- 和 _。必须以字母开头,不能以 - 或 _ 结尾,在你的账号内不能重复。 |
text + model | 可选的试听文本,最多 1,000 字符。传了 text 就必须传 model。返回里会带 demo_audio 试听链接,24 小时有效;试听文本按语音字符计费。 |
clone_prompt | 可选,格式为 {"prompt_audio": <file_id>, "prompt_text": "..."},两个键都必须有。prompt_text 是示例音频的逐字稿,结尾要带标点。 |
text_validation / accuracy | 可选的质量校验:给出预期的逐字稿(最多 200 字符)和通过阈值(0-1,默认 0.7)。语音识别结果对不上,克隆就会失败。 |
need_noise_reduction、need_volume_normalization、aigc_watermark | 可选的布尔值,默认都是 false。 |
这套流程和 MiniMax 官方的音色克隆 API 一致,按 MiniMax 官方 SDK 写的代码,换成 HopBase 的 Base URL 和 Key 就能直接用。
第三步:在 OpenAI SDK 里使用克隆音色
选 OpenAI 兼容接口最大的好处是:现有的 client.audio.speech.create 代码不用重写,只要把 voice 换成新的 voice_id:
from openai import OpenAI
client = OpenAI(base_url="https://api.hop-base.com/v1", api_key="sk-你的密钥")
response = client.audio.speech.create(
model="speech-2.8-turbo",
voice="MyNarrator01", # 你克隆的 voice_id
input="欢迎回来,下面是今天的产品更新。",
response_format="mp3",
)
response.write_to_file("update.mp3")
curl 写法:
curl https://api.hop-base.com/v1/audio/speech \
-H "Authorization: Bearer sk-你的密钥" \
-H "Content-Type: application/json" \
-d '{"model": "speech-2.8-turbo", "input": "又见面了。", "voice": "MyNarrator01"}' \
--output cloned.mp3
OpenAI 兼容接口的限制:input 最多 4,096 字符;response_format 可选 mp3 / opus / flac / wav / pcm,传 aac 会返回 400;speed 范围是 0.25-4。返回的是完整的原始音频。原生接口的字段,比如 voice_setting、language_boost,在这个接口上会被拒绝。
什么时候改用原生接口
如果是长稿、需要控制情绪,或者要流式输出,就调用 POST /v1/t2a_v2,音色放在 voice_setting.voice_id。这个接口最多接受 10,000 字符,支持 stream: true。我们用短文本实测:同步接口约 1.5-2.4 秒返回完整音频;开启流式后,约 1 秒收到第一个音频块。流式时记得设置 stream_options.exclude_aggregated_audio: true,否则最后一个事件会把整段音频再发一遍,直接拼接会得到双份音频。完整参数见语音合成文档。
容易踩坑的生命周期规则
- 上传的文件只能用一次。克隆成功后,源文件和示例文件都会被删掉,想再克隆就得重新上传。克隆失败时文件会保留,可以直接重试。
- 没用过的文件 24 小时后过期。删除文件不会影响已经克隆好的音色。
- 7 天内要用一次。克隆后 7 天内没有用来合成的音色会被删除,这种情况不收克隆费。哪怕只合成一句话,音色也会保留下来。
- 音色是私有的。克隆的音色属于你的账号;企业账号下,同一企业主名下的成员 Key 可以共用。其他账号即使知道
voice_id也用不了。 - 管理操作免费。
POST /v1/get_voice传{"voice_type": "voice_cloning"}可以列出你的音色,POST /v1/delete_voice可以删除音色并释放这个名字。
费用
| 项目 | 公开价格 |
|---|---|
| 上传与克隆 | 免费 |
| 克隆费 | 每个音色 $1.5,在该音色第一次成功合成时收取一次 |
speech-2.8-hd | 每百万计费字符 $100 |
speech-2.8-turbo | 每百万计费字符 $60 |
计费字符的算法:每个 Unicode 字符算 1,汉字(CJK)额外加 1,也就是一个汉字算 2;标点、空格、emoji 和 <#0.5#> 这类停顿标记各算 1。例如 你好,世界 有 5 个字符,其中 4 个是汉字,计费 9 个字符。一篇 3,000 个汉字的中文稿约 6,000 个计费字符,按牌价 Turbo 约 $0.36,HD 约 $0.60;新音色第一次使用时,另外收一次 $1.5。克隆费在那次请求的使用记录里单独显示为一行 voice_clone_activation。被 400 拒绝的请求和合成中途失败的请求都不计费。最新牌价见价格页,你所在分组的单价以登录后模型目录显示的为准。
常见报错
| 报错信息 | 怎么处理 |
|---|---|
file_id ... does not exist; uploaded files are single-use and expire 24 hours after upload | 重新上传录音 |
voice_id ... already exists | 换一个名字,或者先删除旧音色 |
audio duration out of range | 源音频要在 10 秒到 5 分钟之间,示例音频要在 8 秒以内 |
voice id not exist | ID 写错了,或者音色已被删除,或者 7 天没用已过期。重新克隆即可。 |
voice cloning is temporarily unavailable(503) | 稍后重试 |
另一个选择:豆包声音复刻
HopBase 也提供字节跳动的 seed-icl-2.0(豆包声音复刻 2.0),接法不太一样:录音以 base64 形式直接放进 POST /v1/voice_clone 的 JSON 里(录音不超过 10 MB,请求体不超过 16 MiB),每次调用都要带 "model": "seed-icl-2.0"。返回的 voice_id 以 hbv_ 开头,只能配合 seed-icl-2.0 在 /v1/audio/speech 上使用。豆包不收克隆费,合成按官方牌价每万字符 ¥3。公测期间每个账号只能保留 1 个复刻音色。如果 MiniMax 和豆包的克隆都要用,请各用一个 Key。详见同一篇语音文档。
常见问题
MiniMax 克隆的音色能用 OpenAI Python SDK 调用吗?
可以。把客户端的地址指向 https://api.hop-base.com/v1,model 选 speech-2.8-hd 或 speech-2.8-turbo,在 client.audio.speech.create 里把 voice_id 作为 voice 传入就行,其他代码不用改。
源录音要多长?
10 秒到 5 分钟之间,格式为 .mp3 / .m4a / .wav,不超过 20 MB。可选的示例音频要在 8 秒以内。
$1.5 的克隆费什么时候收?
在音色第一次成功合成时收一次。上传和克隆本身免费;克隆接口里的试听 text 只按语音字符计费,不算作首次使用。如果音色一直没用、7 天后过期了,就不收克隆费。
克隆的音色为什么突然用不了了?
最常见的原因是克隆后 7 天内没有用它合成过,音色已被删除。用 POST /v1/get_voice 查一下,必要时重新克隆。注意要重新上传录音,因为上传的文件只能用一次。
克隆音色能流式合成吗?
可以,用原生接口 POST /v1/t2a_v2,设置 stream: true,并把 voice_setting.voice_id 设为你的音色。OpenAI 兼容接口一次返回完整音频,不支持 stream_format。
怎么告诉模型文本是哪种语言?
用 language_boost,原生接口和克隆接口都可以设置。它有 40 个选项,包括中文、粤语(Chinese,Yue)、英语、日语、韩语、西班牙语、法语、德语、阿拉伯语、印地语等,也可以设为 auto 自动识别。克隆音色在录音语言以外的语种上效果如何,取决于源录音,建议先用一小段试听验证。完整列表见语音合成文档。