语音合成 API
MiniMax Speech 2.8 HD / Turbo 语音合成的 OpenAI 兼容入口与原生入口:请求参数、系统音色、流式输出与按字符计费。
HopBase 的 MiniMax Speech 2.8 语音合成与其他模型共用同一 Base URL 与同一套 Authorization: Bearer sk-your-key 鉴权,没有单独的音频域名或凭证。两个语音模型属于独立分组 MiniMax 语音 官方直连,绑定对话或视频分组的密钥调不到它们。
MiniMax Speech 2.8 把文本同步合成为音频——响应就是音频本身,没有任务要轮询。两个入口共用 Base URL https://api.hop-base.com 与 Bearer 鉴权:OpenAI 兼容的 POST /v1/audio/speech,可直接套用 OpenAI SDK;MiniMax 原生的 POST /v1/t2a_v2,提供完整参数与流式输出。
| 模型 ID | 定位 | 文本上限 |
|---|---|---|
speech-2.8-hd | 音质最高 | /v1/audio/speech 4096 字符,/v1/t2a_v2 10000 字符 |
speech-2.8-turbo | 更快、单价更低 | 同上 |
模型 ID 区分大小写、无别名,tts-1 / tts-1-hd 不被识别。请使用已开通 MiniMax 语音 官方直连 分组的密钥,并用 GET /v1/models 确认。
OpenAI 兼容入口
POST /v1/audio/speech 接受 OpenAI 的请求结构,响应直接是音频字节。
| 字段 | 取值 | 说明 |
|---|---|---|
model | speech-2.8-hd / speech-2.8-turbo | 必填 |
input | 文本,最长 4096 字符 | 必填 |
voice | MiniMax 音色 ID,如 English_expressive_narrator、Chinese (Mandarin)_News_Anchor;或 OpenAI 标准名(alloy、nova 等) | OpenAI 标准名会落到按文本语言选定的默认音色:含汉字用普通话音色,否则用英文音色 |
response_format | mp3(默认)/ opus / flac / wav / pcm | 不支持 aac(400);opus 以 OGG 容器返回 |
speed | 0.25-4 | 超出范围返回 400;范围内的值会被钳到 0.5-2 |
instructions | 接受但忽略 | — |
不支持 stream_format,传了返回 400。响应 Content-Type 随 response_format 分别为 audio/mpeg、audio/ogg、audio/flac、audio/wav、audio/pcm。
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 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 请求体:model、text(最长 10000 字符)、voice_setting(voice_id、speed、vol、pitch、emotion)、audio_setting(format、sample_rate、bitrate、channel)、language_boost、stream、stream_options 均原样透传——每个字段与取值见下方请求参数。响应 JSON 也与官方结构一致:data.audio 是十六进制编码的音频,extra_info 带 usage_characters 与音频元信息。
output_format只支持hex(默认),传url返回 400。voice_setting.speed会被钳到 0.5-2。audio_setting.format为"opus"时必须显式传sample_rate(如24000),否则请求以参数错误失败。stream: true切换为 SSE:每个data: {...}事件带一段音频,末块data.status为2并附extra_info。默认末块的data.audio是完整聚合音频,可用stream_options.exclude_aggregated_audio: true关掉。
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"]) # 计费字符数流式:逐行读 SSE 响应体,把每个 data: 事件里的十六进制片段解码后追加写入文件。请把 exclude_aggregated_audio 设为 true,这样末块(status 为 2)只带 extra_info——否则末块的 data.audio 会把整段音频再发一遍,直接追加会得到双份音频。
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:])
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"]) # 计费字符数请求参数
原生入口接受官方 T2A v2 请求体。下表的取值与默认值均为官方口径;最后一列标出 HopBase 与官方不同、或仅做透传的地方。
顶层字段
| 字段 | 取值 | 默认 | 说明 |
|---|---|---|---|
model | speech-2.8-hd / speech-2.8-turbo | — | 必填 |
text | 最长 10000 字符 | — | 必填;段落用换行分隔,行内控制标记见下文。官方建议超过 3000 字符走流式 |
stream | true / false | false | true 时响应切换为 SSE |
stream_options.exclude_aggregated_audio | true / false | false | true 时末块不再携带完整音频 |
language_boost | auto,或 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 之一 | 不设置 | 增强对该语言或方言的识别;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 的整数;sound_effects:spacious_echo / auditorium_echo / lofi_telephone / robotic | — | 官方语义:pitch 低沉 → 明亮,intensity 有力 → 柔和,timbre 浑厚 → 清脆;音效一次只能一种;非流式支持 mp3 / wav / flac,流式只支持 mp3。按官方语义透传,网关侧未校验 |
output_format | hex | hex | 传 url 返回 400 |
voice_setting
| 字段 | 取值 | 默认 | 说明 |
|---|---|---|---|
voice_id | 系统音色 ID,见系统音色 | — | 必填 |
speed | 0.5-2 | 1.0 | 超出范围的值会被钳到该区间 |
vol | 大于 0、最大 10 | 1.0 | 音量 |
pitch | -12 到 12 的整数 | 0 | 0 为原始音高 |
emotion | happy / sad / angry / fearful / disgusted / surprised / calm / fluent / whisper | 由文本自动判断 | 只在需要固定情绪时指定。fluent、whisper 官方只写明 2.6 系列可用;whisper 在 Speech 2.8 上明确不支持 |
text_normalization | true / false | false | 中英文数字读法归一,延迟略增 |
latex_read | true / false | false | 仅中文;公式用 $$ 包裹;会把 language_boost 强制为 Chinese |
audio_setting
| 字段 | 取值 | 默认 | 说明 |
|---|---|---|---|
format | mp3 / pcm / flac / wav / opus | mp3 | opus 为 Ogg/Opus 封装,必须显式传 sample_rate |
sample_rate | 8000 / 16000 / 22050 / 24000 / 32000 / 44100 | 官方未写明默认;官方示例用 32000 | — |
bitrate | 32000 / 64000 / 128000 / 256000 | 官方未写明默认;官方示例用 128000 | 仅 mp3 生效 |
channel | 1 / 2 | 1 | 单声道 / 立体声 |
force_cbr | true / false | false | 固定码率;仅流式 mp3 生效 |
文本内联控制
- 停顿:
<#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)。
系统音色
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"。上表只是起步示例:MiniMax 官方系统音色列表里的音色(24 种语言、332 个)全部可用,voice_id 照官方列表原样传即可。2026-09-16 逐个核验:除 Cantonese_ProfessionalHost (F) 与 Cantonese_ProfessionalHost (M) 两个官方列表有、服务端却返回 "voice id not exist" 之外,其余全部可用。HopBase 目前不提供音色查询接口。
性能与超时
短文本(一两句话)实测:同步入口约 1.5-2.4 秒返回整段音频;stream: true 时首个音频块约 1 秒到达。延迟随文本长度增长,长文本请走流式(MiniMax 建议超过 3000 字符即流式),按上面的 SSE 示例边收边写。同步请求的客户端超时沿用并发、超时与计费里其他同步接口的口径:读超时不低于 300 秒。
计费
语音按计费字符数计费。权威值是原生响应里的 extra_info.usage_characters;OpenAI 兼容入口只返回音频,同一个数字请到控制台「使用记录」看 tts_characters。每个 Unicode 字符计 1,汉字额外再计 1,即一个汉字按 2 计;标点、空格、emoji 与 <#0.5#> 这类停顿标记各计 1。
Hello, world.→ 13 个计费字符你好,世界→ 5 个字符,其中 4 个汉字 → 9 个计费字符
被 400 拒绝或合成过程中失败的请求不计费,流式没有收到末块也不计费。官方牌价(每百万字符)见价格页,你所在分组的实际单价以登录后的模型广场为准。
错误与建议
所有 400 的响应体都是 {"error":{"message":…,"type":"invalid_request_error","code":…}},message 会指出出错的字段。
| 状态码 | 原因 | 处理 |
|---|---|---|
| 400 | 参数非法:取值超出范围、传了 stream_format、output_format: "url",或 opus 没带 sample_rate | 按 message 指出的字段修正;不要原样重试 |
| 400 | 音色 ID 不存在 | 从系统音色原样取 ID |
| 400 | 文本超长(4096 / 10000 字符) | 分段后逐段发送 |
| 400 | 不支持的格式,如 response_format: "aac" | 改用 mp3 / opus / flac / wav / pcm |
| 402 | 帐户余额或密钥额度用完 | 充值或调整密钥额度;不要循环重试 |
| 404 | 模型不在密钥所属分组 | 用 GET /v1/models 确认 |
| 429 | 触发限流或并发上限 | 按 Retry-After 稍后重试并降低并发 |
| 503 | 当前没有可用服务 | 退避重试(2 秒、5 秒、15 秒,最多三次) |
- 中文文本请选普通话音色。
- 长文本自行分段:OpenAI 兼容入口每次 4096 字符,原生入口 10000 字符。
- 用
opus时务必带上sample_rate。
与 OpenAI 官方 TTS 的差异:没有 tts-1 这个模型名(用上面两个 ID)、不支持 stream_format、instructions 无效、voice 取值是 MiniMax 音色 ID。