錯誤碼完整參考
目錄
- 錯誤回應格式
- 嚴重程度說明
- 認證錯誤
- 方案限制錯誤
- Ticket 認證錯誤
- 工作階段錯誤
- 語音辨識錯誤
- 音訊處理錯誤
- 語者分離錯誤
- 多聲道錯誤
- 說話者錯誤
- 設定錯誤
- 錄音類型限制錯誤
- 翻譯服務錯誤
- TTS 語音合成錯誤
- 錄音錯誤
- 檔案匯入錯誤
- 儲存錯誤
- SSE 錯誤
- 廣播錯誤
- 互譯錯誤
- 摘要錯誤
- 重翻錯誤
- 語言切換錯誤
- 錄音名稱錯誤
- 通用錯誤
- 前端錯誤處理範例
錯誤回應格式
所有 API 錯誤使用統一格式:
{
"type": "error",
"data": {
"error_code": "auth_invalid_api_key",
"severity": "fatal",
"message": "API Key 無效",
"context": "auth",
"request_id": "req_abc123xyz789",
"timestamp": "2025-12-25T10:30:45.123Z",
"details": null
}
}
| 欄位 | 類型 | 說明 |
|---|---|---|
error_code | string | 錯誤碼(程式化處理用) |
severity | string | 嚴重程度:fatal / error / warning |
message | string | 人類可讀的錯誤訊息 |
context | string | 錯誤來源分類 |
sid | int | 可選。句子級錯誤的句子編號(如該句翻譯失敗);非句子級錯誤不帶 |
request_id | string | 請求追蹤 ID |
timestamp | string | 錯誤發生時間(ISO 8601) |
details | object | 額外除錯資訊;翻譯場景常見 key:provider、translation_language、source_lang |
嚴重程度說明
| severity | 說明 | 處理建議 |
|---|---|---|
fatal | 致命錯誤 | 停止服務,要求重新連線 |
error | 操作失敗 | 顯示錯誤提示,允許重試 |
warning | 警告 | 顯示警告,不阻斷操作 |
句子級錯誤判斷規則(重要):當錯誤訊息帶
sid欄位時,無論severity為何,都應視為 sentence-level 錯誤(單句失敗),客戶端只需標記該句失敗並繼續,不應斷線。fatal+sid的組合僅代表「該句嚴重失敗」,session 整體仍可繼續運作。換句話說,「停止服務/要求重新連線」的處理建議僅適用於不帶
sid的 session-level fatal 錯誤。另外,部分不帶
sid的fatal錯誤也不會關閉連線(例如auth_quota_exceeded、plan_feature_not_allowed);是否需要重新連線,以各錯誤碼的說明為準。
認證錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
auth_missing_api_key | 401 | fatal | 缺少 API Key | 確認請求包含 API Key |
auth_invalid_api_key | 401 | fatal | API Key 無效 | 確認 API Key 正確 |
auth_invalid_key_format | 401 | fatal | API Key 格式錯誤 | 確認 API Key 格式為 vas_ 開頭 |
auth_key_expired | 401 | fatal | API Key 已過期 | 重新申請 API Key |
auth_key_disabled | 401 | fatal | API Key 已停用 | 聯繫技術支援 |
auth_user_disabled | 403 | fatal | 帳戶已停用 | 聯繫技術支援 |
auth_account_blocked | 403 | fatal | 帳戶已封鎖 | 聯繫技術支援 |
auth_ip_not_allowed | 403 | fatal | 來源 IP 不被允許 | 確認從已授權的 IP 位址存取 |
auth_insufficient_credit | 402 | fatal | 點數不足 | 儲值點數後再使用 |
auth_quota_exceeded | 402 | fatal | 可用點數不足,錄音未開始(WebSocket start 時判斷:即時錄音為不足一分鐘,廣播為已用盡;連線不會關閉;details.remaining_budget 與 details.budget_scope 見下方「可用額度欄位」) | 儲值後重新送出 start,或等待額度週期重置 |
auth_account_expired | 401 | fatal | 帳戶服務已到期。目前不會由任何端點回傳,保留供未來使用 | 聯繫技術支援或續約 |
auth_service_error | 500 | fatal | 認證服務暫時不可用(WebSocket start 時發生則錄音不會開始,連線不會關閉) | 稍後重試 |
方案限制錯誤
適用於使用「吃到飽方案」的 API Key(v1.9.0 新增;方案說明見 計費說明 – 吃到飽方案)。被下列錯誤擋下時,可透過 GET /api/v1/me/plan 查詢「我的方案含什麼、離上限多遠、限制何時恢復」。
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
plan_feature_not_allowed | 403 | fatal | 吃到飽方案不含使用中的功能 | 改用方案內功能或升級方案;可用 GET /api/v1/me/plan 查方案內容 |
concurrency_limit_reached | — | error | 同一把 API Key 的併發錄音達上限 | 連線不會關閉;名額在伺服端送出 task_complete 時釋放,收到後即可開始下一場 |
daily_limit_disconnect | — | error | 已達方案用量門檻,本場錄音中止 | 可立即開始新的錄音(同一條連線上重新開始時,上一場處理完成後才會收到 session_started) |
daily_limit_reached | — | fatal | 用量已達方案上限 | 依方案規則重置(每日上限隔日重置)後恢復 |
plan_daily_limit_reached | 402 | error | 已達方案每日用量上限(REST 事前閘) | 依方案規則重置後再取得 Ticket 或上傳匯入 |
plan_feature_not_allowed的兩個發生時點(WebSocket):
start被拒:方案不含請求中啟用的功能時,start直接被拒;連線不會關閉,可調整參數後重新start。- 錄音中檢查發現:例如中途開啟方案沒有的功能,下一分鐘開始前檢查發現後該場錄音中止。
即時錄音的用量上限在每一分鐘開始前判斷,達到時下一分鐘不會開始、也不計入用量。同一把 API Key 同時進行多場錄音時,達到定期中斷的門檻後,每一場都會在各自的下一分鐘開始前中斷。
REST 端點回 HTTP 403 的場景:
POST /api/v1/broadcasts(方案 key 建立廣播——廣播一律不含在吃到飽方案內)、POST /api/v1/auth/tasks/{taskId}/subtitle-feed-token與subtitle-share(方案不含浮動字幕)、POST /api/v1/imports(方案不含匯入)。
plan_daily_limit_reached(HTTP 402)出現在POST /api/v1/auth/ticket與匯入上傳:已達方案每日硬上限時,事前擋下新的錄音/匯入。 同一個字串也會出現在POST /api/v1/imports/check-quota的data.reason(該端點為唯讀查詢,回 HTTP 200,不是錯誤)。
too_many_languages語意擴充(v1.9.0):details.max除了系統上限(轉錄語言 10 種),也可能來自方案的「同時識別語言數上限」;details帶max與received。
Ticket 認證錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
ticket_invalid | 401 | fatal | Ticket 無效或已過期 | 重新取得 Ticket |
ticket_expired | 401 | fatal | Ticket 已過期 | 重新取得 Ticket |
ticket_already_used | 401 | fatal | Ticket 已被使用 | 每個 Ticket 僅能使用一次 |
ticket_validation_failed | 401 | fatal | Ticket 驗證失敗 | 確認 Ticket 格式正確 |
工作階段錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
session_not_found | 404 | error | 工作階段不存在 | 確認工作階段 ID 正確 |
session_expired | 400 | error | 工作階段已過期 | 重新建立工作階段 |
session_not_started | 400 | error | 尚未開始錄音,或本次錄音已結束(含結束後仍在處理中) | 尚未開始請先呼叫 start;若是重複送出 stop 可忽略 |
session_already_paused | 400 | warning | 已經暫停 | 可忽略此錯誤 |
session_not_paused | 400 | warning | 未暫停 | 可忽略此錯誤 |
service_shutdown | — | warning | 服務即將關閉,請重新連線 | 服務正常關閉(例如維護更新)時廣播給所有進行中的連線。沒有在錄音的連線會在通知後約 2 秒關閉;錄音中的連線可以把這一場錄完,stop 後照常收到 task_complete,之後連線才會關閉。服務關閉期間送出 start 也會收到這個錯誤:錄音不會開始,之後連線會關閉。客戶端應顯示維護提示,連線關閉後短暫退避再重連;start 被拒的,重連後再重新 start |
resume_token_invalid | — | error | 續接憑證無效或不存在 | 斷線續接失敗;重取 Ticket 後送全新 start,但使用者已結束錄音時請勿自動開始新的錄音(詳見連線文件 - 斷線續接) |
resume_grace_expired | — | error | 續接寬限期已逾時 | 同上 |
resume_ownership_mismatch | — | error | 續接憑證歸屬不符 | 同上 |
resume_unavailable | — | error | 續接暫不可用(此連線無法續接原場次;原場次已送出 stop 或已被結束、仍在處理中時也會收到) | 同上 |
set_speaking_speed_failed | 400 | error | 語速變更失敗(重建語音辨識時失敗) | 稍後重試 |
語音辨識錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
stt_init_failed | 503 | fatal | 服務初始化失敗 | 稍後重試 |
stt_start_failed | 500 | fatal | 無法開始語音辨識 | 稍後重試 |
stt_auth_failed | 500 | fatal | 服務認證失敗 | 聯繫技術支援 |
stt_quota_exceeded | 402 | fatal | 可用點數不足(即時錄音:錄音已結束,於下一分鐘開始前判斷,details.remaining_budget 與 details.budget_scope 見下方「可用額度欄位」;匯入、重新翻譯、重新生成摘要等:請求未執行,見各端點說明) | 儲值後再試 |
stt_connection_lost | 500 | fatal | 連線中斷 | 停止服務,重新連線 |
stt_silence_timeout | - | fatal | 連續一段時間(預設 15 分鐘,可用 start 的 silenceTimeoutSeconds 調整)沒有偵測到語音,錄音已自動結束(details.silence_seconds 為判定的秒數)。暫停中、斷線等待續接的期間與廣播不計時,詳見 長時間沒有語音時自動結束 | 確認麥克風有收到聲音;要繼續請重新開始錄音。此為 WebSocket 事件,無 HTTP 狀態碼 |
stt_silence_warning | - | warning | 連續一段時間沒有偵測到語音,錄音即將自動結束(details.silenceSeconds 為已持續的秒數,details.remainingSeconds 為剩下的秒數)。錄音照常進行 | 提醒使用者;辨識出文字或恢復錄音就會重新計時。此為 WebSocket 事件,無 HTTP 狀態碼 |
錄音被結束後重新開始:收到
stt_quota_exceeded、stt_silence_timeout、plan_feature_not_allowed、daily_limit_disconnect等使錄音結束的錯誤後,可以在同一條連線上立即送出start,但要等上一場處理完成(收到status: "ended")後才會收到session_started,視摘要長度可能需要數秒到數十秒,請勿視為逾時。
音訊處理錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
audio_invalid_format | 400 | error | 音訊資料格式錯誤 | 確認音訊格式正確 |
audio_process_failed | 500 | error | 音訊處理失敗 | 稍後重試 |
audio_format_unsupported | 400 | error | 不支援的音訊格式 | 使用支援的格式 |
audio_decode_failed | 500 | error | 音訊解碼失敗 | 確認音訊檔案完整性。即時錄音中:錄音不會結束;WebM 請重新送出全新容器(含檔頭)即可恢復,無法解碼的期間不計費 |
語者分離錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
diarization_init_failed | 503 | fatal | 語者分離服務初始化失敗 | 稍後重試 |
diarization_start_failed | 500 | fatal | 語者分離會話開始失敗 | 稍後重試 |
diarization_failed | 500 | error | 語者分離處理失敗 | 稍後重試 |
diarization_unavailable | 503 | fatal | 語者分離服務不可用 | 確認服務狀態 |
diarization_multilang_conflict | 400 | error | 語者分離不支援多語言(拒絕開始);互譯(conversation)自 v1.7.2 起豁免 | 請只提供一個來源語言,或關閉語者分離 |
多聲道錯誤
適用於多聲道模式(recognition_mode: "multi_channel",v1.10.0 新增;參數與聲道操作說明見 WebSocket API 參考 – 語音翻譯,計費見 計費說明)。以下皆為 WebSocket 錯誤,無對應 HTTP 狀態碼。
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
channel_mode_required | — | error | 多聲道模式必須指定 channel_mode | 帶 channel_mode(per_channel 或 shared) |
invalid_channel_mode | — | error | 無效的 channel_mode | 可用值為 per_channel 與 shared;shared 在此環境未開通時也回此錯並附 message,請改用 per_channel |
channels_required | — | error | 多聲道模式必須提供 channels | 提供 1–8 路 channels(含主講者,慣例 channel_id: 1) |
too_many_channels | — | error | 聲道數量超過上限 | 減少聲道數,上限 8;details 帶 max/received |
invalid_channel_id | — | error | 無效或重複的 channel_id | channel_id 必須是 1–8 的整數且不可重複 |
channel_language_required | — | error | 每個聲道必須指定恰好一種語言 | 每路 transcription_languages 提供恰好 1 個語言 |
channel_language_not_allowed | — | error | shared 模式不支援各聲道獨立語言 | shared 模式的語言為全場共用:start/add_channel 的聲道不可帶 transcription_languages,錄音中也不能用 set_channel_language 變更 |
channel_language_mismatch | — | error | 聲道語言與 transcription_languages 不一致 | 各路語言的聯集必須與 session 級 transcription_languages 一致 |
channel_id_required | — | error | 多聲道模式必須指定 channel_id | 多聲道下 audio 每幀必帶 channel_id;聲道操作亦必帶 |
unknown_channel_id | — | error | 未知的 channel_id | 確認該路已在 start 或 add_channel 宣告且未被移除 |
multichannel_tts_not_allowed | — | error | 多聲道模式不支援語音合成 | 關閉 tts_enabled |
multichannel_broadcast_not_allowed | — | error | 廣播不支援多聲道模式 | 廣播請改用其他辨識模式 |
multichannel_requires_pcm | — | error | 多聲道模式僅支援 PCM 音訊格式 | audio_format 使用 "pcm"(16kHz/16bit/mono) |
multichannel_switch_language_not_allowed | — | error | 多聲道模式不支援 switch_language | 語言綁定在聲道上,改用 set_channel_language |
channel_id_in_use | — | error | 此 channel_id 已使用過,不可重複使用 | 聲道編號不可重用(含已移除的聲道),add_channel 請換新編號 |
channel_remove_not_allowed | — | error | 此聲道不可移除 | 最後一路聲道不可移除;要結束錄音請用 stop |
channel_action_while_paused | — | error | 暫停中無法增減聲道,請先恢復錄音 | 先 resume 再執行聲道操作 |
not_multi_channel_session | — | error | 本場錄音不是多聲道模式 | 聲道操作僅適用 recognition_mode: "multi_channel" 的錄音 |
channel_rebuild_too_frequent | — | error | 該聲道設定變更過於頻繁,請稍後再試 | 同一路聲道 5 秒內僅接受一次設定變更;details 帶 cooldown_seconds |
複用既有錯誤碼的多聲道語意:
invalid_recognition_mode:多聲道功能未在此環境開通時,start帶recognition_mode: "multi_channel"會回此錯;details帶field: "recognition_mode"與received_value。invalid_parameter:參數組合衝突時回傳——multi_channel同時指定speaker_diarization(多聲道本身即為語者分離);type: "conversation"搭配multi_channel;set_channel_language換成該路現行語言、transcription_languages帶多於一個語言、或transcription_languages與language同時提供且不一致;channels[].speaker_name超長或含控制字元。plan_feature_not_allowed(details.field: "max_stt_streams"):start或add_channel的聲道數超過吃到飽方案的路數上限;details另帶max與當前路數。too_many_languages:add_channel/set_channel_language引入新語言,使同時識別語言數超過平台上限(10 種)或方案上限;details帶max/received/language。另有
speaker_op_not_allowed_multi_channel(REST 為 HTTP 422):多聲道錄音的語者由聲道決定,語者操作僅開放改名;重新歸屬(reassign)與合併(merge)在錄音中(WebSocket)與錄音後(REST)皆會回此錯,見說話者錯誤。
說話者錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
speaker_not_found | 422 | error | 找不到指定的說話者 | 確認說話者 ID 正確 |
speaker_sid_not_found | 422 | error | 找不到指定的句子 | 確認句子 ID 正確 |
speaker_name_empty | 422 | error | 說話者名稱不能為空 | 提供說話者名稱 |
speaker_name_duplicate | 422 | error | 說話者名稱已被使用 | 使用不同的名稱 |
merge_speakers_same_id | 400 | error | 來源和目標語者不能相同 | 提供不同的語者 ID |
speaker_op_not_allowed_multi_channel | 422 | error | 多聲道錄音不支援此語者操作(v1.10.0 新增) | 多聲道的語者由聲道決定,僅 rename 可用;reassign/merge 會回此錯 |
設定錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
config_empty | 400 | error | 未提供任何設定。空物件 {} 不算「有提供」 | 提供至少一項有內容的設定;清空字庫請送 {"語言代碼": []} |
config_term_too_long | 400 | error | 術語超過 100 字元 | 縮短術語長度 |
config_too_many_entries | 400 | error | 術語筆數超過 500,或模糊詞校正規則超過 4000(皆為所有語言合計,非每種語言各算)。details 帶 count 與 max,模糊詞另帶 field | 減少術語或校正規則 |
config_too_many_dict_entries | 400 | error | 翻譯字典單一語言超過 3000 條目(details.language 指出是哪個語言) | 減少該語言的字典條目 |
config_invalid_entry | 400 | error | 某一條術語或校正規則的欄位不合法。details 帶 language、index、field、reason 供定位(部分情境另帶 variant_index),並視 reason 附上 max_length 或 count/max | 依 details 指出的位置修正該條目 |
config_ignored_in_start | - | warning | start 內帶的字庫已被忽略,請改用 config action 設定(details.ignored_fields 列出被忽略的欄位)。start 仍會成功 | 改用 config action 送字庫 |
config_too_many_languages | 400 | error | 字庫某個區塊的語言代碼數量超過上限(details 帶 field/count/max)。僅字庫驗證 API 使用 | 減少該區塊的語言代碼數 |
config_payload_too_large | 413 | error | 請求本體超過大小上限。僅字庫驗證 API 使用 | 分批送出,或減少字庫內容 |
錄音類型限制錯誤
record(純錄音)為輕量純語音辨識類型:不支援翻譯與 TTS,摘要需 opt-in(帶 summary_template 或 summary_mode=custom 才生成)。以下錯誤碼在違反這些限制時於 start 階段回傳(自 v1.7.0 起)。
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
record_translation_not_allowed | 400 | error | 純錄音類型不支援翻譯 | 移除 translation_languages,或改用 transcribe 類型 |
record_tts_not_allowed | 400 | error | 純錄音類型不支援語音合成 | 移除 tts_enabled,或改用支援 TTS 的類型 |
record_summary_requires_template | 400 | error | 純錄音類型開啟摘要需帶模板 | 提供 summary_template 或使用 summary_mode=custom |
record_translation_not_allowed亦會在事後對record錄音呼叫重翻端點(逐字稿重翻、摘要翻譯)時回傳。
翻譯服務錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
llm_init_failed | 503 | fatal | 翻譯服務初始化失敗 | 稍後重試 |
llm_timeout | 504 | error | 翻譯逾時 | 稍後重試 |
llm_rate_limit | 429 | warning | 請求過於頻繁 | 減少請求頻率 |
llm_request_failed | 500 | error | 翻譯請求失敗 | 稍後重試 |
llm_provider_error | 503 | error | 翻譯服務暫時不可用 | 稍後重試 |
llm_content_filtered | 400 | warning | 內容無法翻譯 | 修改輸入內容 |
llm_auth_failed | 500 | fatal | 翻譯服務認證失敗 | 聯繫技術支援 |
llm_deployment_not_found | 500 | fatal | 翻譯服務設定錯誤 | 聯繫技術支援 |
llm_quota_exceeded | 402 | fatal | 翻譯使用量已達上限 | 稍後重試 |
translation_service_unavailable | - | error | 翻譯服務連續失敗達閾值(session-level,不帶 sid) | 顯示全域提示「翻譯暫不可用」,不需斷線;STT 仍會繼續運作 |
本表的 HTTP 欄是語意標註,不是實際回應狀態碼。 翻譯服務錯誤絕大多數以串流事件(SSE
event: error/WebSockettype: error)送出, 而串流本身一律是 HTTP 200。此欄標的是「這個錯誤在語意上屬於哪一類」, 供您決定重試策略:4xx 表示需要調整輸入、5xx 與 429 表示可稍後重試。 請以error_code與severity判讀,不要依賴此欄比對實際收到的狀態碼。
translation_service_unavailable的觸發規則:
- 累計型升級:
llm_timeout/llm_provider_error/llm_rate_limit/llm_request_failed連續失敗 5 次後升級- 立即升級:
llm_auth_failed/llm_deployment_not_found/llm_quota_exceeded1 次就升級(設定/帳務問題)- 不計入:
llm_content_filtered(內容問題,非服務問題)- 去重:每個 session 只通知一次,任一句翻譯成功則重置;可再次觸發
- payload:
type: "error",不帶sid,details含provider、last_error_code、fail_count- 觀眾通知:廣播模式下,所有觀眾(不限語言)也會收到此事件(透過 SSE/WS 廣播通道)
TTS 語音合成錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
tts_init_failed | 503 | fatal | TTS 服務初始化失敗 | 稍後重試 |
tts_not_enabled | 400 | warning | TTS 未啟用 | 確認 start 時設定 tts_enabled |
tts_invalid_language | 400 | error | TTS 語言無效 | 確認語言在 translation_languages 中 |
tts_invalid_voice | 400 | error | 無效的語音名稱。僅由即時語音通道回傳——建立廣播時不驗證語音名稱,無效的值要到開播時才會浮現 | 送出前先以 GET /api/v1/tts/voices 確認語音名稱 |
sentence_not_found | — | warning | 找不到指定的句子 | 確認 SID 存在 |
translation_not_found | — | warning | 找不到該語言的翻譯 | 確認該語言的翻譯存在 |
tts_translation_not_found | — | error | TTS SSE 串流中,該句缺少該語言的翻譯。以 tts_error 事件送出,會中止整段串流 | 確認該語言的翻譯已完成且內容非空 |
tts_connection_failed | — | error | 語音合成連線失敗 | 稍候重試 |
tts_timeout | — | error | 語音合成逾時 | 稍候重試 |
tts_synthesis_failed | 500 | error | TTS 合成失敗 | 稍後重試 |
tts_voice_not_found | 404 | error | 找不到指定的語音,或該語音所屬語言無法作為 TTS 目標語言 | 以 GET /api/v1/tts/voices 列出的語音為準 |
tts_sample_generation_failed | 500 | error | 語音示範生成失敗 | 稍後重試 |
HTTP 欄為
—表示該錯誤碼不是以 HTTP 狀態碼回傳,而是在連線建立後,透過串流中的error或tts_error事件送出。
錄音錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
recording_not_found | 404 | error | 找不到錄音 | 確認 taskId 正確 |
recording_unauthorized | 403 | error | 無權限操作此錄音 | 確認任務屬於該用戶 |
recording_audio_not_ready | 422 | error | 音檔尚未就緒 | 稍後重試 |
recording_transcript_not_ready | 422 | error | 逐字稿尚未產生完成或為空 | 確認 processing_status = completed 後再匯出 |
recording_not_completed | 422 | error | 錄音尚未完成處理;不允許在進行中執行重翻/編輯/重生摘要 | 等待 processing_status = completed 後重試 |
entry_not_found | 404 | error | 找不到指定的句子(sid 不存在於 transcript) | 確認 sid 正確 |
entry_text_empty | 422 | error | 句子原文為空(只有空白字元也算) | 提供非空 original_text |
entry_text_too_long | 422 | error | 句子原文超過 2000 字元上限 | 縮短內容後重試 |
transcript_revision_conflict | 409 | error | 逐字稿已被其他請求修改,或正有其他寫入在進行 | 重新讀取 transcript 取得最新 revision 後重試 |
retranslate_segmentation_required | 422 | error | 全文重翻:逐字稿太長,一次請求翻不完(details.sentenceCount 為要翻的句數,details.maxSentences 為上限)。在串流開始前回傳,不扣點 | 帶 segmented=1 分段重翻,見 重新翻譯 SSE |
task_already_processing | 409 | error | 同一筆任務仍有處理作業尚未結束,本次請求未執行 | 稍候再送出同一個請求 |
invalid_processing_status | 422 | error | 處理狀態不符操作需求 | 見下方「處理狀態不符(invalid_processing_status)」說明 |
可用額度欄位(remaining_budget 與 budget_scope)
auth_quota_exceeded 與 stt_quota_exceeded 的 details 會帶這兩個欄位。
| 欄位 | 說明 |
|---|---|
remaining_budget | 最近一次結算時的可用額度;尚未結算過時,是連線當下的值。budget_scope 為 api_key_unlimited 時固定為 null |
budget_scope | 說明上面那個數字屬於誰。目前有兩個值,見下表 |
budget_scope | 意思 | 同一則 details 裡的 remaining_budget |
|---|---|---|
api_key_credit | 本次請求所用的 API Key 採點數制,數字是這把 Key 目前可動用的點數 | 數字 |
api_key_unlimited | 本次請求所用的 API Key 綁著方案,沒有「剩餘點數」這個概念 | null |
重要:remaining_budget 是「發出這次請求的 API Key」可動用的額度,不是終端使用者的餘額。
若您是代其他使用者呼叫本服務的整合方,請不要把這個數字直接顯示給您的終端使用者——
它反映的是您自己那把金鑰的狀態。
注意:廣播為獨立付費:即使金鑰綁著方案,廣播仍依實際用量扣點,因此廣播場次收到這兩顆碼時
budget_scope 會是 api_key_credit、remaining_budget 是真實的可用點數。
處理狀態不符(invalid_processing_status)
此錯誤碼用於 POST /api/v1/tasks/{taskId}/force-fail、POST /api/v1/tasks/{taskId}/retry 與 DELETE /api/v1/tasks/{taskId},當錄音狀態不符操作前提時回應。details 欄位可進一步判別觸發原因:
| 端點 | 觸發條件 | details 帶的欄位 | 處理建議 |
|---|---|---|---|
force-fail | 錄音已是終態(completed / failed) | current_status、message | 已完成的任務請改用 DELETE /api/v1/tasks/{taskId};已失敗的任務無需再次強制失敗 |
DELETE | 任務仍在處理中(非 completed / failed),或該任務的匯入仍在處理中 | task_id、current_status、message | 等任務完成或失敗後再刪;卡住的錄音可先 force-fail,匯入仍在處理中則需等匯入結束。批次刪除不回此錯誤,改列在 skipped_task_ids |
retry | 錄音不在 failed 狀態 | current_status、message | 只有 failed 的任務可 retry |
retry | 音檔或逐字稿尚未上傳完成 | current_status、audio_status、transcript_status、message | 請確認來源檔完整;若錄音源頭已損毀請改用 force-fail 收尾 |
任務仍在處理中(task_already_processing)
POST /api/v1/tasks/{taskId}/retry 在同一筆任務仍有處理作業尚未結束時回應。與 invalid_processing_status 的差別在於:這是暫時性的——任務狀態不會被本次請求改動,等前一次處理結束後,同一個請求即可成功。
| 端點 | 觸發條件 | details 帶的欄位 | 處理建議 |
|---|---|---|---|
retry | 同一筆任務仍有處理作業尚未結束 | task_id、message | 稍候再送出同一個請求,不需更動任何參數 |
注意:任務失敗後系統會自動再試數次,這段期間 processing_status 可能已經是 failed,但重試請求仍會收到 409 —— 代表自動重試尚未結束。此時不需要做任何處置,隔幾分鐘再送出同一個請求即可。
檔案匯入錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
import_not_found | 404 | error | 找不到匯入任務 | 確認 import_id 正確 |
import_file_too_large | 413 | error | 檔案大小超過限制 | 壓縮檔案或分割 |
import_invalid_format | 415 | error | 不支援的音檔格式 | 使用 mp3/wav/m4a 格式 |
import_recognition_mode_unsupported | 422 | error | 匯入不支援此辨識模式(只支援 single、multi_speaker)。details 帶 field 與 supportedModes | 改用 single 或 multi_speaker |
import_duration_out_of_range | - | error | 音檔時長超出允許範圍(最短 1 秒、最長 10 小時)。以匯入進度的 failed 事件回報 | 改用符合長度的音檔,或先切分後分次匯入 |
import_download_failed | 500 | error | 下載失敗 | 稍後重試 |
import_conversion_failed | 500 | error | 轉換失敗 | 確認音檔完整性 |
import_stt_timeout | 504 | error | 語音辨識逾時 | 稍後重試 |
import_stt_failed | 500 | error | 語音辨識失敗 | 稍後重試 |
import_translation_failed | 500 | error | 翻譯處理失敗 | 稍後重試 |
import_summary_failed | 500 | warning | 摘要生成失敗 | 稍後重試 |
import_upload_failed | 500 | error | 結果上傳失敗 | 稍後重試 |
import_callback_failed | 500 | warning | 回報進度失敗 | 不影響處理,可忽略 |
import_invalid_request | 500 | error | 請求格式錯誤 | 確認請求格式 |
go_service_error | - | error | 處理服務暫時無法使用 | 稍後重新匯入 |
dispatch_failed | - | error | 無法派發處理任務 | 稍後重新匯入 |
job_failed | - | error | 處理任務失敗 | 稍後重新匯入 |
PROCESSING_TIMEOUT | - | error | 匯入等待或處理的時間過長,已標為失敗 | 稍後重新匯入 |
unknown_error | - | error | 匯入處理失敗 | 稍後重新匯入;持續失敗請提供 import_id 洽客服 |
注意:上傳時若點數不足,會回傳
auth_insufficient_credit錯誤(HTTP 402)。HTTP 欄為
-的錯誤碼不是以 HTTP 狀態碼回傳,而是出現在匯入失敗時的error_code:匯入查詢 API、匯入進度 SSE 的failed事件,以及import.failedWebhook。對應的error_message是固定的一般說明,不含內部細節;需要排查時請提供import_id。
儲存錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
storage_connection_failed | 503 | error | 儲存服務連線失敗 | 稍後重試 |
storage_upload_failed | 500 | error | 上傳失敗 | 稍後重試 |
storage_download_failed | 500 | error | 下載失敗 | 稍後重試 |
storage_queue_full | 500 | warning | 上傳佇列已滿 | 稍後重試 |
SSE 錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
sse_transcript_not_found | 404 | error | 找不到逐字稿 | 錄音可能尚未處理完成 |
sse_translation_failed | 500 | error | 翻譯失敗 | 稍後重試 |
sse_summary_not_found | 404 | error | 找不到摘要 | 該錄音沒有摘要 |
sse_summary_translation_failed | 500 | error | 摘要翻譯失敗(重新翻譯摘要、摘要翻譯)。details.original_error 為 Translation timed out 時表示逾時 | 稍後重試 |
sse_summary_regeneration_failed | 500 | error | 摘要重新生成失敗 | 稍後重試 |
sse_template_not_found | 404 | error | 找不到摘要模板 | 確認模板 slug 正確 |
廣播錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
broadcast_not_enabled | 500 | error | 會話未啟用廣播 | 確認廣播設定 |
broadcast_token_invalid | 401 | fatal | 分享連結無效 | 停止服務,確認分享連結正確 |
broadcast_token_revoked | 401 | fatal | 分享連結已撤銷 | 停止服務,重新建立廣播 |
broadcast_token_already_used | 422 | error | Token 已被其他 Session 使用 | 關閉其他分頁後重試 |
broadcast_token_required | 400 | error | 廣播模式需要 broadcast_token | 提供 broadcast_token 參數 |
broadcast_session_not_found | 404 | error | 找不到廣播會話 | 確認廣播 Token 正確 |
broadcast_session_not_started | 503 | error | 廣播尚未開始 | 等待主講者開始廣播 |
broadcast_not_ready | 503 | warning | 即時翻譯服務尚未啟動 | 稍後重試 |
broadcast_session_ended | 410 | error | 廣播會話已結束 | 等待主講者重新開始 |
broadcast_capacity_exceeded | 503 | warning | 超過最大觀眾數量 | 等待排隊或稍後重試 |
broadcast_queue_timeout | — | error | 排隊逾時 | 重新連線嘗試 |
broadcast_viewer_kicked | 403 | error | 已被主講者移除 | 聯繫主講者 |
broadcast_unauthorized | 401 | error | 未授權存取觀眾管理 API | 確認認證資訊 |
broadcast_password_required | 401 | error | 此直播需要密碼驗證 | 提供正確密碼 |
broadcast_password_incorrect | 401 | error | 密碼錯誤 | 確認密碼後重試 |
broadcast_not_in_standby | 500 | warning | 目前不在預備階段 | 等待主講者切換至預備階段 |
broadcast_standby_warning | — | warning | 預備階段即將達到時間上限(預設 30 分鐘;details 帶 standbySeconds、remainingSeconds、limitSeconds),廣播照常進行 | 提示主講者開播或重新開始 |
broadcast_standby_timeout | — | fatal | 預備階段已達時間上限,這一場已自動結束(details 帶 standbySeconds、limitSeconds)。預備階段沒有錄音,不會收到 task_complete | 重新取得 Ticket 並送出 start,見 廣播功能指南 |
broadcast_cannot_revoke | 422 | error | 只有 pending 狀態可以撤銷 | 先停止直播再撤銷 |
broadcast_cannot_start | 422 | error | 無法開始直播 | 確認廣播狀態為 pending |
broadcast_already_live | 422 | error | 已有直播進行中 | 先停止當前直播 |
broadcast_not_live | 422 | error | 目前沒有直播進行中 | 先開始直播 |
validation_failed | 422 | error | max_viewers 超過帳戶觀眾上限(訊息會帶出實際上限) | 調低 max_viewers |
HTTP 欄為
—表示該錯誤碼不是以 HTTP 狀態碼回傳,而是在連線建立後,透過串流中的error或tts_error事件送出。
互譯錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
conversation_requires_two_languages | 400 | error | 互譯模式需恰好兩個語言 | 提供恰好 2 個 transcription_languages |
conversation_languages_identical | 400 | error | 互譯的兩個語言不可相同 | 提供兩個不同的語言 |
conversation_invalid_language | 400 | error | 無效的互譯語言 | 確認語言是 transcription_languages 之一 |
conversation_same_language | 400 | warning | 已是當前語言 | 可忽略此警告 |
conversation_speaking | 400 | error | 正在說話中,無法執行此操作 | 先呼叫 stop_speaking 結束說話 |
conversation_not_speaking | 400 | warning | 目前未在說話狀態 | 可忽略此警告 |
conversation_invalid_speaker | 400 | error | 無效的用戶編號 | 使用 1 或 2 |
conversation_invalid_mode | 400 | error | 無效的對話模式 | 使用 auto 或 manual |
conversation_not_manual_mode | 400 | error | 此操作僅限手動模式 | 先切換到 manual 模式 |
conversation_missing_speakers | 400 | error | V1.24.0 起 speakers 改選填,不再回傳此錯誤 | 不需處理 |
conversation_invalid_speakers | 400 | error | speakers 格式錯誤 | 確認提供恰好 2 個 speaker 設定 |
conversation_language_change_failed | 500 | error | 語言變更失敗(STT 重建失敗) | 稍後重試 |
conversation_language_same_as_peer | 400 | error | 新語言與另一位用戶相同 | 兩位用戶語言不可相同 |
處理策略:
| 錯誤碼 | 是否重試 | 處理方式 |
|---|---|---|
conversation_requires_two_languages | 否 | 顯示「請提供恰好 2 個語言」 |
conversation_languages_identical | 否 | 顯示「兩個語言不可相同」 |
conversation_invalid_language | 否 | 顯示「語言無效」,使用 start 時的語言 |
conversation_same_language | 否 | 可忽略,已是當前語言 |
conversation_speaking | 否 | 顯示「請先結束說話」 |
conversation_not_speaking | 否 | 可忽略,未在說話中 |
conversation_invalid_speaker | 否 | 顯示「用戶編號無效」 |
conversation_invalid_mode | 否 | 顯示「無效的模式」 |
conversation_not_manual_mode | 否 | 顯示「請先切換到手動模式」 |
conversation_missing_speakers | 否 | V1.24.0 起不再回傳,不需處理 |
conversation_invalid_speakers | 否 | 顯示「speakers 格式錯誤」 |
conversation_language_change_failed | 是 | 稍後重試,若持續失敗請重新建立連線 |
conversation_language_same_as_peer | 否 | 顯示「不可與另一位用戶語言相同」 |
conversation_requires_two_languages 錯誤詳情:
此錯誤在 type: "conversation" 的 start action 中,transcription_languages 數量不為 2 時發生。
{
"type": "error",
"data": {
"error_code": "conversation_requires_two_languages",
"severity": "error",
"message": "互譯模式需要恰好 2 個語言",
"context": "session",
"request_id": "req_abc123xyz",
"timestamp": "2026-03-04T10:30:45.123Z",
"details": {
"received_count": 1,
"expected_count": 2
}
}
}
conversation_languages_identical 錯誤詳情:
此錯誤在 type: "conversation" 的 start action 中,提供的兩個 transcription_languages 相同時發生。
{
"type": "error",
"data": {
"error_code": "conversation_languages_identical",
"severity": "error",
"message": "互譯的兩個語言不可相同",
"context": "session",
"request_id": "req_abc123xyz",
"timestamp": "2026-03-04T10:30:45.123Z",
"details": {
"languages": ["zh-TW", "zh-TW"]
}
}
}
conversation_invalid_language 錯誤詳情:
此錯誤在 switch_language 時,指定的語言不在互譯語言對中。
{
"type": "error",
"data": {
"error_code": "conversation_invalid_language",
"severity": "error",
"message": "指定語言不在互譯語言中",
"context": "session",
"request_id": "req_abc123xyz",
"timestamp": "2026-03-04T10:30:45.123Z",
"details": {
"language": "ja-JP",
"conversation_languages": ["zh-TW", "en-US"]
}
}
}
摘要錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
summary_text_empty | 400 | error | 文字內容不能為空 | 提供文字內容 |
summary_text_too_long | 400 | error | 文字內容超過限制(200,000 字元) | 縮短文字內容 |
summary_failed | 500 | error | 摘要生成失敗 | 稍後重試 |
summary_timeout | 504 | error | 摘要生成逾時 | 稍後重試 |
summary_prompt_too_long | 400 | error | summary_prompt 超過 3000 字元上限 | 縮短 summary_prompt 字元數 |
summary_prompt_slug_too_long | 400 | error | summary_prompt_slug 超過 64 字元上限 | 縮短 summary_prompt_slug 字元數 |
summary_prompt_slug_invalid | 400 | error | summary_prompt_slug 含控制字元 | 移除換行 / Tab / NULL 等控制字元 |
summary_mode_field_mismatch | 400/422 | error | 摘要模式(summary_mode)與摘要欄位的組合不符:必填欄位沒帶(WebSocket 中只含空白字元視同沒帶),或帶了該模式禁帶的欄位 | 依模式規則調整 summary_template、summary_prompt、summary_prompt_slug,見摘要客製化 |
template_not_found | 404 | error | 指定 slug 的摘要模板不存在或已停用 | 改用 GET /api/v1/summary-templates 列出可用模板 |
summary_idempotency_key_conflict | 409 | error | 同一 idempotency_key 已用於不同的請求內容——content 或任一參數不同(Ad-hoc 摘要 v1.9.1 新增;摘要翻譯 v1.17.0 起也使用) | 換新的 idempotency_key;重試請帶與原請求完全相同的欄位 |
summary_insufficient_credit | — | warning | 可用點數不足,未產生摘要(即時錄音因可用點數不足而結束,或結束時可用點數不足以支付摘要費用;以 summary_error 事件通知,逐字稿與錄音照常保存) | 儲值後可透過重新生成摘要取得 |
重翻錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
retranslate_session_not_active | 400 | error | Session 未啟動 | 確認 Session 狀態 |
retranslate_no_target_lang | 400 | error | 未提供目標語言 | 提供 target_lang 參數 |
retranslate_no_text | 400 | error | 未提供要翻譯的文字 | 提供文字內容 |
retranslate_llm_not_ready | 503 | error | 翻譯服務未就緒 | 稍後重試 |
retranslate_llm_failed | 500 | error | 翻譯失敗 | 稍後重試 |
retranslate_failed | 500 | error | 重翻失敗 | 稍後重試 |
語言切換錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
switch_language_no_target | 400 | error | 未提供目標語言 | 提供目標語言參數 |
switch_language_in_progress | 400 | warning | 語言切換進行中 | 等待切換完成 |
switch_language_same_target | 400 | warning | 目標語言相同 | 可忽略此警告 |
switch_language_op_required | 400 | error | 多語言場次未帶 op(v1.6.7) | 帶 op: "add" 或 op: "remove" |
switch_language_already_exists | 400 | warning | 新增的語言已在翻譯清單(v1.6.7) | 可忽略此警告 |
switch_language_not_in_session | 400 | error | 移除的語言不在翻譯清單(v1.6.7) | 確認語言代碼 |
switch_language_last_language | 400 | error | 至少需保留一種翻譯語言(v1.6.7) | 不可移除最後一種語言 |
batch_retranslate_partial_failed | 500 | warning | 部分句子重翻失敗 | 可忽略,不影響主流程 |
batch_retranslate_failed | 500 | warning | 批次重翻單句失敗(持久化於 transcript.translation_errors) | 失敗 sid 由 failed_sids 匯總回報,可後續單句重試 |
錄音名稱錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
set_name_empty | 400 | error | 錄音名稱不能為空 | 提供名稱 |
set_name_too_long | 400 | error | 名稱超過長度限制 | 縮短名稱 |
通用錯誤
| 錯誤碼 | HTTP | severity | 說明 | 處理建議 |
|---|---|---|---|---|
invalid_json | 400/422 | error | JSON 格式錯誤。即時服務網域上的端點回 400,其餘回 422 | 確認 JSON 格式正確 |
invalid_data | 422 | error | 資料格式錯誤 | 確認資料符合 API 規格 |
validation_failed | 422 | error | 請求驗證失敗 | 確認必填參數已提供 |
invalid_parameter | 400 | error | 參數的值或組合不合法,details.field 標示是哪一個參數。例如 WebSocket start 的 silenceTimeoutSeconds 或 broadcast_phase 值不合法、非 broadcast 類型帶 broadcast_token、name 超過 60 字元、summary_language 超過 20 字元,或 options.speaking_speed、options.profanity_handling、conversation_mode、tts_mode 的值不在可用清單內(details.valid_values 列出可用的值) | 依 details.field 修正參數 |
internal_error | - | error | 處理單則 WebSocket 訊息時發生未預期內部錯誤(連線不受影響) | 連線保持,不應斷線;視為該則訊息失敗,可選擇重試該操作。details.message_type 與 details.action 標示失敗的具體操作(詳見 WebSocket API: 單一訊息錯誤) |
missing_transcription_languages | 400 | error | 未提供語音辨識語言 | 提供 transcription_languages |
invalid_transcription_language | 400 | error | 無效的語言代碼 | 使用有效的 BCP 47 語言代碼 |
invalid_translation_language | 400 | error | 無效的翻譯語言代碼 | translation_languages 必須使用支援的 BCP 47 代碼(見 languages.md) |
too_many_languages | 400 | error | 語言數量超過上限(details 帶 max/received;max 可能為系統上限或方案的同時識別語言數上限) | 轉錄語言最多 10 種、翻譯語言最多 12 種;使用吃到飽方案時依 details.max 減少語言數或升級方案 |
invalid_recording_type | 400 | error | 錄音類型無效 | 使用有效的類型 |
invalid_summary_template | 400 | error | 摘要模板無效 | 確認模板識別碼 |
method_not_allowed | 405 | error | 路徑正確但 HTTP 方法不支援(回應會帶 Allow 標頭列出支援的方法) | 改用 Allow 標頭列出的方法 |
invalid_action | 400/405 | error | WebSocket:此 action 不適用於目前的錄音模式。即時服務網域上的 REST 端點:HTTP 方法不支援(405,回應帶 Allow 標頭) | 依情境改用正確的 action 或 HTTP 方法 |
http_error | 4xx | error | 其他 HTTP 語意錯誤,實際狀態碼以回應為準 | 依回應的 HTTP 狀態碼處理 |
too_many_requests | 429 | error | 請求頻率過高。回應帶 X-RateLimit-* 與 Retry-After 標頭 | 依 Retry-After 等待後重試 |
invalid_service | - | error | 不支援的服務類型 | 確認 WebSocket 訊息的 type 欄位 |
前端錯誤處理範例
function handleError(error) {
const { error_code, severity, message } = error.data;
switch (severity) {
case 'fatal':
// 致命錯誤:停止服務,顯示錯誤頁面
showErrorPage(message);
disconnectWebSocket();
break;
case 'error':
// 操作失敗:顯示錯誤提示,允許重試
showErrorToast(message);
break;
case 'warning':
// 警告:顯示警告,不阻斷操作
showWarningToast(message);
break;
}
// 記錄錯誤用於除錯
console.error(`[${error_code}] ${message}`);
}
版本:V1.24.1 最後更新:2026-10-07