廣東話優化的文字轉語音 API

v1最後更新 OpenAPIllms.txt純文字版API Reference

一次 API 呼叫,即可取得廣東話語音

Canto-Gen(港嘢)將廣東話文字轉化為自然、母語水平的語音 — 九聲六調完整保留,語氣詞讀音準確。提交任務(202)、輪詢至完成、下載音訊。附 OpenAPI 3.1 規格。

MCP/Agent 接入

港嘢提供本地 stdio MCP 伺服器(npm 套件 `cantogen-mcp`),零託管成本,為 AI Agent 提供聲線管理與廣東話 TTS 生成能力。註冊後透過 `tools/list` 取得即時工具清單;API key 由使用者自行填入設定檔(如需聲線管理,請勾選 `voices:manage` scope),Agent 全程不會接觸憑證。點擊下方按鈕即可複製設定指示,交由你的 Agent 執行。

支援的 AI 用戶端 / 開發工具

Claude CodeClaude CodeOpenCodeOpenCodeCodexCodexGemini CLIGemini CLICursorCursorCopilotCopilotClineClineAiderAider

MCP tools 一覽

工具說明認證要求所需 Scope
list_gallery列出官方預設聲線(唯讀)sk_ keytts:generate
list_my_voices列出個人聲線sk_ keyvoices:manage
create_my_voice上載本地音頻建立個人聲線(需 plan 支援)sk_ keyvoices:manage
delete_my_voice刪除個人聲線(即時隱藏,不可再用於生成;歷史記錄保留聲線名稱)sk_ keyvoices:manage
tts_generatepreset 模式生成(指定聲線 slug)sk_ keytts:generate
generate_designdesign 模式生成(gender + age)sk_ keytts:generatetts:design
generate_cloneclone 模式生成(本地參考音頻;需 plan 支援)sk_ keytts:generatetts:clone
check_job輪詢非同步生成任務狀態至完成(跟進 /v1/audio/jobs 非同步生成流程)sk_ keytts:generatetts:design
cancel_job取消生成任務(未開始 → 全額退款;生成中 → 收尾後取消,已完成部分仍會計費;已完成不可取消)sk_ keytts:generatetts:design

AI agent 適用 MCP

本地 stdio 架構:MCP 伺服器運行於你自己的機器,金鑰由你填入本機設定檔,不經遠端託管。

取得 API 金鑰

API 請求以 Bearer 方式驗證你的金鑰。金鑰只在建立時顯示一次 — 伺服器端僅儲存 SHA-256 hash,遺失的金鑰只能撤銷後重新建立。

1

在「API 金鑰」頁面建立金鑰

前往「API 金鑰」頁面建立金鑰,然後直接儲存到環境變數:

environmentbash
export CANTOGEN_API_KEY="sk_live_..."

金鑰前綴

sk_live_…唯一的金鑰格式。免費方案金鑰受每日生成上限約束;付費方案用量計入該金鑰的每月字符上限。

Scopes

tts:generate預設。開放 voice 及 design 生成,以及所有讀取 endpoint(聲線目錄、任務查詢)。
tts:cloneclone 模式(以參考樣本複製聲音)必須使用此 scope。
tts:designdesign 模式(gender + age 合成聲線)的細粒度 scope — 已由 tts:generate 涵蓋,兩者其一即可。
voices:manage個人聲線管理(MCP 的 list / create / delete my voices)必須使用此 scope。

每把金鑰附帶的限制

每分鐘 rate limit(預設 60 個請求)及可選的每月字符上限。除 GET /v1/voices(公開聲線目錄,可匿名存取)外,所有 REST endpoint 均以 Authorization: Bearer $CANTOGEN_API_KEY 驗證。

定價

API 存取為付費方案(輕量/入門/專業/工作室)專屬,全速無每日上限。免費方案用戶亦可以建立 API 金鑰試用(每日上限 50 個生成請求;輪詢與下載不計入),升級即解鎖全速存取。

1 字符 = 1 字符,無附加費

API 用量與網頁 Playground 共用同一個帳戶字符池,按帳單週期重置 — 1 字符 = 1 字符,無倍數、無附加費。字符池用完可購買字符包。每個請求的 X-Credits-Charged 回應 header 顯示實扣字符數。

詞彙表

  • 每日生成上限 — 免費方案金鑰每日 50 個生成請求(輪詢與下載不計);付費方案無每日上限。
  • 金鑰每月字符上限 — 每把金鑰本月(UTC)累計計費字符的上限,超出回 403 monthly_cap_reached;預設不設上限。
  • 帳戶字符池 — 帳戶層級的字符餘額,網頁 Playground 與 API 共用,按帳單週期重置;不足時回 402 character_limit_reached。
  • 字符包 — 為帳戶字符池一次性增值,永不過期。
  • 待處理任務上限 — 同一帳戶可同時 pending 的任務數,按方案分級(3/4/5/10/20/20);超限回 429 in_flight_limit_reached。

方案詳情及價錢見/pricing。

快速入門

三分鐘完成第一次生成:列出聲線目錄 → 提交語音任務 → 輪詢結果。

1

列出聲線目錄(GET /v1/voices)

list voicesbash
curl https://canto-gen.com/v1/voices \
  -H "Authorization: Bearer $CANTOGEN_API_KEY"
200 responsejson
{
  "voices": [
    {
      "slug": "sum",
      "name": "心妍",
      "gender": "female",
      "age": "adult",
      "styles": [],
      "preview_url": "https://canto-gen.com/api/voice-clip?slug=sum"
    }
  ]
}

聲線目錄為即時資料 — 請務必從你自己的回應中挑選 slug。此處的 "sum"(心妍)僅為文件示例,或在Playground 圖庫親耳試聽。

2

提交語音任務(POST /v1/audio/jobs)

# Async by design — submit returns 202 with a job_id, then poll.
export CANTOGEN_API_KEY="sk_live_…"

curl -X POST https://canto-gen.com/v1/audio/jobs \
  -H "Authorization: Bearer $CANTOGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "cantogen-tts",
    "voice": "sum",
    "text": "你好,歡迎使用港嘢!",
    "response_format": "mp3"
  }'

回應 — 202 Accepted:

202 responsehttp
HTTP/1.1 202 Accepted
Content-Type: application/json

{
  "job_id": "b7e6f2a1-4c3d-4e5f-8a9b-0c1d2e3f4a5b",
  "status": "queued",
  "poll_url": "/v1/audio/jobs/b7e6f2a1-4c3d-4e5f-8a9b-0c1d2e3f4a5b",
  "srt_requested": false
}

非同步為本 — 附同步快捷方式

非同步 endpoint 回傳 202,附帶 job_id / status / poll_url / srt_requested。無需長連接,長文字不會逾時 — 按自身節奏輪詢即可。短文字(≤300 字符、voice/design)可用 POST /v1/audio/speech 直接取得音訊 bytes(200);同步隊列忙時回傳 503 pool_cold(不扣費;等待超過約 45 秒會轉為 202 供輪詢)。

聲線目錄

以下聲線與風格 preset 全部由資料庫自動同步 — 新增聲線或風格後,本頁自動更新。每個聲線均可在 Playground 試聽。

slug名稱性別年齡場景試聽
keung-gor強哥malemidagenarration
lok-zai樂仔maleadultstory
sung-pak崇伯maleeldernarration
fung-yee鳳儀femaleadultstory
sum-yu芯瑜femaleyoungads
wai小慧femaleadultstory
kay凱琪femaleyoungsports
lok嘉樂maleadultcomedy
sum心妍femaleadultnews
wing-lam-2穎琳femaleadultbusiness
bon阿邦maleadultnarration
ah-sum阿森maleyoungnarration
sze-kei思琪femalemidagenarration
hoi小海maleyoungads
wang-tat宏達maleyoungnarration

生成參數 presets(節奏・情緒・音色)

節奏一句一頓一字一頓一氣呵成中性自然含糊慵懶大起大落字正腔圓平鋪直敘抑揚起伏擲地有聲輕聲細語邊諗邊講
情緒冷靜喜悅嘲諷好奇媚惑嫉妒安心寂寞平和心痛悲傷悲愴愉快感慨慈愛憤怒欣喜沮喪溫柔滿足激昂焦躁熱情絕望緊張自豪認真雀躍驚慌驚訝

presets 係生成參數,配任何 slug 都得 — 同樣由資料庫同步。

聲音模式

選用圖庫聲線、以文字描述一個新聲線、或由樣本複製。每次請求只可使用其中一種模式。

三種模式互斥

三種聲音模式互斥:每次請求只可傳入 voice、design 或 clone 其中一項 — 否則回傳 400 voice_mode_conflict。設計及複製的聲線僅對該次請求生效,不會儲存為可重用的聲線資產。
voicedefault

圖庫聲線

以 slug 直接選用廣東話優化圖庫中的現成聲線。

  • 瀏覽 GET /v1/voices — 所有預設聲線均以廣東話為母語,附試聽片段。
  • 將 slug 作為 voice 參數傳入。文件示例為 sum(心妍)— 請務必從你自己的回應中挑選 slug。slug 為 ASCII 穩定識別符(行業標準做法),中文名作介面顯示之用。
voice 示例bash
# Async by design — submit returns 202 with a job_id, then poll.
export CANTOGEN_API_KEY="sk_live_…"

curl -X POST https://canto-gen.com/v1/audio/jobs \
  -H "Authorization: Bearer $CANTOGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "cantogen-tts",
    "voice": "sum",
    "text": "你好,歡迎使用港嘢!",
    "response_format": "mp3"
  }'
designzero audio

設計聲線

以純文字描述一個合成聲線 — 指定 gender 與 age,無需上載任何音訊檔。

  • gender: male | female · age: child | teen | young | adult | midage | elder — 兩項均必填。
  • 適合產品人設;可自由搭配 emotion 及 srt 參數。
design 示例bash
curl -X POST https://canto-gen.com/v1/audio/jobs \
  -H "Authorization: Bearer $CANTOGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "cantogen-tts",
    "design": { "gender": "female", "age": "young" },
    "text": "今日天氣幾好,一齊去行山啦。",
    "style": "brisk",
    "emotion": "happy",
    "srt": true
  }'
clonetts:clone scope

複製聲線

上載參考樣本 — 平台在內部轉錄(ASR)並自動套用逐字稿,客戶端無需額外呼叫。

  • reference_audio: data URL 或 raw base64 — 支援 audio/mpeg、wav、webm、mp4/m4a、ogg。單一請求上限 4.4 MB(base64 編碼後音訊約 ≤3 MB)。
  • 樣本至少 8 秒(不足會被拒絕);處理時按句界自動裁至約 15–20 秒、上限 30 秒 — 乾淨樣本效果最佳。
  • 只需 reference_audio;舊版 prompt_text 欄位已退役(送出會被忽略)。
  • 需要具備 tts:clone scope 的 API 金鑰。
clone 示例bash
B64=$(base64 -w0 sample.wav)

curl -X POST https://canto-gen.com/v1/audio/jobs \
  -H "Authorization: Bearer $CANTOGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"model\": \"cantogen-tts\",
    \"clone\": {
      \"reference_audio\": \"data:audio/wav;base64,$B64\"
    },
    \"text\": \"用我把聲講呢句嘢。\"
  }"

生成參數(所有模式共用)

style演繹風格 — 建議使用英文 slug:節奏 steady(平穩) / composed(從容) / rapid(急促) / slow(慢板) / drawl(拖長) / brisk(明快) / dynamic(起伏) / staccato(頓挫);音色 mellow(圓潤) / cute(奶音) / sharp(尖細) / lazy(懶音) / breathy(氣聲) / hoarse(沙啞) / deep(洪厚) / crisp(清脆) / feeble(無力) / trembling(顫音);場景/角色 slug 同樣接受(corporate/promo/…/storytelling(講古)/sports 等)。原有中文 preset 值(明快/圓潤 等)仍作別名接受 — 兩者內部會正規化到同一 canonical 值;其他自由文字原樣接受。
emotion9 個支援值其中之一(見下方 chips)。注意:API enum 使用英文值(happy/excited 等),並以英文原樣傳入引擎;與 Playground 介面的中文情緒 preset(雀躍/冷靜 等)屬兩套不同體系 — 中文情緒 preset 僅限 Playground 使用,API emotion 參數不接受中文值。
instruction自由文字演繹指示,上限 500 字符。優先次序:style → emotion → instruction — instruction 有最終決定權。
pitch已棄用(2026-09-20):原音交付下不生效(接受參數但忽略其值)。歷史範圍 −12…+12 半音,預設 0。
volume已棄用(2026-09-20):原音交付下不生效(接受參數但忽略其值)。歷史範圍 0–10,預設 1。
response_formatmp3(預設)/ wav。
srttrue → 完成後的任務附帶 srt 欄位(以較高字符費率計費)。全方案適用。
happysadangryfearfuldisgustedsurprisedneutralexcitedgentle

參數上限

  • text (async) — POST /v1/audio/jobs 文字上限 500 字符;超出回 400 text_too_long,不會截斷。
  • text (sync) — POST /v1/audio/speech 上限 300 計費字符(voice/design);超出請改用非同步。
  • instruction — 自由文字演繹指示上限 500 字符;超出回 400 invalid_instruction。
  • style — 英文 slug(節奏/音色/場景/角色);原有中文 preset 值作別名接受,兩者正規化到同一 canonical 值;其他自由文字原樣接受。
  • emotion — 9 個英文封閉 enum 值之一(見 chips);不接受中文值。
  • synthesis order — style → emotion → instruction;instruction 有最終決定權。
  • clone.reference_audio — base64 data URL 或 raw,單一請求 ≤4.4 MB(音頻約 ≤3 MB);只需 reference_audio — 舊版 prompt_text 已退役(送出會被忽略)。
  • design — gender(male/female)+ age(child/teen/young/adult/midage/elder)。
  • speed — 已移除(2026-10-14)— 送入會被靜默忽略;語速可透過 clone `control` 描述表達(慢/正常/快)。
  • transcription(文件轉寫) — POST /v1/asr/transcribe — 單檔 ≤20 MB;單請求音頻同步實務上限約 9 分鐘(4 小時已規劃、未上線);每日計費音頻 24 小時;response_format 支援 json/text(srt/verbose_json 暫不支援)。

輪詢與 SRT

短文字任務通常數秒內完成。以 2–5 秒退避輪詢至任務完成,然後下載預簽名音訊。

POST /v1/audio/jobs202 · job_id
GET /v1/audio/jobs/{id}輪詢 · 2–5 秒退避
status: completedaudio_url 就緒
GET audio_url預簽名 · 無需驗證

查詢任務狀態

GET /v1/audio/jobs/{id}bash
curl https://canto-gen.com/v1/audio/jobs/b7e6f2a1-4c3d-4e5f-8a9b-0c1d2e3f4a5b \
  -H "Authorization: Bearer $CANTOGEN_API_KEY"

完成後的回應

completed jobjson
{
  "job_id": "b7e6f2a1-4c3d-4e5f-8a9b-0c1d2e3f4a5b",
  "status": "completed",
  "poll_url": "/v1/audio/jobs/b7e6f2a1-4c3d-4e5f-8a9b-0c1d2e3f4a5b",
  "srt_requested": true,
  "srt": "1\n00:00:00,000 --> 00:00:02,400\n你好,歡迎使用港嘢!",
  "audio_url": "https://canto-gen.com/storage/v1/object/sign/audio_history/..."
}
以退避方式輪詢(Node)js
// Poll until completed — back off 2–5 s between attempts.
async function pollJob(jobId, maxAttempts = 60) {
  for (let i = 0; i < maxAttempts; i++) {
    const res = await fetch(`https://canto-gen.com/v1/audio/jobs/${jobId}`, {
      headers: { Authorization: `Bearer ${process.env.CANTOGEN_API_KEY}` },
    });
    const job = await res.json();
    if (job.status === "completed") return job; // job.audio_url is ready
    if (job.status === "failed" || job.status === "cancelled") {
      throw new Error(`job ${job.status}`);
    }
    await new Promise((r) => setTimeout(r, Math.min(2000 + i * 500, 5000)));
  }
  throw new Error("poll timeout");
}

audio_url 會過期 — 請盡早下載

audio_url 為預簽名連結,設有有效期:由素材音訊庫直接供應時有效期為 1 小時,由生成節點即時供應時為 7 天。請盡早下載;連結過期後重新查詢該任務即可取得新連結。任務在 queued/processing 期間以及 failed/cancelled 任務,均不附帶 audio_url 欄位。

字幕(SRT)

提交時傳入 "srt": true,完成後任務的查詢回應會附上 srt 欄位,內容為字幕(如上方完成回應所示)。srt_requested 欄位必定存在;srt 只在已要求且已就緒時出現。SRT 字幕輸出全方案適用。

計費細節

計費細節:任務的帳戶 credit 包含 SRT 附加費(srt: true 時 billedCharacters 會高於基本字符數),而每金鑰每月上限的帳本則按提交文字長度直接計算。SRT 字幕輸出全方案適用。

Rate limit 與上限

回應 header說明
X-RateLimit-Limit此金鑰的每分鐘請求上限(預設 60;可在建立金鑰時設定)。
X-RateLimit-Remaining目前 60 秒滑動視窗內剩餘的請求次數。
X-RateLimit-Reset視窗重設時間(Unix epoch 秒)。
Retry-After附於 429 回應;請等候指定秒數再重試。

每月字符上限 — 金鑰本月至今(UTC)的計費字符數必須低於其上限(null = 無限制)。超限會回傳 403 monthly_cap_reached 並附 used 數字,直至該月重設。X-RateLimit-* headers 附於 POST /v1/audio/jobs 的 202 及 429 回應、以及 POST /v1/audio/speech 的 429 回應(200 回應附帶 X-Credits-Charged 等 usage headers);讀取 endpoint(GET /v1/audio/jobs/{id}、GET /v1/voices)不受 rate limit 限制。兩個計量器均以「故障時放行」為設計原則 — 計量系統故障絕不會令請求被拒。

實時 WebSocket(Realtime)

適合互動式、低延遲的語音場景。

除 REST 外,港嘢另提供 WebSocket 實時端點:在單一長連線上傳送文字並接收串流 PCM 音訊,適合自帶 LLM 的語音應用。協議以 OpenAI Realtime 為基礎;港嘢新增的事件與欄位一律標明為 extension。

wss://api.canto-gen.com/v1/audio/realtime

認證

認證方式與 REST 相同:sk_ API 金鑰,所需 scope 為 tts:generate。優先使用 Authorization: Bearer sk_… header;瀏覽器 WebSocket API 無法設定自訂 header,可改用 query 參數 ?api_key=sk_…(別名 ?token=)。query 參數會寫入 URL、伺服器日誌與瀏覽器歷史,存在洩漏風險,僅限瀏覽器環境使用;伺服器端請求一律使用 header。

事件 — client → server

session.updateOpenAI 原生建立/更新 session 設定:voice、language、output_audio_format、max_session_chars、tts.segmentation。
conversation.item.createOpenAI 原生提交一段明確文字(input_text);觸發合成。
input_text.append港嘢 extension串流傳送原始 token delta。
input_text.commit港嘢 extension強制段落邊界(立即 flush)。
response.createOpenAI 原生觸發合成。
response.cancelOpenAI 原生barge-in:停止當前句子並退款。
session.close港嘢 extension主動關閉連線並結算。

事件 — server → client

session.createdOpenAI 原生連線建立;附伺服器簽發(server-minted)的 session id。
session.updatedOpenAI 原生設定更新確認。
response.createdOpenAI 原生單句開始合成。
response.output_audio.deltaOpenAI 原生base64 PCM16 @ 48 kHz 音訊 chunk。
response.output_audio.doneOpenAI 原生單句音訊完成。
response.doneOpenAI 原生單句結束;usage 附 input_chars/billed_chars/remaining(extension 欄位)。
errorOpenAI 原生{type, code, message, http_status}。

切句模式(tts.segmentation)

tts.segmentation(extension)控制切句方式:{"mode":"server"}(預設)由伺服器按標點自動切句並逐句合成 — client 只需持續 append token;{"mode":"client"} 則由 client 透過 conversation.item.create / input_text.commit 自行決定段落邊界。可選 min_chars / max_chars / punctuation。

限制與逾時

  • idle_timeout — 閒置 120 秒(無任何 app-level 活動)→ 伺服器關閉連線並結算。
  • max_session_duration — free plan 單一 session 最長 5 分鐘;付費 plan 無時長上限(達全域上限時關閉)。
  • max_sessions_per_user — 同一用戶的同時 session 上限按 plan 階梯:free 1/lite 2/starter 3/pro 4/studio 5/enterprise 5;未知 plan 一律視為 free。
  • max_sessions_global — 全平台同時最多 8 個 session。
  • max_session_chars — 每個 session 計費字符上限(預設 2000,可經 session.update 調整);超出回 session_char_limit_exceeded。
  • max_in_flight — 每 session 同時最多 3 句未結算。
  • raw_ingress — 每 session 原始輸入上限 20,000 字符、每分鐘 5,000 字符(標點與空白亦計);超出回 raw_limit_exceeded,即時拒絕。
  • lease — 每句合成有 60 秒結算租約;逾時未完成會自動退款。
  • rate_limit / monthly_cap — 沿用同一金鑰的每分鐘 rate limit 及每月字符上限;用量帳本逐句記錄(per utterance)。
  • daily_generation_limit — 免費方案每日 50 個生成句(與 REST 共用同一計數,輪詢與下載不計);超出回 sandbox_daily_limit(429),付費方案無每日上限。
  • frame_size — 單一 WS 訊息上限 64 KiB。
  • heartbeat — 伺服器定期 ping;心跳不計入 app 活動。
Node 範例 clientjs
// npm i ws   — one long-lived connection: stream tokens in, stream PCM out.
import WebSocket from "ws";

const ws = new WebSocket("wss://api.canto-gen.com/v1/audio/realtime", {
  headers: { Authorization: `Bearer ${process.env.CANTOGEN_API_KEY}` },
});

ws.on("open", () => {
  ws.send(JSON.stringify({
    type: "session.update",
    session: { voice: "sum", language: "yue", output_audio_format: "pcm16", max_session_chars: 500 },
  }));
  // One explicit utterance — or keep sending input_text.append deltas.
  ws.send(JSON.stringify({
    type: "conversation.item.create",
    item: { type: "message", content: [{ type: "input_text", text: "你好,歡迎使用港嘢!" }] },
  }));
});

const chunks = [];
ws.on("message", (raw) => {
  const ev = JSON.parse(raw.toString());
  if (ev.type === "session.created") console.log("session", ev.session.id);
  if (ev.type === "response.output_audio.delta") chunks.push(Buffer.from(ev.delta, "base64"));
  if (ev.type === "response.done") {
    // PCM16 @ 48 kHz — feed an AudioWorklet or write the chunks to disk.
    console.log("billed", ev.response.usage.billed_chars, "remaining", ev.response.usage.remaining);
    ws.close();
  }
  if (ev.type === "error") console.error(ev.error.code, ev.error.message);
});

錯誤碼

invalid_api_key401金鑰缺失、無效、過期或 scope 不符。
rate_limit_exceeded429觸及每金鑰每分鐘上限;附 retry_after。
sandbox_daily_limit429免費方案每日 50 個生成句已用完(與 REST 共用計數);明日再試或升級方案。
monthly_cap_reached429已達金鑰本月字符上限。
character_limit_reached402帳戶字符池不足,該句不會合成。
concurrency_limit_reached429同時 session 或同時未結算句數已達上限。
session_char_limit_exceeded403已達本次 session 字數上限。
raw_limit_exceeded413原始輸入量(含標點/空白)超出上限。
text_too_long400單段文字超出上限。
invalid_session400session 已關閉或狀態無效。
engine_unavailable503實時引擎暫時不可用;請重試。

錯誤碼

錯誤回應使用穩定的機器可讀 error 代碼,另附可選的人類可讀 message。

錯誤格式json
{
  "error": "text_too_long",
  "message": "text exceeds 500 characters."
}
HTTPerror code原因處理方法
400invalid_modelmodel 必須是 "cantogen-tts"(或省略)。省略 model,或設為 "cantogen-tts"。
400voice_mode_conflict同時傳入了多於一個 voice / design / clone — 三種模式互斥。每次請求只傳入一種聲音模式。
400text_requiredtext 缺失或空白。傳入非空 text(1–500 字符)。
400text_too_longtext 超過 500 字符。請拆分文字 — 超限請求會被拒絕,不會截斷處理。
400unsupported_formatresponse_format 必須是 mp3 或 wav。使用 mp3 或 wav。
400invalid_pitchpitch 必須介乎 −12 至 +12 半音。將 pitch 調整至有效範圍。
400invalid_volumevolume 必須介乎 0 至 10。將 volume 調整至有效範圍。
400invalid_emotionemotion 不在 9 個支援值之內。使用 9 個支援的情緒值之一。
400invalid_srtsrt 必須是 boolean。使用 true / false。
400reference_audio_requiredclone.reference_audio 缺失。附上 base64 參考樣本。
400invalid_reference_audioclone.reference_audio 不是有效的 base64 音訊。傳入 data URL(data:audio/…;base64,…) 或 raw base64。
400invalid_reference_audio_sizeclone.reference_audio 音頻超過約 3 MB(JSON API 單一請求上限)。縮短樣本(至少 8 秒即可)再試。
400spoken_text_requiredtext 無可朗讀內容 — 計費字符為 0(只剩標點/空白/emoji/tone tags)。傳入含可讀文字的 text。
400design_gender_and_age_requireddesign.gender 與 design.age 兩項均必填。同時提供兩個欄位。
400invalid_job_id查詢或取消所用的 id 不是 UUID。檢查 job_id。
400invalid_requestbody 不是有效 JSON,或 Content-Type 非 JSON(/v1 僅接受 application/json);文件轉寫則為 multipart 缺 `file`/`model`、音檔為空或音檔格式不支援。以 Content-Type: application/json 傳送合法 JSON body。
413payload_too_large請求超過大小上限 — JSON API 4.4 MB(通常為 clone 參考樣本過長);文件轉寫音檔 25 MB。縮短參考樣本(音頻 ≤3 MB;樣本至少 8 秒即可);文件轉寫請縮短音檔再試。
401invalid_or_expired_tokenAPI 金鑰缺失、無效、已過期或已被撤銷。建立新金鑰並檢查 Bearer header。
402character_limit_reached帳戶字符池不足以完成本次生成(回應內含 remaining)。購買字符包或等待月度重置。
403insufficient_scope金鑰缺少所需 scope(複製聲音需要 tts:clone);回應內含 "scope"。建立具備所需 scope 的金鑰。
403monthly_cap_reached金鑰的每月字符上限已達;回應內含 "used"。等候 UTC 月份重設,或調高上限。
404job_not_found沒有此 id 的任務(或任務屬於另一金鑰)。檢查 job_id 及提交時所用的金鑰。
409already_settled任務已屬終態(completed/failed/cancelled),無法再取消,亦不會退款。改以 GET /v1/audio/jobs/{id} 查詢最終狀態。
409duplicate_request同一個 Idempotency-Key(alias x-idempotency-key)已提交過(重試安全:不會重複扣費)。沿用原本的 job_id 輪詢,或以新 key 提交新任務。
404not_found沒有此 endpoint(路徑有誤)。對照 /v1/openapi.json 的路徑。
403batch_requires_pro批量生成(items)為入門/專業/工作室方案功能。單句任務的並行上限按方案分級(free 3/輕量 4/入門 5/專業 10/工作室 20/企業 20 個 pending),超上限回 429 in_flight_limit_reached。待現有任務完成後再提交,或升級至入門/專業/工作室方案以解鎖批量生成與更高並行上限。
429capacity_exceeded公開 API 生成池到頂(全域並發上限)。等候 Retry-After 秒再試,或改用非同步 `POST /v1/audio/jobs`。
429rate_limit_exceeded已觸及每金鑰每分鐘上限。等候 Retry-After 秒(回應內容亦以 retry_after 標示),然後重試。
429sandbox_daily_limit免費方案每日 50 個生成請求上限已用完;輪詢與下載不受此限。明日再試,或升級至輕量方案解鎖全速 API。
429api_busyAPI 生成隊列已達全域容量上限(受理前即拒,不扣費)。稍候數秒重試。
502audio_delivery_failed生成已完成,但音訊提取失敗。改以 GET /v1/audio/jobs/{id} 輪詢並下載 audio_url。
503sync_generation_failed同步等待期間任務失敗或被取消(已自動退款)。改用 POST /v1/audio/jobs(非同步)重試。
503reference_upload_failedclone 參考音頻暫時儲存失敗。直接重試。
400unsupported_response_format文件轉寫的 response_format 暫只支援 json/text — srt/verbose_json 需要段級時間戳,暫未提供。使用 json 或 text。
402insufficient_balance預付餘額不足以預扣本次文件轉寫費用(未開始處理、零扣費)。前往 /account/billing 儲值後重試(失敗不扣費)。
429daily_limit_exceeded已達每日計費音頻上限(24 小時/日,香港時間日界)。香港時間明日再試。
503engine_unavailable文件轉寫服務暫時不可用(音檔時長偵測失敗、計費系統或轉寫管線暫時故障;超出現階段同步交付能力亦歸此類)。已預扣金額全額退回。稍後重試;不會產生費用。

基礎建設

為正式流量預留專用容量。

API 語音負載運行於專用 GPU 池 — 與互動 Playground 完全隔離,正式流量不會與任何瀏覽器工作階段爭奪算力。

參考與下載

本頁為快速入門指南;/v1/docs/reference(Scalar)為詳細的 API 參考 — 每個 endpoint 的完整 request/response schema、所有錯誤碼與 try-it 面板均在其內。本頁全部內容同時提供機器可讀格式。

下載bash
# OpenAPI 3.1 規格 — 直接生成你所用語言的 typed client
curl https://canto-gen.com/v1/openapi.json

# 本頁純文字 Markdown 版
curl https://canto-gen.com/v1/docs.md

# Agent 索引(llms.txt)
curl https://canto-gen.com/llms.txt

複製本頁 Markdown、或取用 Markdown/llms.txt/OpenAPI 機器可讀版本。