語音合成 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。