Fish Audio S2 Pro 已在 Novita AI 上以託管 TTS API 的形式提供,無需冷啟動。本快速入門涵蓋開發者所需的路徑:取得 API 金鑰、確認端點、使用複製語音發送第一個 TTS 請求,並了解語音複製和情緒控制的關鍵參數。S2 Pro 採用雙自迴歸(Dual-Autoregressive)架構,並在大型多語系語料庫上訓練——此功能使其有別於一般 TTS:您複製的每個語音都能在所有支援的語言中使用,無需重新訓練。
何時使用本快速入門
當您需要執行以下操作時,請參考本指南:
- 使用自訂複製語音,將文字合成為多種支援語言的語音。
- 從 10–30 秒的音訊樣本複製語音,並在後續請求中重複使用,無需額外的按次費用。
- 使用自然語言風格的括號標籤(
[whisper]、[excited])內嵌控制語調與情緒。 - 建立需要多語系 TTS 的流程,而無需分別為每種語言整合。
如果您只需要使用內建語音的基礎英文 TTS,且無需複製功能,建議先評估 Fish Audio S1 模型 或 GLM TTS——S2 Pro 的優勢在於跨語言複製與精細的情緒控制。
步驟 1:取得您的 Novita API 金鑰
建立 Novita AI 帳戶,並從 Novita AI 管理控制台 產生 API 金鑰。將其儲存為環境變數:
export NOVITA_API_KEY="your_api_key_here"
請勿將金鑰放入客戶端程式碼、前端套件或公開儲存庫中。
步驟 2:確認模型與端點
Novita AI 的 Fish Audio S2 Pro TTS 文件位於 Fish Audio S2 Pro API 參考。在撰寫程式碼前,請先確認該參考文件中的當前端點路徑與模型識別碼——託管端點 URL 與請求結構皆以該參考文件為準。
對於語音複製,整個流程會用到三個 Novita 端點:
| 步驟 | 方法 | 端點 |
|---|---|---|
| 上傳音訊樣本 | POST |
https://api.novita.ai/v1/files |
| 建立複製(非同步) | POST |
https://api.novita.ai/v1/async/voice-cloning |
| 輪詢結果 | GET |
https://api.novita.ai/v1/async/task-result |
| 使用複製語音的 TTS | POST |
https://api.novita.ai/v4beta/txt2speech |
語音複製在建立複製的步驟中使用 fish-audio-voice-cloning 模型,與 TTS 模型不同。
步驟 3:複製語音
語音複製需要三個 API 呼叫:上傳一段簡短音訊樣本、建立複製,然後取得 voice_id。一旦擁有 voice_id,您就可以在 TTS 請求中無限期重複使用,無需額外費用。
音訊樣本的要求:
- 長度:10–30 秒效果最佳
- 格式:MP3 或 WAV
- 內容:清晰的語音,背景噪音越少越好
- 文字稿:提供確切的語音文字內容可提高複製準確度
Python:完整的複製流程
import base64
import os
import time
import requests
API_KEY = os.environ["NOVITA_API_KEY"]
BASE_URL = "https://api.novita.ai"
# Step 1: Upload audio file
with open("voice_sample.mp3", "rb") as f:
encoded_audio = base64.b64encode(f.read()).decode("utf-8")
upload_response = requests.post(
f"{BASE_URL}/v1/files",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={
"file": encoded_audio,
"purpose": "voice-cloning",
},
)
upload_response.raise_for_status()
file_id = upload_response.json()["file_id"]
print(f"Uploaded file ID: {file_id}")
# Step 2: Create the voice clone
clone_response = requests.post(
f"{BASE_URL}/v1/async/voice-cloning",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={
"model": "fish-audio-voice-cloning",
"audio_file_id": file_id,
"text": "Text spoken in the audio sample goes here.",
},
)
clone_response.raise_for_status()
task_id = clone_response.json()["task_id"]
print(f"Clone task ID: {task_id}")
# Step 3: Poll for the voice_id
voice_id = None
while True:
result = requests.get(
f"{BASE_URL}/v1/async/task-result",
headers={"Authorization": f"Bearer {API_KEY}"},
params={"task_id": task_id},
).json()
if result["status"].endswith("SUCCEED"):
voice_id = result["result"]["voice_id"]
print(f"Cloned voice ID: {voice_id}")
break
elif "FAILED" in result["status"]:
raise RuntimeError(f"Clone failed: {result}")
time.sleep(2)
請儲存 voice_id。在每次 TTS 呼叫中,您會將其用作 reference_id。
cURL:建立複製(檔案上傳後)
curl -s -X POST https://api.novita.ai/v1/async/voice-cloning \
-H "Authorization: Bearer $NOVITA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "fish-audio-voice-cloning",
"audio_file_id": "YOUR_FILE_ID",
"text": "Text spoken in the audio sample goes here."
}'
步驟 4:發送 TTS 請求
一旦您從步驟 3 取得 voice_id,請將其作為 reference_id 傳入 TTS 請求。模型會以複製的語音生成語音內容。
Python
import os
import requests
API_KEY = os.environ["NOVITA_API_KEY"]
VOICE_ID = "your_cloned_voice_id" # from Step 3
response = requests.post(
"https://api.novita.ai/v4beta/txt2speech",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={
"text": "Welcome to the demo. This voice was cloned from a short audio sample.",
"reference_id": VOICE_ID,
"format": "mp3",
"sample_rate": 44100,
},
)
response.raise_for_status()
audio_url = response.json()["audio_url"]
print(f"Audio URL: {audio_url}")
cURL
curl -s -X POST https://api.novita.ai/v4beta/txt2speech \
-H "Authorization: Bearer $NOVITA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Welcome to the demo. This voice was cloned from a short audio sample.",
"reference_id": "YOUR_CLONED_VOICE_ID",
"format": "mp3",
"sample_rate": 44100
}'
回應內容包含一個 audio_url——這是一個指向生成音訊檔案的預簽名 URL。
步驟 5:查看定價、限制與常見錯誤
定價(請至 novita.ai/pricing 確認當前費率):
| 操作 | 價格 |
|---|---|
| TTS 生成 | 約 $15.00 / 100 萬字元 |
| 語音複製 | 每個語音 $0.10(一次性費用) |
語音複製按每個複製收取一次性費用,而非按每個 TTS 請求收費。複製完成後,在 TTS 呼叫中使用該 voice_id 僅需支付按字元計算的 TTS 費率。
每個請求的限制:
| 限制 | 數值 |
|---|---|
| 最大輸入長度 | 10,000 字元 |
| 建議複製用樣本長度 | 10–30 秒 |
| 支援的輸出格式 | mp3、opus、wav、pcm |
| 音訊取樣率 | 最高 44,100 Hz |
常見錯誤:
| 錯誤 | 原因 | 解決方式 |
|---|---|---|
401 Unauthorized |
API 金鑰無效或遺漏 | 檢查 NOVITA_API_KEY 是否已設定且正確 |
檔案上傳時 400 Bad Request |
音訊檔案過大或格式錯誤 | 使用 MP3/WAV,保持在數 MB 以下 |
複製任務 FAILED 狀態 |
音訊樣本過短或噪音過多 | 使用 10–30 秒的清晰語音 |
| 音訊空白或失真 | text 欄位為空或超出限制 |
保持輸入在 10,000 字元以內 |
情緒控制標籤
S2 Pro 支援內嵌的 [括號] 標籤,用以控制模型如何呈現特定的單詞或片語。這些標籤在生成過程中被視為自然語言的指令——您並不受限於固定的標記清單。
text_with_emotion = (
"[cheerful] Welcome back! [pause] "
"I'm really glad you're here. "
"[whisper] Just between us, this part is a secret. [normal] "
"Anyway, let's get started."
)
response = requests.post(
"https://api.novita.ai/v4beta/txt2speech",
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
},
json={
"text": text_with_emotion,
"reference_id": VOICE_ID,
"format": "mp3",
"sample_rate": 44100,
},
)
模型可理解的標籤範例:
| 標籤 | 效果 |
|---|---|
[whisper] |
低語般的表達 |
[excited] |
更高昂的能量、更快的節奏 |
[calm] |
放慢、平穩的語調 |
[laughs] |
在語音中嵌入笑聲 |
[professional broadcast tone] |
新聞播報員的表達風格 |
[pitch up] |
提高後續文字的語調 |
[pause] |
短暫停頓 |
標籤是自由形式的描述,而非固定的列舉值。模型從訓練資料中學習了標籤與聲學特徵之間的對應關係,因此描述性的片語也能生效。請針對您的使用情境嘗試特定標籤;不常見的措辭可能產生不同效果。
關鍵參數
| 參數 | 類型 | 說明 |
|---|---|---|
text |
string | 必填。最多 10,000 字元。 |
reference_id |
string | 必填。語音模型 ID——複製的 voice_id 或系統語音參考。 |
format |
string | 輸出格式:mp3、opus、wav、pcm。預設值:mp3。 |
sample_rate |
integer | 音訊取樣率(Hz)。建議使用 44100 以獲得高保真度。 |
temperature |
number | 控制生成隨機性。數值越高,語調變化越多。 |
top_p |
number | 核取樣(Nucleus sampling)閾值。 |
如需完整的參數結構與任何 S2 Pro 特有的選項,請參閱 Novita AI Fish Audio S2 Pro API 參考。
疑難排解
複製的語音聽起來像機器人或不一致。
樣本可能太短或背景噪音過多。錄製一段 20–30 秒、節奏一致且無重疊的清晰音訊。在複製請求中提供樣本的確切 text 文字稿,有助於改善音素對齊。
輪詢後音訊 URL 回傳 404。 預簽名 URL 有時效限制。收到 URL 後請盡快下載或處理音訊。
情緒標籤未產生預期效果。
標籤的行為取決於訓練資料的分佈。嘗試使用更具描述性的措辭——例如,使用 [very softly, barely audible] 而非 [quiet]。某些標籤的效果會比其他標籤更好;建議先以簡短輸入進行測試。
複製任務狀態持續處於 pending。
請設定輪詢間隔(每次檢查間隔 1–2 秒),以避免對任務結果端點造成速率限制。如果任務持續 pending 超過兩分鐘,請檢查檔案上傳步驟——file_id 可能已過期。
需要在不同語言中使用同一個語音。
在任一支援的語言中傳入相同的 voice_id 即可。S2 Pro 會將複製語音的音色套用至新語言,無需另行複製。請查閱 S2 Pro API 參考 以取得當前支援的語言清單。
常見問題
S2 Pro 與 Fish Audio S1 有何不同? S2 Pro 採用更大的雙自迴歸架構,並在廣泛的多語系語料庫上訓練。實際差異在於:支援更多語言、可透過括號標籤內嵌情緒控制,以及具備 S1 所沒有的多說話者合成能力。請參閱 S2 Pro API 參考 以取得當前語言清單。
我可以複製一次語音,然後用於所有支援的語言嗎?
可以。從英文樣本複製的語音,可以使用同一個 voice_id 生成日文、西班牙文、阿拉伯文或任何其他支援語言的語音。模型無需額外訓練即可將語音音色遷移至不同語言。
語音樣本需要多長? 10–30 秒的清晰、一致語音。較短的樣本可能仍可用,但效果可能較不穩定。超過 30 秒的樣本並不會顯著提升複製品質。
語音複製是每個 TTS 請求都要收費嗎?
不是。$0.10 的語音複製費用是每個複製的一次性費用。建立完成後,在 TTS 請求中使用該 voice_id 僅需支付按字元計算的 TTS 費率。
如果我省略 reference_id 會怎樣?
請查閱 S2 Pro API 參考 以了解當前的預設行為——模型可能會使用預設語音,或要求提供參考語音。
如何取得 API 金鑰? 請至 novita.ai 註冊,並從 Novita AI 管理控制台 產生金鑰。
