先說答案:用 MiniMax 複製一個聲音只需要呼叫兩支 API,複製出來的聲音可以直接在 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 金鑰,所屬群組要包含 MiniMax 語音模型(
speech-2.8-hd、speech-2.8-turbo)。可以直接把這個群組加到你現有的對話或影片金鑰上,不必另外建立。用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 和金鑰就能直接用。
步驟三:在 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 天內沒有用來合成的聲音會被刪除,這種情況不收複製費。即使只合成一句話,聲音也會保留下來。
- 聲音是私有的。複製的聲音屬於你的帳號;企業帳號下,同一企業主名下的成員金鑰可以共用。其他帳號即使知道
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 和豆包的複製都要用,請各用一把金鑰。詳見同一份語音文件。
常見問題
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 的複製費什麼時候收?
在聲音第一次成功合成時收一次。上傳和複製本身免費;複製 API 中的試聽 text 只依語音字元計費,不算首次使用。如果聲音一直沒用、7 天後過期,就不收複製費。
複製的聲音為什麼突然不能用了?
最常見的原因是複製後 7 天內沒有用它合成過,聲音已被刪除。用 POST /v1/get_voice 查詢,必要時重新複製。請注意要重新上傳錄音,因為上傳的檔案只能用一次。
複製的聲音可以串流合成嗎?
可以,使用原生端點 POST /v1/t2a_v2,設定 stream: true,並把 voice_setting.voice_id 設為你的聲音。OpenAI 相容端點一次回傳完整音訊,不支援 stream_format。
怎麼告訴模型文字是哪種語言?
使用 language_boost,原生端點和複製 API 都可以設定。它有 40 個選項,包括中文、粵語(Chinese,Yue)、英文、日文、韓文、西班牙文、法文、德文、阿拉伯文、印地文等,也可以設為 auto 自動辨識。複製的聲音在錄音語言以外的語種表現如何,取決於來源錄音,建議先用一小段試聽確認。完整清單見語音合成文件。