廣東話優化的文字轉語音 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 用戶端 / 開發工具
Codex
AiderMCP tools 一覽
| 工具 | 說明 | 認證要求 | 所需 Scope |
|---|---|---|---|
| list_gallery | 列出官方預設聲線(唯讀) | sk_ key | tts:generate |
| list_my_voices | 列出個人聲線 | sk_ key | voices:manage |
| create_my_voice | 上載本地音頻建立個人聲線(需 plan 支援) | sk_ key | voices:manage |
| delete_my_voice | 刪除個人聲線(即時隱藏,不可再用於生成;歷史記錄保留聲線名稱) | sk_ key | voices:manage |
| tts_generate | preset 模式生成(指定聲線 slug) | sk_ key | tts:generate |
| generate_design | design 模式生成(gender + age) | sk_ key | tts:generatetts:design |
| generate_clone | clone 模式生成(本地參考音頻;需 plan 支援) | sk_ key | tts:generatetts:clone |
| check_job | 輪詢非同步生成任務狀態至完成(跟進 /v1/audio/jobs 非同步生成流程) | sk_ key | tts:generatetts:design |
| cancel_job | 取消生成任務(未開始 → 全額退款;生成中 → 收尾後取消,已完成部分仍會計費;已完成不可取消) | sk_ key | tts:generatetts:design |
AI agent 適用 MCP
取得 API 金鑰
API 請求以 Bearer 方式驗證你的金鑰。金鑰只在建立時顯示一次 — 伺服器端僅儲存 SHA-256 hash,遺失的金鑰只能撤銷後重新建立。
金鑰前綴
| sk_live_… | 唯一的金鑰格式。免費方案金鑰受每日生成上限約束;付費方案用量計入該金鑰的每月字符上限。 |
Scopes
| tts:generate | 預設。開放 voice 及 design 生成,以及所有讀取 endpoint(聲線目錄、任務查詢)。 |
| tts:clone | clone 模式(以參考樣本複製聲音)必須使用此 scope。 |
| tts:design | design 模式(gender + age 合成聲線)的細粒度 scope — 已由 tts:generate 涵蓋,兩者其一即可。 |
| voices:manage | 個人聲線管理(MCP 的 list / create / delete my voices)必須使用此 scope。 |
每把金鑰附帶的限制
GET /v1/voices(公開聲線目錄,可匿名存取)外,所有 REST endpoint 均以 Authorization: Bearer $CANTOGEN_API_KEY 驗證。定價
API 存取為付費方案(輕量/入門/專業/工作室)專屬,全速無每日上限。免費方案用戶亦可以建立 API 金鑰試用(每日上限 50 個生成請求;輪詢與下載不計入),升級即解鎖全速存取。
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。
快速入門
三分鐘完成第一次生成:列出聲線目錄 → 提交語音任務 → 輪詢結果。
列出聲線目錄(GET /v1/voices)
curl https://canto-gen.com/v1/voices \
-H "Authorization: Bearer $CANTOGEN_API_KEY"{
"voices": [
{
"slug": "sum",
"name": "心妍",
"gender": "female",
"age": "adult",
"styles": [],
"preview_url": "https://canto-gen.com/api/voice-clip?slug=sum"
}
]
}聲線目錄為即時資料 — 請務必從你自己的回應中挑選 slug。此處的 "sum"(心妍)僅為文件示例,或在Playground 圖庫親耳試聽。
提交語音任務(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:
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
}非同步為本 — 附同步快捷方式
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 | 強哥 | male | midage | narration | |
| lok-zai | 樂仔 | male | adult | story | |
| sung-pak | 崇伯 | male | elder | narration | |
| fung-yee | 鳳儀 | female | adult | story | |
| sum-yu | 芯瑜 | female | young | ads | |
| wai | 小慧 | female | adult | story | |
| kay | 凱琪 | female | young | sports | |
| lok | 嘉樂 | male | adult | comedy | |
| sum | 心妍 | female | adult | news | |
| wing-lam-2 | 穎琳 | female | adult | business | |
| bon | 阿邦 | male | adult | narration | |
| ah-sum | 阿森 | male | young | narration | |
| sze-kei | 思琪 | female | midage | narration | |
| hoi | 小海 | male | young | ads | |
| wang-tat | 宏達 | male | young | narration |
生成參數 presets(節奏・情緒・音色)
presets 係生成參數,配任何 slug 都得 — 同樣由資料庫同步。
聲音模式
選用圖庫聲線、以文字描述一個新聲線、或由樣本複製。每次請求只可使用其中一種模式。
三種模式互斥
voicedefault圖庫聲線
以 slug 直接選用廣東話優化圖庫中的現成聲線。
- 瀏覽 GET /v1/voices — 所有預設聲線均以廣東話為母語,附試聽片段。
- 將 slug 作為 voice 參數傳入。文件示例為 sum(心妍)— 請務必從你自己的回應中挑選 slug。slug 為 ASCII 穩定識別符(行業標準做法),中文名作介面顯示之用。
# 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 參數。
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 金鑰。
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 值;其他自由文字原樣接受。 |
| emotion | 9 個支援值其中之一(見下方 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_format | mp3(預設)/ wav。 |
| srt | true → 完成後的任務附帶 srt 欄位(以較高字符費率計費)。全方案適用。 |
參數上限
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_idGET /v1/audio/jobs/{id}輪詢 · 2–5 秒退避status: completedaudio_url 就緒GET audio_url預簽名 · 無需驗證查詢任務狀態
curl https://canto-gen.com/v1/audio/jobs/b7e6f2a1-4c3d-4e5f-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $CANTOGEN_API_KEY"完成後的回應
{
"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/..."
}// 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 會過期 — 請盡早下載
字幕(SRT)
提交時傳入 "srt": true,完成後任務的查詢回應會附上 srt 欄位,內容為字幕(如上方完成回應所示)。srt_requested 欄位必定存在;srt 只在已要求且已就緒時出現。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.update | OpenAI 原生 | 建立/更新 session 設定:voice、language、output_audio_format、max_session_chars、tts.segmentation。 |
| conversation.item.create | OpenAI 原生 | 提交一段明確文字(input_text);觸發合成。 |
| input_text.append | 港嘢 extension | 串流傳送原始 token delta。 |
| input_text.commit | 港嘢 extension | 強制段落邊界(立即 flush)。 |
| response.create | OpenAI 原生 | 觸發合成。 |
| response.cancel | OpenAI 原生 | barge-in:停止當前句子並退款。 |
| session.close | 港嘢 extension | 主動關閉連線並結算。 |
事件 — server → client
| session.created | OpenAI 原生 | 連線建立;附伺服器簽發(server-minted)的 session id。 |
| session.updated | OpenAI 原生 | 設定更新確認。 |
| response.created | OpenAI 原生 | 單句開始合成。 |
| response.output_audio.delta | OpenAI 原生 | base64 PCM16 @ 48 kHz 音訊 chunk。 |
| response.output_audio.done | OpenAI 原生 | 單句音訊完成。 |
| response.done | OpenAI 原生 | 單句結束;usage 附 input_chars/billed_chars/remaining(extension 欄位)。 |
| error | OpenAI 原生 | {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 活動。
// 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_key | 401 | 金鑰缺失、無效、過期或 scope 不符。 |
| rate_limit_exceeded | 429 | 觸及每金鑰每分鐘上限;附 retry_after。 |
| sandbox_daily_limit | 429 | 免費方案每日 50 個生成句已用完(與 REST 共用計數);明日再試或升級方案。 |
| monthly_cap_reached | 429 | 已達金鑰本月字符上限。 |
| character_limit_reached | 402 | 帳戶字符池不足,該句不會合成。 |
| concurrency_limit_reached | 429 | 同時 session 或同時未結算句數已達上限。 |
| session_char_limit_exceeded | 403 | 已達本次 session 字數上限。 |
| raw_limit_exceeded | 413 | 原始輸入量(含標點/空白)超出上限。 |
| text_too_long | 400 | 單段文字超出上限。 |
| invalid_session | 400 | session 已關閉或狀態無效。 |
| engine_unavailable | 503 | 實時引擎暫時不可用;請重試。 |
錯誤碼
錯誤回應使用穩定的機器可讀 error 代碼,另附可選的人類可讀 message。
{
"error": "text_too_long",
"message": "text exceeds 500 characters."
}| HTTP | error code | 原因 | 處理方法 |
|---|---|---|---|
| 400 | invalid_model | model 必須是 "cantogen-tts"(或省略)。 | 省略 model,或設為 "cantogen-tts"。 |
| 400 | voice_mode_conflict | 同時傳入了多於一個 voice / design / clone — 三種模式互斥。 | 每次請求只傳入一種聲音模式。 |
| 400 | text_required | text 缺失或空白。 | 傳入非空 text(1–500 字符)。 |
| 400 | text_too_long | text 超過 500 字符。 | 請拆分文字 — 超限請求會被拒絕,不會截斷處理。 |
| 400 | unsupported_format | response_format 必須是 mp3 或 wav。 | 使用 mp3 或 wav。 |
| 400 | invalid_pitch | pitch 必須介乎 −12 至 +12 半音。 | 將 pitch 調整至有效範圍。 |
| 400 | invalid_volume | volume 必須介乎 0 至 10。 | 將 volume 調整至有效範圍。 |
| 400 | invalid_emotion | emotion 不在 9 個支援值之內。 | 使用 9 個支援的情緒值之一。 |
| 400 | invalid_srt | srt 必須是 boolean。 | 使用 true / false。 |
| 400 | reference_audio_required | clone.reference_audio 缺失。 | 附上 base64 參考樣本。 |
| 400 | invalid_reference_audio | clone.reference_audio 不是有效的 base64 音訊。 | 傳入 data URL(data:audio/…;base64,…) 或 raw base64。 |
| 400 | invalid_reference_audio_size | clone.reference_audio 音頻超過約 3 MB(JSON API 單一請求上限)。 | 縮短樣本(至少 8 秒即可)再試。 |
| 400 | spoken_text_required | text 無可朗讀內容 — 計費字符為 0(只剩標點/空白/emoji/tone tags)。 | 傳入含可讀文字的 text。 |
| 400 | design_gender_and_age_required | design.gender 與 design.age 兩項均必填。 | 同時提供兩個欄位。 |
| 400 | invalid_job_id | 查詢或取消所用的 id 不是 UUID。 | 檢查 job_id。 |
| 400 | invalid_request | body 不是有效 JSON,或 Content-Type 非 JSON(/v1 僅接受 application/json);文件轉寫則為 multipart 缺 `file`/`model`、音檔為空或音檔格式不支援。 | 以 Content-Type: application/json 傳送合法 JSON body。 |
| 413 | payload_too_large | 請求超過大小上限 — JSON API 4.4 MB(通常為 clone 參考樣本過長);文件轉寫音檔 25 MB。 | 縮短參考樣本(音頻 ≤3 MB;樣本至少 8 秒即可);文件轉寫請縮短音檔再試。 |
| 401 | invalid_or_expired_token | API 金鑰缺失、無效、已過期或已被撤銷。 | 建立新金鑰並檢查 Bearer header。 |
| 402 | character_limit_reached | 帳戶字符池不足以完成本次生成(回應內含 remaining)。 | 購買字符包或等待月度重置。 |
| 403 | insufficient_scope | 金鑰缺少所需 scope(複製聲音需要 tts:clone);回應內含 "scope"。 | 建立具備所需 scope 的金鑰。 |
| 403 | monthly_cap_reached | 金鑰的每月字符上限已達;回應內含 "used"。 | 等候 UTC 月份重設,或調高上限。 |
| 404 | job_not_found | 沒有此 id 的任務(或任務屬於另一金鑰)。 | 檢查 job_id 及提交時所用的金鑰。 |
| 409 | already_settled | 任務已屬終態(completed/failed/cancelled),無法再取消,亦不會退款。 | 改以 GET /v1/audio/jobs/{id} 查詢最終狀態。 |
| 409 | duplicate_request | 同一個 Idempotency-Key(alias x-idempotency-key)已提交過(重試安全:不會重複扣費)。 | 沿用原本的 job_id 輪詢,或以新 key 提交新任務。 |
| 404 | not_found | 沒有此 endpoint(路徑有誤)。 | 對照 /v1/openapi.json 的路徑。 |
| 403 | batch_requires_pro | 批量生成(items)為入門/專業/工作室方案功能。單句任務的並行上限按方案分級(free 3/輕量 4/入門 5/專業 10/工作室 20/企業 20 個 pending),超上限回 429 in_flight_limit_reached。 | 待現有任務完成後再提交,或升級至入門/專業/工作室方案以解鎖批量生成與更高並行上限。 |
| 429 | capacity_exceeded | 公開 API 生成池到頂(全域並發上限)。 | 等候 Retry-After 秒再試,或改用非同步 `POST /v1/audio/jobs`。 |
| 429 | rate_limit_exceeded | 已觸及每金鑰每分鐘上限。 | 等候 Retry-After 秒(回應內容亦以 retry_after 標示),然後重試。 |
| 429 | sandbox_daily_limit | 免費方案每日 50 個生成請求上限已用完;輪詢與下載不受此限。 | 明日再試,或升級至輕量方案解鎖全速 API。 |
| 429 | api_busy | API 生成隊列已達全域容量上限(受理前即拒,不扣費)。 | 稍候數秒重試。 |
| 502 | audio_delivery_failed | 生成已完成,但音訊提取失敗。 | 改以 GET /v1/audio/jobs/{id} 輪詢並下載 audio_url。 |
| 503 | sync_generation_failed | 同步等待期間任務失敗或被取消(已自動退款)。 | 改用 POST /v1/audio/jobs(非同步)重試。 |
| 503 | reference_upload_failed | clone 參考音頻暫時儲存失敗。 | 直接重試。 |
| 503 | voice_gallery_unavailable / jobs_unavailable | 後端暫時性問題。 | 以指數退避重試。 |
| 400 | unsupported_response_format | 文件轉寫的 response_format 暫只支援 json/text — srt/verbose_json 需要段級時間戳,暫未提供。 | 使用 json 或 text。 |
| 402 | insufficient_balance | 預付餘額不足以預扣本次文件轉寫費用(未開始處理、零扣費)。 | 前往 /account/billing 儲值後重試(失敗不扣費)。 |
| 429 | daily_limit_exceeded | 已達每日計費音頻上限(24 小時/日,香港時間日界)。 | 香港時間明日再試。 |
| 503 | engine_unavailable | 文件轉寫服務暫時不可用(音檔時長偵測失敗、計費系統或轉寫管線暫時故障;超出現階段同步交付能力亦歸此類)。已預扣金額全額退回。 | 稍後重試;不會產生費用。 |
基礎建設
為正式流量預留專用容量。
API 語音負載運行於專用 GPU 池 — 與互動 Playground 完全隔離,正式流量不會與任何瀏覽器工作階段爭奪算力。
參考與下載
本頁為快速入門指南;/v1/docs/reference(Scalar)為詳細的 API 參考 — 每個 endpoint 的完整 request/response schema、所有錯誤碼與 try-it 面板均在其內。本頁全部內容同時提供機器可讀格式。
/v1/audio/speech200 sync短文字同步生成 — 直接回傳 200 音訊 bytes(voice/design 模式,≤300 字符)。
完整 schema → Scalar Reference/v1/audio/jobs202 async提交語音任務(單一或批次 ≤25;批次需入門方案或以上)。回傳 202 及 job_id 與 poll_url。
完整 schema → Scalar Reference/v1/audio/jobs/{id}poll查詢任務狀態;完成後回應會附上預簽名的 audio_url。
完整 schema → Scalar Reference/v1/voices列出廣東話優化聲線目錄,附試聽片段。此 endpoint 可匿名存取。
完整 schema → Scalar Reference/v1/asr/transcribe200 sync文件轉寫 — 上載音檔同步回傳文字;按音頻時長計費(文件轉寫 HK$1.40/小時),只扣成功。
完整 schema → Scalar Reference/v1/balance查詢預付餘額(HKD)、文件轉寫/實時聽寫費率與自動儲值設定。
完整 schema → Scalar Reference# 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 機器可讀版本。