文字轉語音

把一段文字變成自然的語音。短句直接用「簡易」端點, 需要停頓控制或長文本則用「進階」端點。兩者的回應都是音檔位元流本身。

怎麼選

簡易 /TTS/Speech進階 /TTS/generate-voice
請求結構扁平分成 input / voice / audio_config
停頓標籤不支援支援 [:秒數]
適合單句、短段落長文本、需要節奏控制

共通設定

輸出格式

x-output-format header 指定,預設 wav

格式MIME說明
wavaudio/wav預設,完整生成後才回傳
mp3audio/mpeg檔案較小,適合網路傳輸
pcmaudio/pcmstreaming 邊生成邊傳輸,延遲最低。免費版無法使用

pitch_shift 設成非 0 時,無法以 streaming 傳輸, 即使指定了 pcm 也會等完整生成。

採樣率

x-sample-rate header 指定,可填 8000160003200044100。上限依模型而異,超過會回 400:

  • Classic — 預設 44100
  • Neo — 預設與上限皆為 32000
  • Sota+ — 預設與上限皆為 24000

回應 header

成功時除了音檔本身,還會附帶 x-used-quota(本次消耗點數)、 x-sample-ratex-bit-depthx-channels

簡易:單句轉語音

POST /TTS/Speech

Request body

version string 選填 預設 Sota+
ClassicNeoSota+
text string 必填
要轉成語音的文字,上限 1000 字
speaker string 必填
配音員名稱,如 佑希。可用清單見 配音員與模型
style string 必填
語音風格,如 預設聊天。每位配音員支援的風格不同。
speed number 選填 預設 1
語速,範圍 [0.5, 1.5]
pitch_shift number 選填 預設 0
音調偏移,範圍 [-5, 5]。非 0 時無法 streaming。
style_weight number 選填 預設 0.5
風格強度,範圍 [0, 1]Classic 支援
breath_pause number 選填 預設 0
句間停頓秒數,範圍 [0, 10]
curl --location '{{BASE_URL}}/TTS/Speech' \
  --header 'x-api-key: your-api-key' \
  --header 'x-output-format: wav' \
  --header 'Content-Type: application/json' \
  --data '{
    "version": "Sota+",
    "text": "VoAI 絕好聲創的聲音,符合臺灣口音,又自然流暢。",
    "speaker": "佑希",
    "style": "聊天",
    "speed": 1,
    "pitch_shift": 0,
    "style_weight": 0.5,
    "breath_pause": 0
  }' \
  --output output.wav
                        
import requests

resp = requests.post(
    "{{BASE_URL}}/TTS/Speech",
    headers={"x-api-key": "your-api-key", "x-output-format": "wav"},
    json={
        "version": "Sota+",
        "text": "VoAI 絕好聲創的聲音,符合臺灣口音,又自然流暢。",
        "speaker": "佑希",
        "style": "聊天",
        "speed": 1,
    },
    timeout=120,
)
resp.raise_for_status()

with open("output.wav", "wb") as f:
    f.write(resp.content)

print("used quota:", resp.headers.get("x-used-quota"))
                        
import { writeFile } from "node:fs/promises";

const resp = await fetch("{{BASE_URL}}/TTS/Speech", {
  method: "POST",
  headers: {
    "x-api-key": "your-api-key",
    "x-output-format": "wav",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    version: "Sota+",
    text: "VoAI 絕好聲創的聲音,符合臺灣口音,又自然流暢。",
    speaker: "佑希",
    style: "聊天",
  }),
});

if (!resp.ok) throw new Error(await resp.text());
await writeFile("output.wav", Buffer.from(await resp.arrayBuffer()));
                        

進階:停頓標籤與長文本

POST /TTS/generate-voice

請求拆成 inputvoiceaudio_config 三段。 文字內可插入 [:2] 表示停頓 2 秒。

停頓標籤規則

  • 兩個停頓標記之間的文字建議不少於 20 字
  • 標記與開頭/結尾之間的文字建議不少於 20 字
  • 有效位數到小數點後一位
  • 最多 5 秒,超過視為 5 秒

Request body

input.voai_script_text string 必填
帶停頓標籤的文字,上限 1000 字。
voice object 必填
包含 name(配音員)、style(風格)、model(模型版本)。
audio_config object 選填
speedpitch_shiftstyle_weightbreath_pause,範圍與簡易端點相同。未指定則用預設值。
curl --location '{{BASE_URL}}/TTS/generate-voice' \
  --header 'x-api-key: your-api-key' \
  --header 'x-output-format: wav' \
  --header 'Content-Type: application/json' \
  --data '{
    "input": {
      "voai_script_text": "絕好聲創的聲音,不僅清晰自然,還融入了情感與真實感,展現了[:2]先進技術的極致魅力。它是業界的標竿,深受廣大用戶的信賴與推崇,是現代智慧語音技術的代表作。"
    },
    "voice": {
      "name": "佑希",
      "style": "預設",
      "model": "Neo"
    },
    "audio_config": {
      "speed": 1,
      "pitch_shift": 0,
      "style_weight": 0.5,
      "breath_pause": 0
    }
  }' \
  --output output.wav
                        
import requests

resp = requests.post(
    "{{BASE_URL}}/TTS/generate-voice",
    headers={"x-api-key": "your-api-key", "x-output-format": "wav"},
    json={
        "input": {
            "voai_script_text": "絕好聲創的聲音,不僅清晰自然,還融入了情感與真實感,展現了[:2]先進技術的極致魅力。它是業界的標竿,深受廣大用戶的信賴與推崇,是現代智慧語音技術的代表作。"
        },
        "voice": {"name": "佑希", "style": "預設", "model": "Neo"},
        "audio_config": {"speed": 1, "pitch_shift": 0, "style_weight": 0.5, "breath_pause": 0},
    },
    timeout=180,
)
resp.raise_for_status()

with open("output.wav", "wb") as f:
    f.write(resp.content)
                        

錯誤

400 參數不合法、免費版使用 pcm、採樣率超出模型上限,或額度不足
401 未提供或無效的 API Key
529 併發數量已達上限,請退避後重試
500 伺服器內部錯誤