Fish Audio S2 Pro 快速入門:語音複製與多語系 TTS

Fish Audio S2 Pro 快速入門:語音複製與多語系 TTS

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 秒
支援的輸出格式 mp3opuswavpcm
音訊取樣率 最高 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 輸出格式:mp3opuswavpcm。預設值: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 管理控制台 產生金鑰。

推薦文章