語音合成 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 的請求結構,回應直接是音訊位元組。

欄位取值說明
modelspeech-2.8-hd / speech-2.8-turbo必填
input文字,最長 4096 字元必填
voiceMiniMax 音色 ID,如 English_expressive_narratorChinese (Mandarin)_News_Anchor;或 OpenAI 標準名(alloynova 等)OpenAI 標準名會落到按文字語言選定的預設音色:含漢字用普通話音色,否則用英文音色
response_formatmp3(預設)/ opus / flac / wav / pcm不支援 aac(400);opus 以 OGG 容器回傳
speed0.25-4超出範圍回傳 400;範圍內的值會被鉗到 0.5-2
instructions接受但忽略

不支援 stream_format,傳了回傳 400。回應 Content-Typeresponse_format 分別為 audio/mpegaudio/oggaudio/flacaudio/wavaudio/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 請求體:modeltext(最長 10000 字元)、voice_setting(voice_idspeedvolpitchemotion)、audio_setting(formatsample_ratebitratechannel)、language_booststreamstream_options 均原樣透傳——每個欄位與取值見下方請求參數。回應 JSON 也與官方結構一致:data.audio 是十六進位編碼的音訊,extra_infousage_characters 與音訊中繼資料。

  • output_format 只支援 hex(預設),傳 url 回傳 400。
  • voice_setting.speed 會被鉗到 0.5-2。
  • audio_setting.format"opus" 時必須顯式傳 sample_rate(如 24000),否則請求以參數錯誤失敗。
  • stream: true 切換為 SSE:每個 data: {...} 事件帶一段音訊,末塊 data.status2 並附 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,這樣末塊(status2)只帶 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 與官方不同、或僅做透傳的地方。

頂層欄位

欄位取值預設說明
modelspeech-2.8-hd / speech-2.8-turbo必填
text最長 10000 字元必填;段落用換行分隔,行內控制標記見下文。官方建議超過 3000 字元走串流
streamtrue / falsefalsetrue 時回應切換為 SSE
stream_options.exclude_aggregated_audiotrue / falsefalsetrue 時末塊不再攜帶完整音訊
language_boostauto,或 ChineseChinese,YueEnglishArabicRussianSpanishFrenchPortugueseGermanTurkishDutchUkrainianVietnameseIndonesianJapaneseItalianKoreanThaiPolishRomanianGreekCzechFinnishHindiBulgarianDanishHebrewMalayPersianSlovakSwedishCroatianFilipinoHungarianNorwegianSlovenianCatalanNynorskTamilAfrikaans 之一不設定增強對該語言或方言的識別;auto 由模型自動判斷。粵語音色需要 Chinese,Yue
pronunciation_dict.tone原文/替換 字串陣列替換可以是普通文字(omg/oh my god)、帶聲調 1-5 的拼音加括號(處理/(chu3)(li3))、括號裡的 IPA(resume/(rɪˈzjuːm))或日文假名(東京/トウキョウ);多條規則同時生效
voice_modifypitchintensitytimbre:-100 到 100 的整數;sound_effects:spacious_echo / auditorium_echo / lofi_telephone / robotic官方語義:pitch 低沉 → 明亮,intensity 有力 → 柔和,timbre 渾厚 → 清脆;音效一次只能一種;非串流支援 mp3 / wav / flac,串流只支援 mp3。按官方語義透傳,閘道側未校驗
output_formathexhexurl 回傳 400

voice_setting

欄位取值預設說明
voice_id系統音色 ID,見系統音色必填
speed0.5-21.0超出範圍的值會被鉗到該區間
vol大於 0、最大 101.0音量
pitch-12 到 12 的整數00 為原始音高
emotionhappy / sad / angry / fearful / disgusted / surprised / calm / fluent / whisper由文字自動判斷只在需要固定情緒時指定。fluentwhisper 官方只寫明 2.6 系列可用;whisper 在 Speech 2.8 上明確不支援
text_normalizationtrue / falsefalse中英文數字讀法歸一,延遲略增
latex_readtrue / falsefalse僅中文;公式用 $$ 包裹;會把 language_boost 強制為 Chinese

audio_setting

欄位取值預設說明
formatmp3 / pcm / flac / wav / opusmp3opus 為 Ogg/Opus 封裝,必須顯式傳 sample_rate
sample_rate8000 / 16000 / 22050 / 24000 / 32000 / 44100官方未寫明預設;官方範例用 32000
bitrate32000 / 64000 / 128000 / 256000官方未寫明預設;官方範例用 128000mp3 生效
channel1 / 21單聲道 / 立體聲
force_cbrtrue / falsefalse固定位元率;僅串流 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_formatoutput_format: "url",或 opus 沒帶 sample_ratemessage 指出的欄位修正;不要原樣重試
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_formatinstructions 無效、voice 取值是 MiniMax 音色 ID。

本頁目錄