語音翻譯操作
概述
所有 voice-translation type 下可用的 action 一覽。關於連線與認證方式,請參考 連線與認證;關於回應事件格式,請參考 回應事件。
目錄
- start - 開始語音翻譯
- config - 設定術語庫/校正規則
- audio - 傳送音訊
- pause - 暫停翻譯
- resume - 恢復翻譯
- stop - 停止翻譯
- retranslate - 重新翻譯單句
- switch_language - 切換語言
- set_name - 設定錄音名稱
- rename_speaker - 全域重命名說話者
- reassign_speaker - 修改單句語者身份
- merge_speakers - 合併語者
- tts_play - 播放 TTS
- tts_stop - 停止 TTS
- tts_mode - 切換 TTS 模式
- set_tts - 互譯 TTS 設定
- start_speaking - 開始說話(手動模式)
- stop_speaking - 結束說話(手動模式)
- switch_conversation_mode - 切換對話模式
- set_speaker_language - 設定用戶語言
- set_speaking_speed - 錄音中調整語速
- add_channel - 新增聲道(多聲道)
- remove_channel - 停用聲道(多聲道)
- set_channel_language - 變更聲道語言(多聲道)
- set_summary - 錄音中更換摘要設定
- broadcast_go_live - 切換到正式階段
- broadcast_announcement - 發送公告
- set_standby_message - 設定預備階段文字
start - 開始語音翻譯
注意:字庫不要帶在
start裡。startpayload 若帶terminology/fuzzy_correction/translation_dict,這些欄位會被忽略(start本身仍會成功),並回一則config_ignored_in_start警告,details.ignored_fields列出被忽略的欄位。字庫一律改用configaction 送出。
功能說明
開始一個新的語音翻譯工作階段,並根據設定的參數開始處理音訊。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 start |
transcription_languages | string[] | 是 | 語音辨識語言(最多 10 個) |
translation_languages | string[] | 否 | 翻譯目標語言,可多個(最多 12 個;空=不翻譯)。transcribe / broadcast 自 v1.6.7 起會即時翻譯全部指定語言,每個語言各回一則 result 事件(見下方「多語言翻譯」範例)。互譯(conversation)不適用:此欄位由伺服器覆寫為對方語言、恆為單一語言。record 自 v1.7.0 起不支援翻譯,帶此欄位會回 400 record_translation_not_allowed |
realtime_translation | boolean | 否 | 即時翻譯模式(預設 false)。true:句子辨識過程中(interim)即逐字翻譯;false:整句完成(is_final)才翻譯。多語言翻譯的即時程度同樣由本旗標決定。廣播(broadcast)一律視為 true;互譯(conversation)不受此欄位影響,只翻整句 |
recognition_mode | string | 否 | 辨識模式:single(單人,預設)、multi_speaker(多人)、multi_channel(多聲道,v1.10.0,需開通後才可使用,見下方「多聲道模式說明」);multi_speaker 下 transcription_languages 必須恰好 1 個,否則回傳 diarization_multilang_conflict 錯誤並拒絕開始(type=conversation 除外:互譯強制單人模式,自 v1.7.2 起豁免此檢查) |
type | string | 是 | 錄音類型:transcribe、conversation、record、broadcast |
audio_format | string | 否 | 音訊格式:pcm(預設)、webm |
summary_template | string | 條件 | 摘要模板(transcribe 必填,conversation/broadcast 可選) |
options | object | 否 | 語音辨識選項 |
tts_enabled | boolean | 否 | 是否啟用 TTS 語音合成(預設 false) |
tts_language | string | 否 | TTS 輸出語言(需在 translation_languages 中) |
tts_voice | string | 否 | TTS 語音名稱(如 en-US-JennyNeural) |
tts_mode | string | 否 | TTS 播放模式:sync(同步,預設)、async(非同步)。只接受小寫的這兩個值,空字串視同未帶(sync);其他值(例如 "Async")會被拒絕(invalid_parameter,details.field 為 tts_mode),錄音不會開始。不論錄音類型、是否開啟 TTS 都會檢查 |
broadcast_token | string | 條件 | 廣播 Token(broadcast 類型必填,從 REST API 取得)。只能搭配 broadcast 類型:其他類型帶了會被拒絕(invalid_parameter,details.field 為 broadcast_token),錄音不會開始 |
active_language | string | 否 | 互譯模式初始 active 語言(預設 transcription_languages[0]) |
tts_config | object | 否 | 多語言 TTS 設定(廣播/互譯模式) |
broadcast_phase | string | 否 | 廣播初始階段:standby(預備)、live(正式,預設)。只接受小寫的這兩個值,空字串視同未帶(live);其他值(例如 "Live")會被拒絕(invalid_parameter,details.field 為 broadcast_phase),錄音不會開始 |
standby_message | string | 否 | 預備階段觀眾看到的訊息(預設:「準備中,請稍候...」) |
name | string | 否 | 初始預設錄音名稱(去掉前後空白後最多 60 字元,系統仍可覆蓋;未提供則自動生成如 Transcription #1)。超過上限會被拒絕(invalid_parameter,details.field 為 name),錄音不會開始 |
summary_language | string | 否 | 摘要輸出語言(不指定時預設使用辨識語言;廣播模式自動從頻道設定讀取)。最多 20 字元,超過會被拒絕(invalid_parameter,details.field 為 summary_language),錄音不會開始 |
summary_mode | string | 否 | 摘要模式 enum:builtin(套用內建模板,預設)/ custom(客戶 prompt 完整取代內建模板)。缺值時自動推斷 builtin |
summary_prompt | string | 否 | custom mode 必填(只含空白字元視同未填)、builtin mode 視為補充指示。≤3000 字元 |
summary_prompt_slug | string | 否 | custom mode 必填(只含空白字元視同未填)、builtin mode 禁帶。客戶自家識別碼(≤64 字元,Unicode、禁控制字元;pass-through 保存於後端記錄,供歷史查詢) |
summary_plain_text | boolean | 否 | 摘要要求純文字輸出(預設 false;開啟後後端做 Markdown 後處理) |
speakers | object[] | 否 | 互譯模式用戶語言設定(有帶時須恰好 2 位,見下方說明)。沒帶時,用戶 1 對應 transcription_languages[0]、用戶 2 對應 transcription_languages[1] |
conversation_mode | string | 否 | 互譯對話模式:auto(自動偵測,預設)、manual(手動 PTT)。只接受小寫的這兩個值,空字串視同未帶(auto);其他值會被拒絕(invalid_parameter,details.field 為 conversation_mode),錄音不會開始。非互譯類型帶了也會檢查 |
channel_mode | string | 條件 | 多聲道子模式(multi_channel 必填,v1.10.0):per_channel(每路聲道獨立辨識)或 shared(各路輪流發言、共用一條辨識,v1.21.0);其他值回 invalid_channel_mode |
channels | object[] | 條件 | 多聲道聲道清單(multi_channel 必填,1~8 路,含主講者,慣例 channel_id: 1;欄位見下方「多聲道模式說明」) |
silenceTimeoutSeconds | integer | 否 | 連續多少秒沒有偵測到語音就自動結束錄音:不帶或 null 使用預設值(900 秒);0 表示這一場不會因為沒有語音而結束;其餘須為 60~86400 的整數,其他值會被拒絕。詳見下方 長時間沒有語音時自動結束 |
options 子欄位
options 為語音辨識選項物件,皆為選用;省略時用各自預設值。
| 欄位 | 類型 | 預設 | 說明 |
|---|---|---|---|
speaking_speed | string | normal | 說話速度,影響斷句的靜音判斷門檻:very_slow / slow / normal / fast / very_fast(各等級的門檻見下方 speaking_speed 等級,預設 normal 為 800ms)。講者較慢時調慢(門檻拉長,避免句中停頓被誤切);較快時調快(更早斷句)。可於錄音中透過 set_speaking_speed 動態調整。只接受小寫的這五個值,空字串視同未帶(normal);其他值會被拒絕(invalid_parameter,details.field 為 options.speaking_speed),錄音不會開始 |
profanity_handling | string | mask | 敏感詞處理:mask(以 *** 遮蔽)/ remove(移除)/ show(顯示原文)。只接受小寫的這三個值,空字串視同未帶(mask);其他值會被拒絕(invalid_parameter,details.field 為 options.profanity_handling),錄音不會開始 |
註:以上選項作用於 STT 斷句;多人模式(
multi_speaker)目前不套用speaking_speed。
speaking_speed 等級
一段靜音持續超過門檻,就視為一句結束。門檻越長,越能容忍句中停頓(一句話比較不會被切成兩句),但每句出現的時間也越晚。
| 等級 | 斷句的靜音門檻 |
|---|---|
very_fast | 300ms |
fast | 600ms |
normal(預設) | 800ms |
slow | 1200ms |
very_slow | 1500ms |
請求範例(基本)
{
"type": "voice-translation",
"data": {
"action": "start",
"transcription_languages": ["zh-TW"],
"translation_languages": ["en-US"],
"realtime_translation": false,
"type": "transcribe",
"audio_format": "pcm",
"summary_template": "meeting",
"options": {
"speaking_speed": "normal",
"profanity_handling": "mask"
}
}
}
請求範例(多語言翻譯,v1.6.7)
translation_languages 指定多個語言即可同時翻譯(最多 12 個),適用 transcribe 與 broadcast(互譯的翻譯語言由伺服器指定、恆為單一語言;record 自 v1.7.0 起不支援翻譯):
{
"type": "voice-translation",
"data": {
"action": "start",
"transcription_languages": ["zh-TW"],
"translation_languages": ["en-US", "ja-JP", "ko-KR"],
"realtime_translation": true,
"type": "transcribe",
"summary_template": "meeting"
}
}
接收方式:每個語言各回一則獨立的 result 事件(同一 sid、translations 內單一語言 key),不會在一則事件中合併多語言。客戶端需以「sid + 語言代碼」累積譯文、不可互相覆蓋。各語言完成順序不固定(並行翻譯),部分語言失敗時其餘語言仍照常送達(失敗語言另收 error 事件,details.translation_language 指明失敗語言)。
計費提醒:翻譯自第 2 種語言起按語言數量計費加乘(詳見計費說明)。指定 N 種語言即按 N 種計費。
請求範例(初始預設名稱)
{
"type": "voice-translation",
"data": {
"action": "start",
"transcription_languages": ["zh-TW"],
"translation_languages": ["en-US"],
"type": "transcribe",
"audio_format": "pcm",
"summary_template": "meeting",
"name": "產品規劃會議"
}
}
錄音名稱規則
| 情境 | 名稱 | name_source | 系統會覆蓋? |
|---|---|---|---|
start 帶 name 參數 | 初始預設名稱 | default | 是 |
start 未帶 name | 自動生成(如 Transcription #1、Broadcast #3) | default | 是 |
使用 set_name 設定 | 用戶明確設定的名稱 | user | 否 |
| Session 結束後系統自動生成 | 根據逐字稿內容生成摘要名稱 | llm | — |
注意:
start的name為初始預設名稱,Session 結束時系統仍可能覆蓋。若需固定名稱,請使用set_name。
預設名稱格式(固定英文):
| 錄音類型 | 預設名稱格式 |
|---|---|
transcribe | Transcription #N |
conversation | Conversation #N |
record | Recording #N |
broadcast | Broadcast #N |
N為該用戶同類型錄音的流水號。名稱優先順序:user>llm>default。用戶設定名稱後,Session 結束時 系統不會覆蓋。
請求範例(含 TTS)
{
"type": "voice-translation",
"data": {
"action": "start",
"transcription_languages": ["zh-TW"],
"translation_languages": ["en-US"],
"realtime_translation": true,
"type": "transcribe",
"tts_enabled": true,
"tts_language": "en-US",
"tts_voice": "en-US-JennyNeural",
"tts_mode": "sync"
}
}
請求範例(互譯模式 - 自動偵測)
{
"type": "voice-translation",
"data": {
"action": "start",
"type": "conversation",
"transcription_languages": ["zh-TW", "en-US"],
"active_language": "zh-TW",
"audio_format": "pcm",
"speakers": [
{ "id": 1, "language": "zh-TW" },
{ "id": 2, "language": "en-US" }
],
"tts_config": {
"zh-TW": { "voice": "zh-TW-HsiaoChenNeural", "speaking_rate": 1.0 },
"en-US": { "voice": "en-US-JennyNeural", "speaking_rate": 1.0 }
}
}
}
請求範例(互譯模式 - 手動模式)
{
"type": "voice-translation",
"data": {
"action": "start",
"type": "conversation",
"transcription_languages": ["zh-TW", "en-US"],
"conversation_mode": "manual",
"audio_format": "pcm",
"speakers": [
{ "id": 1, "language": "zh-TW" },
{ "id": 2, "language": "en-US" }
],
"tts_config": {
"zh-TW": { "voice": "zh-TW-HsiaoChenNeural", "speaking_rate": 1.0 },
"en-US": { "voice": "en-US-JennyNeural", "speaking_rate": 1.0 }
}
}
}
互譯模式特殊規則:
| 項目 | 說明 |
|---|---|
transcription_languages | 必須恰好 2 個,且不可相同 |
translation_languages | 由伺服器覆寫:即使提供也會被忽略,一律強制為 active language 的另一個語言 |
realtime_translation | 互譯模式下沒有作用:翻譯只在整句辨識完成後才會送出,不論此欄位設為 true 或 false 結果相同 |
active_language | 可選,預設 transcription_languages[0] |
recognition_mode | 強制 single;speaker_diarization 會被接受但忽略(v1.7.2 起。此前帶 speaker_diarization=true 會被誤判為「語者分離與多語言互斥」而回 400) |
tts_enabled | 預設 true;設為 false 僅回傳文字翻譯 |
tts_config | 可選,為兩個語言各自設定 TTS 語音;留空自動使用預設語音 |
summary_template | 可選,提供時停止後自動生成摘要 |
speakers | 可選,指定每位用戶的語言(有帶時恰好 2 位);沒帶時,用戶 1、2 依序對應 transcription_languages 的兩個語言 |
conversation_mode | 可選,auto(自動偵測,預設)或 manual(手動 PTT) |
speakers 欄位說明:
| 欄位 | 類型 | 必填 | 說明 |
|---|---|---|---|
id | int | 是 | 用戶編號(1 或 2) |
language | string | 是 | 該用戶的語言代碼(須在 transcription_languages 中) |
conversation_mode 說明:
| 模式 | 說明 |
|---|---|
auto(預設) | 系統自動偵測說話語言,自動斷句 |
manual | 用戶透過 start_speaking / stop_speaking 控制說話時段,期間音訊合併為單一句子 |
成功回應
啟動成功後回傳 session_started 事件,包含完整的 Session 初始資訊。即時錄音會先扣第一分鐘,扣點完成後才回傳(見計費說明)。
一般錄音(transcribe / conversation / record):
{
"type": "voice-translation",
"data": {
"action": "session_started",
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"task_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"recording_type": "transcribe",
"recognition_mode": "single",
"message": "語音辨識已開始",
"resume_token": "L0VBAwIy...(43 字元)",
"resume_grace_seconds": 45,
"server_time": 1749550000000
}
}
廣播模式(broadcast):
{
"type": "voice-translation",
"data": {
"action": "session_started",
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"task_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"recording_type": "broadcast",
"recognition_mode": "multi_speaker",
"phase": "standby",
"viewer_count": 0,
"queue_count": 0,
"peak_viewers": 0,
"total_viewers": 0,
"message": "語音辨識已開始",
"resume_token": "L0VBAwIy...(43 字元)",
"resume_grace_seconds": 45,
"server_time": 1749550000000
}
}
回應欄位說明請參考 session_started 事件。
錄音類型說明
| type | 說明 | 使用場景 |
|---|---|---|
transcribe | 語音轉文字 | 會議記錄、訪談紀錄 |
conversation | 對話記錄 | 雙向溝通、客服對話 |
record | 單純錄音 | 語音備忘、快速記錄 |
broadcast | 廣播/直播 | 講座、演講、直播內容 |
廣播模式說明(type: "broadcast")
廣播模式時,語言設定會自動從廣播頻道設定取得,無需在 WebSocket 訊息中傳送。
必填參數:
| 參數 | 類型 | 說明 |
|---|---|---|
type | string | 必須為 "broadcast" |
broadcast_token | string | 廣播 Token(透過 REST API 建立廣播後取得) |
audio_format | string | 音訊格式(pcm 或 webm) |
可選參數(覆蓋廣播頻道設定):
| 參數 | 類型 | 說明 |
|---|---|---|
tts_config | object | 多語言 TTS 設定(覆蓋建立時的設定) |
summary_template | string | 摘要模板 slug(覆蓋建立時的設定,不提供則使用廣播頻道預設值) |
自動設定的參數(可省略):
transcription_languages:自動從廣播設定讀取translation_languages:自動從廣播設定讀取realtime_translation:廣播模式一律啟用,帶false也視為true;翻譯一律以即時翻譯計費summary_template:自動從廣播設定讀取(WebSocket 傳入值優先)summary_language:自動從廣播設定讀取(WebSocket 傳入值優先)
主講端與觀眾端都會收到翻譯的中間結果:同一句翻譯先送出
is_final: false,最後才送出is_final: true的定稿。請以sid加language覆蓋顯示;只想顯示定稿,略過is_final: false即可。錄音名稱不會沿用頻道名稱。
start未帶name時,自動生成如Broadcast #1;命名方式與其他類型相同,見錄音名稱規則。
廣播階段說明:
| broadcast_phase | 說明 | 行為 |
|---|---|---|
live(預設) | 正式階段 | STT/翻譯結果廣播給觀眾,寫入逐字稿 |
standby | 預備階段 | STT/翻譯結果只給主講者,觀眾看到 standby_message |
預備階段用途:讓主講者在正式開始前進行 STT/翻譯熱機測試,確認設備正常後再切換到正式階段。
預備階段有時間上限(預設 30 分鐘):累計達上限,這一場會自動結束;到期前約 2 分鐘先送出預警。詳見 預備階段的時間上限。
broadcast_phase只接受小寫的standby、live:空字串視同live,其他值會被拒絕(invalid_parameter)。
廣播模式請求範例:
{
"type": "voice-translation",
"data": {
"action": "start",
"type": "broadcast",
"broadcast_token": "a3f9",
"audio_format": "pcm"
}
}
廣播模式請求範例(預備階段 + 覆蓋摘要模板):
{
"type": "voice-translation",
"data": {
"action": "start",
"type": "broadcast",
"broadcast_token": "a3f9",
"audio_format": "pcm",
"broadcast_phase": "standby",
"standby_message": "演講即將開始,請稍候...",
"summary_template": "lecture"
}
}
摘要模板優先順序:WebSocket
start傳入值 > 廣播頻道建立時設定的預設值。若兩者皆未設定,則不自動生成摘要。
廣播模式 TTS 設定(tts_config):
透過 tts_config 參數指定哪些翻譯語言需要產生 TTS 語音給觀眾。
| tts_config 欄位 | 類型 | 說明 |
|---|---|---|
| voice | string | TTS 語音名稱 |
| speaking_rate | number | 語速(0.5~2.0,預設 1.0)。超出範圍時自動調整至最接近的邊界值 |
{
"type": "voice-translation",
"data": {
"action": "start",
"type": "broadcast",
"broadcast_token": "a3f9",
"audio_format": "pcm",
"tts_config": {
"en-US": {
"voice": "en-US-JennyNeural",
"speaking_rate": 1.0
},
"ja-JP": {
"voice": "ja-JP-NanamiNeural",
"speaking_rate": 1.0
}
}
}
}
注意:
- TTS 語言必須是
translation_languages中的有效語言,無效語言會被自動忽略- 主講者(WebSocket)不會收到 TTS 音訊,只有 SSE 觀眾會收到
tts_ready事件- TTS 只在
live階段發送,standby階段不會發送
多聲道模式說明(recognition_mode: "multi_channel")
一場錄音同時接多支實體麥克風(每人一支),語者身分由聲道決定——哪支麥克風收到的音訊,就是哪位語者的發言,系統不做語者推斷。適用於每人配有專屬麥克風的會議、圓桌討論等場景(v1.10.0)。
有兩種子模式(channel_mode):
| 子模式 | 辨識方式 | 語言 | 適用 |
|---|---|---|---|
per_channel | 每路各自獨立辨識,可同時說話 | 每路綁定恰好 1 種,各路可不同 | 多人可能同時發言、各說不同語言 |
shared(v1.21.0) | 各路輪流發言、共用一條辨識 | 全場共用 session 級設定 | 同一時間只有一個人說話(主持人與來賓輪流等) |
適用範圍與硬限制:
| 項目 | 規則 |
|---|---|
| 功能開通 | 需開通後才可使用;未開通的環境送出會回 invalid_recognition_mode |
| 錄音類型 | 僅 transcribe 與 record;conversation 回 invalid_parameter、broadcast 回 multichannel_broadcast_not_allowed |
| 音訊格式 | 僅支援 pcm(16kHz/16-bit/mono/little-endian);其他值回 multichannel_requires_pcm |
| TTS | 不支援;tts_enabled: true 回 multichannel_tts_not_allowed |
speaker_diarization | 不可同時指定(多聲道本身即為語者分離的一種);同時帶會回 invalid_parameter |
switch_language | 多聲道禁用(語言綁定在聲道上),一律回 multichannel_switch_language_not_allowed;per_channel 請改用 set_channel_language |
| 音檔長度上限 | 一場多聲道錄音保存的音訊有總量上限,開著的聲道越多越早碰到(8 路約 70 分鐘)。碰到上限後,音檔與錄音時長(duration_ms)停在上限當下,逐字稿與扣點照常繼續 |
channels 欄位說明:
| 欄位 | 類型 | 必填 | 說明 |
|---|---|---|---|
channel_id | int | 是 | 聲道編號,值域 1~8、不可重複。會成為該路語者的 speaker_id(格式 channel_{N});慣例主講者用 1 |
speaker_name | string | 否 | 該路語者的顯示標籤(最大 100 字元,不可含控制字元)。未提供時可於錄音中用 rename_speaker 補設 |
transcription_languages | string[] | 條件 | 該路的轉錄語言。per_channel 必填、恰好 1 個(一路綁一種語言);shared 不可帶(回 channel_language_not_allowed) |
語言一致性規則(
per_channel):各聲道語言的聯集(去重後)必須與 session 級transcription_languages完全一致,否則回channel_language_mismatch(details會同時列出兩邊的語言清單,方便對齊)。
多聲道請求範例:
{
"type": "voice-translation",
"data": {
"action": "start",
"type": "transcribe",
"recognition_mode": "multi_channel",
"channel_mode": "per_channel",
"transcription_languages": ["zh-TW", "ja-JP"],
"translation_languages": ["en-US"],
"audio_format": "pcm",
"summary_template": "meeting",
"channels": [
{ "channel_id": 1, "speaker_name": "主講者", "transcription_languages": ["zh-TW"] },
{ "channel_id": 2, "speaker_name": "王經理", "transcription_languages": ["zh-TW"] },
{ "channel_id": 3, "speaker_name": "佐藤", "transcription_languages": ["ja-JP"] }
]
}
}
成功回應:session_started 的 data 會帶回 channel_mode 與 channels[](每路含 channel_id、speaker_name、transcription_languages、status;shared 模式不帶 transcription_languages)。各路初始 status 為 preparing,該路辨識出第一句時透過 channel_status 事件 轉為 ready。
注意:請務必檢查
session_started是否帶回channel_mode:這是確認伺服器確實以多聲道模式啟動的訊號。若回應中沒有channel_mode,代表伺服器不支援多聲道,channels[]已被忽略、實際只跑單路。
多聲道其他行為:
audio的每一幀都必須帶channel_id(見 audio)- 錄音中可透過 add_channel/remove_channel 動態增減聲道、set_channel_language 變更單路語言;
set_speaking_speed也支援多聲道(見該章節) rename_speaker可正常使用(可在該路開口前先改名);新名稱不可與其他聲道的名稱重複(含各聲道在start時設定的名稱),重複會回speaker_name_duplicate。reassign_speaker與merge_speakers不適用於多聲道(語者身分由聲道決定,無重新指派的空間),會回speaker_op_not_allowed_multi_channelpause/resume:暫停期間錄音檔照常保存、不出字;恢復後暫停期間講的話會補轉錄(時間戳落在實際講話時刻)。補轉錄有上限——全場共 60 秒的尾段(per_channel多路時平分到各路;shared為整條最後 60 秒,所有聲道一起補、語者照標),超過的部分僅存於音檔。暫停瞬間講到一半的句子可能不會出現在逐字稿(與單路一致);若該句確實沒有留下,恢復時會另外收到 segment_discarded(reason: "resumed")result事件的origin會帶channel_id與speaker_id(格式channel_{N});逐字稿每句也帶channel_id(詳見回應事件)- 吃到飽方案需含多聲道功能;方案可另設聲道路數上限,超過會在
start/add_channel當場回plan_feature_not_allowed(details.field為max_stt_streams) - 計費:語音辨識+語者分離為基礎,
per_channel另按當下聲道路數加價;shared固定以 1 路採計,詳見計費說明
shared 模式(v1.21.0):
請求範例:
{
"type": "voice-translation",
"data": {
"action": "start",
"type": "transcribe",
"recognition_mode": "multi_channel",
"channel_mode": "shared",
"transcription_languages": ["zh-TW", "en-US"],
"audio_format": "pcm",
"channels": [
{ "channel_id": 1, "speaker_name": "主持人" },
{ "channel_id": 2, "speaker_name": "來賓 A" },
{ "channel_id": 3, "speaker_name": "來賓 B" }
]
}
}
客戶端必須遵守:
- 同一時刻只送一路:只送目前發言者那一路的
audio。同時送多路時,各路聲音會依收到的順序排進同一條辨識,逐字稿會錯亂(計費不受影響)。 - 持續送靜音:沒有人說話時,目前那一路也要持續送靜音(建議每 100ms 一幀),不要停送。
- 僅
pcm(同多聲道共通規則)。 - 語言全場共用:各路不可指定
transcription_languages(回channel_language_not_allowed);錄音中不能變更語言(set_channel_language回channel_language_not_allowed)。 - 第一路不可移除:
channels[]的第一路承載全場的辨識,remove_channel會回channel_remove_not_allowed;其他路可移除。
聲道狀態:
- 其他聲道的
status跟著第一路:第一路轉ready時全部一起轉ready;第一路重新準備辨識(暫停恢復、斷線續接、自動重連)時全部一起回到preparing,每一路各收到一則 channel_status,reason與第一路相同。斷線續接時的preparing由resume_ok的快照帶回,不另送事件。 add_channel新增的聲道直接套用第一路當下的狀態;removed依各路自己的狀態。- 第一路變成
error時,其他聲道也一起變成error(reason相同);第一路恢復時一起恢復。 session_started與resume_ok的channels[]快照依同一規則;每路不帶transcription_languages。
已知限制:
- 換人的間隔小於約 0.8 秒時,前後兩人的話可能被併成一句,整句只標一個語者。
- 語者依聲道標記決定,在輪流發言的情境下準確度高;
reassign_speaker、merge_speakers不適用,無法事後修正。
TTS 播放模式說明
| 模式 | 說明 | 行為 |
|---|---|---|
sync | 同步模式(預設) | 自動播放最新的 is_final=true 翻譯句子,若前一句仍在播放則進入佇列等待 |
async | 非同步模式(手動控制) | 用戶可選擇任何已翻譯的句子進行 TTS,使用 tts_play 指令控制 |
長時間沒有語音時自動結束
錄音連續一段時間沒有辨識出任何文字(包含尚未定稿的中間結果),會自動結束,避免忘記停止的錄音持續計費。
- 預設門檻為 900 秒(15 分鐘),可用
silenceTimeoutSeconds逐場調整;結束前約 2 分鐘會先送出一次預警。 - 辨識出文字就從 0 重新計時;
resume與start_speaking也會重新計時。 - 以下情況不計時:
- 暫停中:恢復後從 0 重新計時。暫停期間照常計費,要停止計費請結束錄音。
- 斷線等待續接的期間:續接後接著原本的秒數計算。
- 廣播(
type: "broadcast"):整場都不會因為沒有語音而結束。預備階段另有時間上限,見 廣播功能指南。
- 多聲道:所有聲道都沒有辨識出文字才算;單一聲道沒有聲音不會結束錄音。
- 互譯手動模式:沒有按下說話時辨識到的聲音,也會重新計時。
silenceTimeoutSeconds 的值(start 的 data 頂層,選填)
| 值 | 效果 |
|---|---|
不帶,或 null | 使用預設門檻 |
0 | 這一場不會因為沒有語音而自動結束,適合長時間開著、可能長時間沒人說話的場合 |
| 60~86400 的整數 | 這一場的門檻秒數 |
| 其他值 | start 被拒絕,錯誤碼 invalid_parameter(details.field 為 silenceTimeoutSeconds),錄音不會開始 |
- 必須是 JSON 整數:字串(例如
"900")、小數寫法(例如900.0、1e3)、布林值都會被拒絕。 - 參數名稱是
silenceTimeoutSeconds;寫成silence_timeout_seconds會被拒絕(details.field為silence_timeout_seconds),不會被忽略。 - 廣播帶合法的值不會生效,但不合法的值一樣會被拒絕。
- 門檻在 120 秒以下時不會送出預警,時間到就直接結束。
- 斷線續接會沿用原本的設定;開始新的一場錄音時要再帶一次。
會收到的事件
stt_silence_warning(error事件,severity: "warning"):預警,錄音照常進行。details.silenceSeconds為已經持續的秒數,details.remainingSeconds為剩下的秒數。不要當成錄音結束;辨識出文字、或恢復錄音,就會重新計時。stt_silence_timeout(severity: "fatal"):錄音已自動結束。details.silence_seconds為判定的門檻秒數。- 接著依序收到
status: "ended"與task_complete,和客戶端送出stop相同:錄音照常保存、產生摘要,計費算到結束為止。
{
"type": "error",
"data": {
"error_code": "stt_silence_warning",
"severity": "warning",
"message": "No speech detected for a while; the recording will end automatically soon",
"context": "stt",
"request_id": "req_abc123xyz789",
"timestamp": "2026-09-25T10:28:00.000Z",
"details": {
"silenceSeconds": 780,
"remainingSeconds": 120
}
}
}
收到
stt_silence_timeout後請停止送出音訊;之後送達的音訊會各回一則session_not_started,可以忽略。
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
missing_transcription_languages | 400 | 未提供語言參數 | 確認請求包含 transcription_languages |
invalid_transcription_language | 400 | 無效的語言代碼 | 確認語言代碼格式正確(如 zh-TW) |
too_many_languages | 400 | 語言數量超過上限 | 轉錄語言最多 10 種、翻譯語言最多 12 種 |
invalid_recording_type | 400 | 錄音類型無效 | 使用有效的類型值 |
audio_format_unsupported | 400 | audio_format 不支援,details.supported_formats 列出可用值 | 改用可用的音訊格式 |
invalid_summary_template | 400 | 摘要模板無效 | 確認模板識別碼正確 |
stt_init_failed | 503 | 服務初始化失敗 | 稍後重試 |
auth_insufficient_credit | 402 | 點數不足 | 儲值點數後再使用 |
auth_quota_exceeded | 402 | 可用點數不足,錄音未開始(即時錄音為不足一分鐘;連線不關閉;details.remaining_budget 為最近一次結算時的可用點數,details.budget_scope 說明那是誰的額度) | 儲值後重新 start |
daily_limit_reached | — | 用量已達方案上限,錄音未開始 | 依方案規則重置(每日上限隔日重置)後恢復 |
auth_service_error | 500 | 服務暫時不可用,錄音未開始(連線不關閉) | 稍後重新 start |
service_shutdown | — | 服務正在關閉,錄音未開始,之後連線會關閉 | 稍後重新連線再 start |
tts_init_failed | 503 | TTS 服務初始化失敗 | 稍後重試 |
tts_invalid_language | 400 | TTS 語言不在翻譯語言中 | 確認 tts_language 在 translation_languages 中 |
broadcast_token_required | 400 | 廣播模式需要 Token | broadcast 類型必須提供 broadcast_token |
broadcast_token_invalid | 401 | 廣播 Token 無效 | 確認 Token 正確且未過期 |
broadcast_not_ready | 503 | 廣播服務尚未啟動 | 稍後重試 |
summary_invalid_mode | 400 | summary_mode 不是 builtin / custom | 改為合法 mode |
summary_mode_field_mismatch | 400 | mode 與欄位組合不符(必填缺漏 / 禁帶被帶入) | 依 mode 規則調整欄位 |
summary_prompt_too_long | 400 | summary_prompt 超過 3000 字元 | 縮短自訂 prompt |
summary_prompt_slug_too_long | 400 | summary_prompt_slug 超過 64 字元 | 縮短識別碼 |
summary_prompt_slug_invalid | 400 | summary_prompt_slug 含控制字元(\n / \r / \t / \0 等) | 移除控制字元 |
invalid_recognition_mode | 400 | 辨識模式無效,或多聲道功能未在此環境開通(v1.10.0) | 確認 recognition_mode 值;多聲道需先開通 |
channel_mode_required | 400 | 多聲道未指定 channel_mode(v1.10.0) | 提供 channel_mode(per_channel 或 shared) |
invalid_channel_mode | 400 | channel_mode 不是 per_channel 或 shared;shared 在此環境未開通時也回此錯(v1.10.0) | 修正 channel_mode;未開通時改用 per_channel |
channel_language_not_allowed | 400 | shared 模式的聲道帶了 transcription_languages(v1.21.0) | 移除各路的 transcription_languages |
channels_required | 400 | 多聲道未提供 channels(v1.10.0) | 提供 1~8 路聲道設定 |
too_many_channels | 400 | 聲道數超過上限 8(v1.10.0) | 減少聲道數 |
invalid_channel_id | 400 | channel_id 超出值域(1~8)或重複(v1.10.0) | 修正 channel_id |
channel_language_required | 400 | 某聲道未指定恰好一種語言(v1.10.0) | 每路 transcription_languages 帶恰好 1 個 |
channel_language_mismatch | 400 | 各聲道語言聯集與 transcription_languages 不一致(v1.10.0) | 對齊兩份語言清單 |
speaker_name_duplicate | 422 | 兩路以上使用相同的 speaker_name(v1.10.0) | 每一路的名稱必須不同(不帶名稱則不受限) |
multichannel_requires_pcm | 400 | 多聲道僅支援 pcm 音訊格式(v1.10.0) | audio_format 改用 pcm |
multichannel_tts_not_allowed | 400 | 多聲道不支援語音合成(v1.10.0) | 關閉 tts_enabled |
multichannel_broadcast_not_allowed | 400 | 廣播不支援多聲道(v1.10.0) | 廣播改用 multi_speaker 或 single |
invalid_parameter | 400 | 多聲道與 conversation 或 speaker_diarization 同時指定,或 speaker_name 超長/含控制字元(v1.10.0);silenceTimeoutSeconds 的值或名稱不合法、broadcast_phase 的值不合法、非 broadcast 類型帶 broadcast_token(v1.18.0);name 超過 60 字元、summary_language 超過 20 字元,或 options.speaking_speed、options.profanity_handling、conversation_mode、tts_mode 的值不在可用清單內(v1.24.0,details.valid_values 列出可用的值) | 依 details.field 修正參數 |
plan_feature_not_allowed | 403 | 方案不含多聲道,或聲道數超過方案路數上限(details.field 為 max_stt_streams,v1.10.0) | 減少聲道或升級方案 |
config - 設定術語庫/校正規則
功能說明
在錄音開始前或進行中傳入術語庫、模糊詞校正規則和翻譯字典設定。這些設定可提升 STT 識別率、修正同音字錯誤、確保翻譯一致性。
術語庫也會參與同音校正:傳入 terminology 時,術語會同時成為同音比對的依據 —— 逐字稿中讀音相同但用字不同的片段會被修正回術語的寫法。因此只設定 terminology 就能得到校正效果,不必手動列出可能的錯字。
同音校正的完整說明(對照表、適用語言僅限中文、常見詞保護、讀音差異的限制)見 字庫使用指南 → 術語庫如何參與同音校正。
數量限制
各區塊的筆數上限、長度上限與對應的錯誤碼,整理在 字庫使用指南 → 數量限制。
上限的數字是預設值,實際生效值可依環境調整 —— 一律以錯誤回應
details裡的max為準, 不要把數字寫死在整合裡。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 config |
terminology | object | 否 | 術語庫設定 |
fuzzy_correction | object | 否 | 模糊詞校正規則 |
translation_dict | object | 否 | 翻譯字典 |
注意:至少需要提供一個設定項目。
注意:全有全無:三個區塊的驗證在任何一項套用之前一次做完。任一項驗證失敗即回錯,三個區塊都不會套用,設定維持原狀。
例如送出「合法的術語庫 + 超過 3000 條的翻譯字典」會收到
config_too_many_dict_entries,而術語庫也不會生效。修正後重送完整的config即可,三個區塊都是整批覆蓋,重送不會與先前的設定疊加。
術語庫格式(terminology)
以語言代碼為 key,術語陣列為 value:
{
"zh-TW": [
{ "term": "語者分離" },
{ "term": "WebSocket" }
],
"en-US": [
{ "term": "diarization" }
]
}
| 欄位 | 類型 | 必填 | 說明 |
|---|---|---|---|
term | string | 是 | 術語(最大 100 字元) |
限制:一次
config的所有語言合計最多 500 筆術語——不是每種語言各 500。超過時回config_too_many_entries(details帶count與max)。語言適用範圍:術語只會套用在語言代碼相符的辨識語言上。多聲道的每一路、多人語者分離、音檔匯入這幾種單一語言的情境,只會使用該語言的術語;多語轉錄與互譯則使用本次宣告語言的術語。登記在本次未使用語言底下的術語不會生效,但仍計入上述 500 筆合計。
這些數字是預設值:實際生效的上限可依環境調整,一律以錯誤回應
details裡的max為準。
模糊詞校正格式(fuzzy_correction)
注意:此欄位通常不需要手動設定 —— 讀音相同或相近的錯字,
terminology就能修正。以下三種情況才需要用它:
- 錯字本身是常見詞(會被常見詞保護擋下),例如把「晶圓」聽成「金元」
- 錯字與正確詞讀音差距很大,例如外語品牌名被聽成音韻無關的詞
- 日文、韓文、英文的錯字(這些語言不參與同音比對)
correct若為中文,同樣會成為同音比對的依據 —— 未列在incorrect的同音錯法也會被修正回correct。case_insensitive只作用於incorrect的字面比對,不影響同音比對。
以語言代碼為 key,校正規則陣列為 value:
{
"zh-TW": [
{ "correct": "語者分離", "incorrect": ["語這分離", "語者分力"] },
{ "correct": "IPEVO", "incorrect": ["ltfo"], "case_insensitive": true }
]
}
| 欄位 | 類型 | 必填 | 說明 |
|---|---|---|---|
correct | string | 是 | 正確詞彙 |
incorrect | string[] | 條件 | 錯誤變體列表,每項最多 200 字元。中文術語可以省略(見下方說明);其他情況必填,空陣列會回 config_invalid_entry(reason: "empty") |
case_insensitive | boolean | 否 | 本條規則的變體是否忽略大小寫(預設 false = 嚴格比對) |
只給正確詞、不列錯字:
correct是中文(含漢字)時,incorrect可以整個省略 —— 系統會依讀音自動比對,逐字稿中讀音相同或相近的寫法會被修正回correct。{ "fuzzy_correction": { "zh-TW": [{ "correct": "艾思通" }] } }上例不必列出任何錯字,「愛思通」「愛時通」「愛司東」「愛似通」都會被修正。 只有讀音差距較大的寫法(例如「愛自動」)或音節數不同的(例如「愛松」)才需要另外列進
incorrect。注意:兩個條件缺一不可:語言要是中文(
zh-TW/zh-CN/zh-HK等),且correct要含漢字。 不滿足時incorrect仍為必填 —— 因為那些情況省略了不會有任何效果, 收下反而會讓你以為設定成功。日文、韓文、英文的錯字請明確列出。
大小寫:
case_insensitive為選填、預設false(嚴格比對)。設為true時,該條規則的所有incorrect變體都會忽略大小寫。旗標是逐條的 —— 同一個correct可拆成多條規則各自設定,例如把不會與一般詞彙衝突的變體設為忽略大小寫、把可能撞到人名的變體維持嚴格。對中文規則無作用(中文無大小寫概念)。注意:開啟後誤傷面會擴大:若
ivo設為忽略大小寫,人名Ivo也會被替換。
同一個錯誤變體出現在多條規則時:碰撞以
incorrect(錯誤變體)為準判斷,不是correct。
- 多條規則指向不同正確詞時,實際生效的是哪一條不保證,請勿依賴任何順序(包含登記順序)
- 大小寫旗標取嚴格優先——只要有任一條沒開
case_insensitive,該變體就以嚴格比對處理「嚴格優先」是刻意的保守設計:避免字庫別處的寬鬆規則,把一條明確設為嚴格的品牌名規則悄悄放寬。
因此「同一個
correct拆成多條規則」是安全的(各條的incorrect不重複即可);但若你的資料存在「同一個錯誤變體對應到不同正確詞」,後出現的那條會被忽略且不會有任何提示,建議送出前先檢查變體是否重複。
限制:一次
config的所有語言合計最多 4000 條規則,超過回config_too_many_entries(details帶field: "fuzzy_correction"、count、max)。這個數字是預設值:實際生效的上限可依環境調整,一律以錯誤回應
details裡的max為準。 請不要把數字寫死在你的整合裡 —— 送出前若要自行檢查,讀max回填; 收到超限錯誤時,details同時帶著count(你送了幾個)與max(實際上限)。語言適用範圍:校正規則只會套用在語言代碼相符的句子上——登記在
zh-TW底下的規則不會動到英文句子。系統判不出句子語言時,會退回套用全部規則(寧可多套也不整句不套)。術語庫參與的同音比對同樣依術語登記的語言。
翻譯字典格式(translation_dict)
以語言代碼分組,每個語言各自一份字典:
{
"en-US": [
{ "source": "語者分離", "target": "Speaker Diarization" },
{ "source": "晶圓", "target": "wafer", "case_sensitive": true }
],
"ja-JP": [
{ "source": "語者分離", "target": "話者分離" }
]
}
| 欄位 | 類型 | 必填 | 說明 |
|---|---|---|---|
| (頂層鍵) | string | 是 | 目標語言代碼 |
source | string | 是 | 來源詞彙(使用 STT 語言),最多 200 字元 |
target | string | 是 | 該語言的指定譯法,最多 200 字元 |
case_sensitive | boolean | 否 | 是否只在大小寫完全相符時才套用(預設 false = 不分大小寫) |
限制:每個語言最多 3000 條目。超過時回
config_too_many_dict_entries,回應中的details會指出是哪一個語言。注意:條目數直接反映在翻譯的處理量與費用上。單次翻譯實際帶入的只有來源詞真的出現在該段文字裡的條目,最多 100 條;超過時依來源詞長度優先保留。另外,條目愈多,能穩定遵守的比例愈低——這是本質限制,不會因為上限放寬而改變。
大小寫:
case_sensitive為選填、預設false(不分大小寫)。設為true時,僅當原文的大小寫與source完全相符才套用該條翻譯。旗標是逐條的。注意:翻譯字典是以提示詞引導模型翻譯,屬盡力而為而非字面替換——大小寫旗標同樣是提示,不保證絕對遵守。需要確定性替換請改用
fuzzy_correction。
大小寫旗標對照
fuzzy_correction 與 translation_dict 各有一個大小寫開關,欄位名互為反義、預設值代表的行為也相反:
| 區塊 | 欄位 | 預設值 | 預設行為 |
|---|---|---|---|
fuzzy_correction | case_insensitive | false | 嚴格(區分大小寫) |
translation_dict | case_sensitive | false | 寬鬆(不分大小寫) |
兩者都預設 false,但一個代表嚴格、另一個代表寬鬆。實作時請勿共用同一個變數,也不要直接把某一邊的值鏡射過去——設錯不會產生任何錯誤訊息,只會做出與預期相反的比對行為。
請求範例(推薦:只設定術語庫)
{
"type": "voice-translation",
"data": {
"action": "config",
"terminology": {
"zh-TW": [
{ "term": "語者分離" },
{ "term": "CVD製程" },
{ "term": "wafer良率" }
]
}
}
}
請求範例(完整設定,含手動校正規則)
{
"type": "voice-translation",
"data": {
"action": "config",
"terminology": {
"zh-TW": [
{ "term": "語者分離" },
{ "term": "即時轉錄" }
]
},
"fuzzy_correction": {
"zh-TW": [
{ "correct": "語者分離", "incorrect": ["語這分離", "語者分力"] }
]
},
"translation_dict": {
"en-US": [{ "source": "語者分離", "target": "Speaker Diarization" }]
}
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "config_updated",
"updated": ["terminology", "fuzzy_correction", "translation_dict"],
"message": "設定已更新"
}
}
回應欄位說明請參考 config_updated 事件。
錯誤碼
重要:客戶端必須同時監聽
type: "error"訊息,不可只等待config_updated。設定被伺服器擋下時,回傳的是一則
type: "error"而不是config_updated。 只等config_updated的整合會一路等到自己逾時,看起來像「伺服器沒有回應」, 但實際上錯誤訊息已經送達、data.error_code也指出了原因。
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
config_empty | 400 | 未提供任何設定。注意:空物件 {} 不算「有帶」 —— 送 {"terminology": {}, "fuzzy_correction": {}, "translation_dict": {}} 會命中此錯誤 | 至少提供一個有內容的設定項目;若要清空某個語言的字庫,請送 {"語言代碼": []}(例如 {"zh-TW": []}) |
config_term_too_long | 400 | 術語超過 100 字元 | 縮短術語長度 |
config_too_many_entries | 400 | 術語筆數超過 500,或模糊詞校正規則超過 4000(皆為所有語言合計) | 減少術語或校正規則 |
config_too_many_dict_entries | 400 | 翻譯字典單一語言超過 3000 條目(details.language 指出是哪個語言) | 減少該語言的字典條目 |
config_invalid_entry | 400 | 字庫條目的欄位不合法(details 帶 language、index、field、reason 供定位,視情況另帶 variant_index、max_length、count/max) | 依 details 指出的位置修正該條目 |
audio - 傳送音訊
功能說明
傳送音訊資料給伺服器進行語音辨識。音訊需經過 Base64 編碼後傳送。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 audio |
payload | string | 是 | Base64 編碼的音訊資料 |
channel_id | int | 條件 | 來源聲道編號(多聲道模式每一幀必帶,v1.10.0)。未帶回 channel_id_required;未知或已移除的編號回 unknown_channel_id。非多聲道模式下此欄位會被忽略 |
音訊格式要求
PCM 格式(預設):
| 項目 | 規格 |
|---|---|
| 格式 | PCM(原始音訊) |
| 取樣率 | 16000 Hz |
| 位元深度 | 16-bit |
| 聲道 | Mono(單聲道) |
| 位元組順序 | Little-endian |
| 傳輸編碼 | Base64 |
WebM/Opus 格式:
| 項目 | 規格 |
|---|---|
| 格式 | WebM 容器 + Opus 編碼 |
| 取樣率 | 任意(伺服器自動轉換) |
| 聲道 | Mono 或 Stereo(伺服器自動轉換) |
| 傳輸編碼 | Base64 |
請求範例
{
"type": "voice-translation",
"data": {
"action": "audio",
"payload": "Base64 編碼的 PCM 音訊資料"
}
}
請求範例(多聲道,v1.10.0)
多聲道模式下每一幀都必須帶 channel_id,標明音訊來自哪一路麥克風:
{
"type": "voice-translation",
"data": {
"action": "audio",
"channel_id": 2,
"payload": "Base64 編碼的 PCM 音訊資料"
}
}
多聲道傳送建議:建議以約 100ms 為一幀;每一路即使暫時無人說話也請持續傳送(靜音音訊)。單一聲道沒有聲音不會結束錄音,見 長時間沒有語音時自動結束。
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
session_not_started | 400 | 語音辨識尚未開始 | 先呼叫 start action |
audio_invalid_format | 400 | 音訊資料格式錯誤 | 確認 Base64 編碼正確 |
audio_decode_failed | 400 | 音訊解碼失敗 | 確認音訊格式正確。錄音不會結束;WebM 請重新送出全新容器(含檔頭)即可恢復,無法解碼的期間不計費 |
audio_process_failed | 500 | STT/語者辨識寫入持續失敗,超過容忍閾值 | 建議重新連線 |
channel_id_required | 400 | 多聲道模式的音訊幀未帶 channel_id(v1.10.0) | 每一幀都帶上 channel_id |
unknown_channel_id | 400 | 未知或已移除的 channel_id(v1.10.0) | 確認該聲道存在且未被移除 |
pause - 暫停翻譯
功能說明
暫停語音辨識處理。暫停期間收到的音訊會被快取,恢復後繼續處理。
互譯模式例外:暫停期間的音訊不會保留。暫停當下說到一半的句子,會先等辨識服務把最後一段處理完(通常約 1 秒,最多約 3 秒),再以 is_final: true 送出,之後才回 status: "paused";手動模式若正在說話,會先自動結束說話並送出該句的定稿。
暫停期間照常計費,詳見計費說明。
請求範例
{
"type": "voice-translation",
"data": {
"action": "pause"
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "status",
"status": "paused",
"message": "語音辨識已暫停"
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
session_not_started | 400 | 語音辨識尚未開始 | 先呼叫 start |
session_already_paused | 400 | 已經暫停 | 可忽略此錯誤 |
resume - 恢復翻譯
功能說明
恢復已暫停的語音辨識處理。
請求範例
{
"type": "voice-translation",
"data": {
"action": "resume"
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "status",
"status": "live",
"message": "語音辨識已恢復"
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
session_not_started | 400 | 語音辨識尚未開始 | 先呼叫 start |
session_not_paused | 400 | 未暫停 | 可忽略此錯誤 |
若操作當下正有一句話說到一半,那一句無法保留,會另外收到 segment_discarded(
reason: "resumed")。多聲道下每一路各自回報。
stop - 停止翻譯
功能說明
停止語音辨識並結束會話。停止時會先等辨識服務把最後一句處理完(通常約 1 秒,最多約 3 秒),這一句才會進入逐字稿;等不到時,會以畫面上最後的辨識結果作為該句內容。互譯手動模式若正在說話,會先送出該句的定稿與翻譯,再結束。系統會自動上傳音檔和逐字稿,並生成摘要(若有設定;可用點數不足以支付摘要費用時不產生,改送 summary_error)。
請求範例
{
"type": "voice-translation",
"data": {
"action": "stop"
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "status",
"status": "ended",
"message": "語音辨識已停止"
}
}
停止後,當音檔和逐字稿上傳完成,會收到 task_complete 事件,包含 task_id(Recording UUID)。
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
session_not_started | 400 | 語音辨識尚未開始,或本次錄音已經結束(例如重複送出 stop) | 若尚未開始請先呼叫 start;若是重複送出可忽略 |
重複送出
stop會收到此錯誤,而不是再一次的成功回應。task_complete只會在 第一次成功停止後、音檔與逐字稿上傳完成時送出一次。
retranslate - 重新翻譯單句
功能說明
對指定句子重新翻譯,適用於修正原文後需要更新翻譯的情況。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 retranslate |
sid | int | 是 | 要重翻的句子編號 |
translation_languages | string[] | 是 | 翻譯語言代碼陣列。一次僅重翻第一個元素指定的語言,多帶的其餘語言會被忽略;多語言場次要重翻多個語言時,請分別送出多次 retranslate |
text | string | 是 | 要翻譯的原文(用戶修正後的文字) |
請求範例
{
"type": "voice-translation",
"data": {
"action": "retranslate",
"sid": 1,
"translation_languages": ["en-US"],
"text": "用戶修正後的原文"
}
}
成功回應
回傳 translation 事件(與正常翻譯結果共用 schema),翻譯結果中會包含 is_retranslation: true:
{
"type": "voice-translation",
"data": {
"action": "translation",
"sid": 1,
"translations": {
"en-US": {
"sid": 1,
"text": "新的翻譯結果",
"is_final": true,
"is_retranslation": true
}
}
}
}
data層另帶sid,與translations內各語言的sid相同。
v1.5.6 文件修正:早期文件描述 retranslate 回
action: "result",實際 wire 上是action: "translation"。若客戶端原本 dispatcher 對resultaction 處理,請新增translationaction 的處理分支。
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
invalid_data | 422 | 未提供 sid | 帶上 sid |
record_translation_not_allowed | 400 | 純錄音類型不支援翻譯 | 改用 transcribe 類型 |
retranslate_session_not_active | 400 | 工作階段未啟動或已結束 | 確認工作階段狀態 |
retranslate_no_target_lang | 400 | 未提供目標語言 | 提供 translation_languages |
retranslate_no_text | 400 | 未提供要翻譯的文字 | 提供 text 參數 |
retranslate_llm_not_ready | 503 | 翻譯服務尚未就緒 | 稍後重試 |
retranslate_llm_failed | 500 | 翻譯服務失敗 | 稍後重試 |
翻譯服務若回傳明確的失敗代碼(例如內容被判定無法翻譯的
llm_content_filtered),會直接以該代碼回傳,不會再包成retranslate_llm_failed。
switch_language - 切換語言
功能說明
在即時翻譯進行中切換/調整翻譯語言。行為依錄音類型與翻譯語言數而異:
- 一般模式・單語言(
translation_languages為 1 個):置換翻譯目標語言,並自動批次重翻所有已翻譯句子 - 一般模式・多語言(
translation_languages為 2 個以上,v1.6.7):改為「新增或移除單一語言」語意,必須帶op參數;不帶op會回switch_language_op_required錯誤 - 互譯模式(conversation):切換 STT 來源語言(說話語言),翻譯目標自動切換為另一語言
- 多聲道模式(
multi_channel,v1.10.0):禁用。語言綁定在聲道上,任何形式的switch_language(含op: "add"/op: "remove")一律回multichannel_switch_language_not_allowed;要變更某一路的語言請改用 set_channel_language
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 switch_language |
translation_languages | string[] | 條件 | 翻譯語言代碼陣列(一般模式必填;只取第一個元素作為操作目標) |
op | string | 條件 | v1.6.7 多語言操作:add(新增語言)、remove(移除語言)。多語言場次必填;單語言場次可帶 add 以擴增為多語言,不帶則維持既有置換語意 |
transcription_languages | string[] | 條件 | 切換目標語言(互譯模式;不帶則自動 toggle 到另一語言) |
請求範例(一般模式・單語言置換)
{
"type": "voice-translation",
"data": {
"action": "switch_language",
"translation_languages": ["ja-JP"]
}
}
請求範例(多語言・新增語言,v1.6.7)
{
"type": "voice-translation",
"data": {
"action": "switch_language",
"op": "add",
"translation_languages": ["de-DE"]
}
}
新增成功後:既有句子會自動批次補譯該語言(回應序列同單語言置換:language_switch_start → 多個 batch_retranslation → language_switch_done),後續新句子的即時翻譯自動納入該語言。上限 12 種,超過回 too_many_languages。
計費提醒:新增語言後,自下一個計費分鐘起按新的語言數量計費。
請求範例(多語言・移除語言,v1.6.7)
{
"type": "voice-translation",
"data": {
"action": "switch_language",
"op": "remove",
"translation_languages": ["ko-KR"]
}
}
移除成功後回傳 translation_language_removed 事件;該語言既有的歷史譯文保留,後續新句子不再翻譯該語言。至少需保留 1 種翻譯語言(移除最後一種會回 switch_language_last_language 錯誤):
{
"type": "voice-translation",
"data": {
"action": "translation_language_removed",
"translation_language": "ko-KR",
"translation_languages": ["en-US", "ja-JP"]
}
}
translation_languages為移除後的完整翻譯語言集權威快照;消費端應直接以此覆寫本地語言集(詳見 events.md)。
請求範例(互譯模式)
指定切換目標:
{
"type": "voice-translation",
"data": {
"action": "switch_language",
"transcription_languages": ["en-US"]
}
}
自動 toggle(不帶參數):
{
"type": "voice-translation",
"data": {
"action": "switch_language"
}
}
互譯模式特殊行為:
- 互譯模式使用自動語言偵測,通常不需要手動切換語言
switch_language僅更新內部偏好狀態- 切換成功後回傳 language_switched 事件(非 language_switch_start/done 序列)
- 切換到相同語言會回傳
conversation_same_language警告
回應序列(一般模式)
切換語言後會依序收到以下事件:
- language_switch_start:通知開始切換
{
"type": "voice-translation",
"data": {
"action": "language_switch_start",
"translation_language": "ja-JP",
"translation_languages": ["en-US", "ja-JP"],
"total_segments": 15
}
}
- batch_retranslation(多個):逐句回傳重翻結果
{
"type": "voice-translation",
"data": {
"action": "batch_retranslation",
"sid": 3,
"translations": {
"ja-JP": {
"sid": 3,
"text": "今日はプロジェクトの進捗について話し合いましょう",
"is_final": true,
"is_retranslation": true
}
}
}
}
- language_switch_done:通知切換完成
{
"type": "voice-translation",
"data": {
"action": "language_switch_done",
"translation_language": "ja-JP",
"translation_languages": ["en-US", "ja-JP"],
"success_count": 15,
"failed_count": 0
}
}
語言集同步:
language_switch_start/language_switch_done皆回帶translation_languages(當前完整翻譯語言集的權威快照)。此事件流同時用於「單語置換」與多語op:add「附加」,兩者事件同形——消費端(含被動的浮動字幕 SSE)應直接以translation_languages覆寫本地語言集,切勿只憑translation_language推測是附加或置換(當前僅 1 種語言時op:add擴增為第 2 種,只看單一語言會誤判為置換而洗掉既有語言)。
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
switch_language_no_target | 400 | 未提供目標語言 | 提供 translation_languages |
switch_language_in_progress | 400 | 前一次切換尚未完成 | 等待切換完成 |
switch_language_same_target | 400 | 目標語言與當前相同 | 可忽略此錯誤 |
switch_language_op_required | 400 | 多語言場次未帶 op(v1.6.7) | 帶 op: "add" 或 op: "remove" |
switch_language_already_exists | 400 | add 的語言已在翻譯清單(v1.6.7) | 可忽略此警告 |
switch_language_not_in_session | 400 | remove 的語言不在翻譯清單(v1.6.7) | 確認語言代碼 |
switch_language_last_language | 400 | 至少需保留一種翻譯語言(v1.6.7) | 不可移除最後一種語言 |
too_many_languages | 400 | add 後超過 12 種上限(v1.6.7) | 先移除既有語言再新增 |
invalid_translation_language | 400 | add 的語言代碼無效(v1.6.7) | 確認語言代碼在支援清單中 |
conversation_requires_two_languages | 400 | 互譯模式需恰好兩個語言 | 確認 transcription_languages 為 2 個 |
conversation_languages_identical | 400 | 互譯的兩個語言不可相同 | 提供兩個不同的語言 |
conversation_invalid_language | 400 | 無效的互譯語言 | 確認語言在 transcription_languages 中 |
conversation_same_language | 400 | 已是當前語言 | 可忽略此警告 |
multichannel_switch_language_not_allowed | 400 | 多聲道模式禁用 switch_language(v1.10.0) | 改用 set_channel_language 變更單路語言 |
set_name - 設定錄音名稱
功能說明
在錄音進行中設定名稱。設定後 name_source 翻轉為 user,錄音結束時系統不會覆蓋(即使 LLM 生成了摘要名稱也會被讓位)。name_source 完整語意與優先順序見上方 § 錄音名稱規則。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 set_name |
name | string | 是 | 錄音名稱(最大 60 字元) |
請求範例
{
"type": "voice-translation",
"data": {
"action": "set_name",
"name": "產品規劃會議"
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "status",
"event": "name_set",
"name": "產品規劃會議",
"message": "錄音名稱已設定"
}
}
相容性說明:為相容既有整合,set_name 成功回應的
action維持"status"(不變)。新客戶請改用event: "name_set"(搭配name欄位)來辨識 set_name 成功。以action: "status"判斷 set_name 成功的舊方式已 deprecated(不建議),未來版本可能移除該相容行為。
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
set_name_empty | 400 | 錄音名稱為空 | 提供非空名稱 |
set_name_too_long | 400 | 錄音名稱超過長度限制(>60 字元);回覆的 details 會帶 max_length | 縮短名稱長度(≤60 字元) |
rename_speaker - 全域重命名說話者
功能說明
在多人語者分離模式(multi_speaker)下,全域重命名某個說話者。所有使用該說話者 ID 的句子都會同步更新。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 rename_speaker |
speaker_id | string | 是 | 原始語者 ID(如 Guest-1),可同時接受目前的顯示標籤做連續改名;最大 100 字元 |
new_label | string | 是 | 新顯示標籤;最大 100 字元,不得含控制字元(\x00-\x1F、\x7F)或換行 |
請求範例
{
"type": "voice-translation",
"data": {
"action": "rename_speaker",
"speaker_id": "Guest-1",
"new_label": "王經理"
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "speaker_renamed",
"speaker_id": "Guest-1",
"new_label": "王經理",
"affected_sids": [1, 3, 5, 8]
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
speaker_not_found | 422 | 找不到指定的說話者 | 確認說話者 ID 或別名存在 |
speaker_name_empty | 422 | 說話者名稱不能為空 | 提供有效的名稱 |
speaker_name_duplicate | 422 | 說話者名稱已被使用 | 使用其他名稱,或先修改衝突的說話者 |
session_not_started | 400 | 語音辨識尚未開始 | 先呼叫 start |
reassign_speaker - 修改單句語者身份
功能說明
修改特定句子的語者身份,將句子指派給既有語者。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 reassign_speaker |
sid | int | 是 | 要修改的句子編號 |
target_speaker_id | string | 是 | 目標語者原始 ID(取自 init_sentence.speaker_id;reassign 不接受顯示標籤) |
請求範例
{
"type": "voice-translation",
"data": {
"action": "reassign_speaker",
"sid": 5,
"target_speaker_id": "Guest-2"
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "speaker_reassigned",
"sid": 5,
"old_speaker_id": "Guest-1",
"new_speaker_id": "Guest-2",
"new_speaker_label": "李小華"
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
speaker_sid_not_found | 422 | 找不到指定的句子 | 確認 SID 存在 |
speaker_not_found | 422 | 目標語者不存在 | 使用已存在的語者 ID |
speaker_name_empty | 422 | 目標語者 ID 不能為空 | 提供有效的語者 ID |
session_not_started | 400 | 語音辨識尚未開始 | 先呼叫 start |
invalid_parameter | 400 | 不支援建立新語者 | 使用已存在的語者 ID |
merge_speakers - 合併語者
功能說明
將一個語者的所有句子合併到另一個語者。合併後,該語者未來產生的辨識結果也會自動轉換為目標語者(僅限當前辨識工作:連線中斷後恢復會重新編號,屆時需重新合併)。
與 reassign_speaker 的差異
| 功能 | 作用範圍 | 未來影響 |
|---|---|---|
reassign_speaker | 單句(1 個 SID) | 無 |
merge_speakers | 該語者的所有句子 | 未來出現的 source 也自動轉為 target |
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 merge_speakers |
source_speaker_id | string | 是 | 要被合併的語者 ID(如 Guest-2) |
target_speaker_id | string | 是 | 合併目標語者 ID(如 Guest-1) |
請求範例
{
"type": "voice-translation",
"data": {
"action": "merge_speakers",
"source_speaker_id": "Guest-2",
"target_speaker_id": "Guest-1"
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "speakers_merged",
"source_speaker_id": "Guest-2",
"target_speaker_id": "Guest-1",
"affected_sids": [3, 5, 7]
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
speaker_not_found | 422 | 語者不存在 | 確認語者 ID 存在 |
merge_speakers_same_id | 400 | 來源和目標語者相同 | 使用不同的語者 ID |
speaker_name_empty | 422 | 語者 ID 不能為空 | 提供有效的語者 ID |
session_not_started | 400 | 語音辨識尚未開始 | 先呼叫 start |
tts_play - 播放 TTS
功能說明
在 async 模式下,手動播放指定句子的 TTS 語音。支援對同一個 sid 重複請求(重播)。
互譯模式(conversation):
tts_play會自動根據tts_config中的語音設定合成對應語言的翻譯,不需額外指定tts_language。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 tts_play |
sid | int | 是 | 起始句子 ID |
length | int | 否 | 播放句子數量(預設 1,最大 20) |
請求範例(單句播放)
{
"type": "voice-translation",
"data": {
"action": "tts_play",
"sid": 5
}
}
請求範例(多句播放)
{
"type": "voice-translation",
"data": {
"action": "tts_play",
"sid": 5,
"length": 3
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
tts_not_enabled | 400 | TTS 未啟用 | 確認 start 時啟用 TTS |
找不到句子、或該句沒有翻譯時不回
error:起始sid不存在、或該句沒有目標語言的翻譯時,不會回傳error訊息,而是送出tts_error事件,error欄位分別為sentence_not_found與translation_not_found。多句播放時單句失敗只跳過該句,其餘句子照常播放。
tts_stop - 停止 TTS
功能說明
停止當前正在播放的 TTS 語音。
請求範例
{
"type": "voice-translation",
"data": {
"action": "tts_stop"
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "status",
"message": "TTS 已停止"
}
}
tts_mode - 切換 TTS 模式
功能說明
在錄音進行中切換 TTS 播放模式(同步/非同步)。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 tts_mode |
tts_mode | string | 是 | 模式:sync(同步)或 async(非同步),只接受小寫的這兩個值 |
請求範例
{
"type": "voice-translation",
"data": {
"action": "tts_mode",
"tts_mode": "async"
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "tts_mode_changed",
"tts_mode": "async"
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
invalid_data | 422 | 未提供 tts_mode,或值不是 sync、async。後者 details.field 為 tts_mode、details.valid_values 列出可用的值;模式不會改變,也不會收到 tts_mode_changed | 帶上 sync 或 async |
set_tts - 互譯 TTS 設定
功能說明
在互譯模式(conversation)進行中,途中切換 TTS 開關或更新 TTS 語音設定。僅在 conversation 類型下可用。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 set_tts |
tts_enabled | boolean | 否 | 設定 TTS 開關 |
tts_config | object | 否 | 更新特定語言的 TTS 設定(僅互譯的兩個語言有效) |
請求範例(關閉 TTS)
{
"type": "voice-translation",
"data": {
"action": "set_tts",
"tts_enabled": false
}
}
請求範例(更新 TTS 語音)
{
"type": "voice-translation",
"data": {
"action": "set_tts",
"tts_enabled": true,
"tts_config": {
"en-US": { "voice": "en-US-GuyNeural", "speaking_rate": 1.2 }
}
}
}
成功回應
回傳 tts_updated 事件:
{
"type": "voice-translation",
"data": {
"action": "tts_updated",
"tts_enabled": true,
"tts_config": {
"zh-TW": { "voice": "zh-TW-HsiaoChenNeural", "speaking_rate": 1.0 },
"en-US": { "voice": "en-US-GuyNeural", "speaking_rate": 1.2 }
}
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
invalid_action | 400 | 非互譯模式不支援此操作 | 僅在 conversation 類型下使用 |
start_speaking - 開始說話(手動模式)
功能說明
在互譯手動模式(conversation_mode: "manual")下,通知系統用戶開始說話。從此刻起,音訊會被傳送至 STT 進行辨識,所有辨識結果會累積為同一句話(不自動斷句)。若已在說話中再次呼叫,系統會先結束上一句(等最後一段處理完後送出定稿),再開始新的一句。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 start_speaking |
speaker | int | 是 | 用戶編號(1 或 2) |
請求範例
{
"type": "voice-translation",
"data": {
"action": "start_speaking",
"speaker": 1
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "status",
"message": "開始說話"
}
}
已在說話中再次呼叫時,上一句的定稿照常送出,之後同樣回這則 status。
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
invalid_action | 400 | 非互譯模式 | 僅在 conversation 類型下使用 |
conversation_not_manual_mode | 400 | 非手動模式 | 僅在 manual 模式下使用 |
conversation_invalid_speaker | 400 | 無效的用戶編號 | 使用 1 或 2 |
stop_speaking - 結束說話(手動模式)
功能說明
在互譯手動模式下,通知系統用戶結束說話。系統會先等辨識服務把最後一段處理完(通常約 1 秒,最多約 3 秒),再將期間累積的辨識結果合併為一個完整句子,然後進行翻譯和 TTS 合成。以空白分字的語言(例如英文),段落之間會自動補一個空白。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 stop_speaking |
請求範例
{
"type": "voice-translation",
"data": {
"action": "stop_speaking"
}
}
成功回應
結束說話後,系統會送出完整的 result 事件(包含 origin 和 translations):
{
"type": "voice-translation",
"data": {
"action": "result",
"origin": {
"sid": 1,
"language": "zh-TW",
"text": "這段期間所有辨識內容合併的完整句子",
"is_final": true,
"speaker_id": "Speaker-1",
"start_time": "00:05"
},
"translations": {
"en-US": {
"sid": 1,
"text": "The complete merged sentence from this speaking period",
"is_final": true
}
}
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
invalid_action | 400 | 非互譯模式 | 僅在 conversation 類型下使用 |
conversation_not_speaking | 400 | 未在說話狀態 | 先呼叫 start_speaking |
switch_conversation_mode - 切換對話模式
功能說明
在互譯模式進行中,切換自動偵測模式(auto)與手動模式(manual)。切換時若正在說話中會自動結束說話。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 switch_conversation_mode |
conversation_mode | string | 是 | 目標模式:auto 或 manual |
請求範例
{
"type": "voice-translation",
"data": {
"action": "switch_conversation_mode",
"conversation_mode": "manual"
}
}
成功回應
回傳 conversation_mode_changed 事件:
{
"type": "voice-translation",
"data": {
"action": "conversation_mode_changed",
"conversation_mode": "manual"
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
invalid_action | 400 | 非互譯模式 | 僅在 conversation 類型下使用 |
conversation_invalid_mode | 400 | 無效的對話模式 | 使用 auto 或 manual |
set_speaker_language - 設定用戶語言
功能說明
在互譯模式進行中,即時變更指定用戶的語言。系統會重建 STT 連線以適應新語言,翻譯目標也會自動更新。變更前的逐字稿內容維持原語言不變,時間戳持續計算不歸零。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 set_speaker_language |
speaker | int | 是 | 用戶編號(1 或 2) |
language | string | 是 | 新的語言代碼(如 ja-JP) |
請求範例
{
"type": "voice-translation",
"data": {
"action": "set_speaker_language",
"speaker": 1,
"language": "ja-JP"
}
}
成功回應
回傳 speaker_language_changed 事件:
{
"type": "voice-translation",
"data": {
"action": "speaker_language_changed",
"speaker_language_map": {
"1": "ja-JP",
"2": "en-US"
}
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
invalid_action | 400 | 非互譯模式 | 僅在 conversation 類型下使用 |
conversation_invalid_speaker | 400 | 無效的用戶編號 | 使用 1 或 2 |
conversation_invalid_language | 400 | 未提供 language | 帶上 language |
invalid_transcription_language | 400 | 語言代碼無效 | 使用有效的 BCP 47 語言代碼 |
session_not_started | 400 | 錄音尚未開始 | 先呼叫 start |
conversation_same_language | 400 | 與當前語言相同 | 可忽略此警告 |
conversation_language_same_as_peer | 400 | 新語言與另一位用戶相同 | 兩位用戶語言不可相同 |
conversation_speaking | 400 | 正在說話中,無法變更語言 | 先結束說話再變更 |
conversation_language_change_failed | 500 | 語言變更失敗(STT 重建失敗) | 稍後重試 |
set_speaking_speed - 錄音中調整語速
功能說明
錄音進行中動態調整語速(影響斷句的靜音判斷門檻)。系統會重建 STT 連線以套用新設定,過程中辨識會短暫中斷(與錄音中切換語者語言相同)。非多人(multi_speaker)辨識模式皆支援(含廣播、多語 LID);多人模式不套用 speaking_speed。
多聲道模式(multi_channel,v1.10.0):支援。新的斷句門檻套用到全部聲道、逐路生效;每一路會各自送出 channel_status 事件(reason: "speaking_speed",先 preparing、該路重新出字後轉 ready),套用期間該路約 4 秒不出字。與 set_channel_language 相同有 5 秒操作間隔限制(過於頻繁回 channel_rebuild_too_frequent,一次調整套用到全部聲道,間隔限制為整場共用);暫停中回 channel_action_while_paused,請先 resume 再調整。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 set_speaking_speed |
speaking_speed | string | 是 | very_slow / slow / normal / fast / very_fast(各等級的門檻見 speaking_speed 等級) |
請求範例
{
"type": "voice-translation",
"data": { "action": "set_speaking_speed", "speaking_speed": "slow" }
}
成功回應
{
"type": "voice-translation",
"data": { "action": "speaking_speed_changed", "speaking_speed": "slow" }
}
錯誤碼
| 錯誤碼 | HTTP | 說明 | 處理建議 |
|---|---|---|---|
invalid_data | 422 | speaking_speed 值無效 | 使用五個合法值之一 |
session_not_started | 400 | 錄音尚未開始 | 先呼叫 start |
invalid_action | 400 | 多人模式不支援 | 多人模式勿呼叫 |
set_speaking_speed_failed | 400 | 重建 STT 失敗 | 稍後重試 |
channel_rebuild_too_frequent | 400 | 多聲道:語速調整過於頻繁(5 秒內僅接受一次,v1.10.0) | 稍後再試 |
channel_action_while_paused | 400 | 多聲道:暫停中無法調整語速(v1.10.0) | 先 resume 再調整 |
若操作當下正有一句話說到一半,那一句無法保留,會另外收到 segment_discarded(
reason: "speaking_speed")。回set_speaking_speed_failed時也可能已經收到 —— 辨識在重建之前就已中斷。
add_channel - 新增聲道(多聲道)
功能說明
多聲道模式(recognition_mode: "multi_channel",v1.10.0)錄音進行中動態新增一路聲道:現場臨時加入一位與會者時,不必停止錄音即可為他新增一路獨立辨識的聲道。新增成功後即可開始傳送帶該 channel_id 的音訊幀。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 add_channel |
channels | object[] | 是 | 恰好 1 個聲道設定,欄位與 start 的 channels[] 相同(channel_id、speaker_name 可選;transcription_languages 在 per_channel 恰好 1 個、在 shared 不帶) |
請求範例
{
"type": "voice-translation",
"data": {
"action": "add_channel",
"channels": [
{ "channel_id": 4, "speaker_name": "陳同學", "transcription_languages": ["zh-TW"] }
]
}
}
成功回應
回傳 channel_status 事件(reason: "added"、status: "preparing"):
{
"type": "voice-translation",
"data": {
"action": "channel_status",
"channel": {
"channel_id": 4,
"speaker_name": "陳同學",
"transcription_languages": ["zh-TW"],
"status": "preparing"
},
"active_channels": 4,
"stt_stream_count": 4,
"reason": "added"
}
}
該路辨識出第一句時會再收到一次 channel_status(status: "ready"、reason 沿用觸發時的 added)。
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
not_multi_channel_session | 400 | 本場錄音不是多聲道模式 | 僅在 recognition_mode: "multi_channel" 下使用 |
channels_required | 400 | channels 未帶或不是恰好 1 個元素 | 一次只加一路 |
invalid_channel_id | 400 | channel_id 超出值域(1~8) | 修正編號 |
channel_id_in_use | 400 | 編號使用中,或已被移除過(編號不可重用) | 改用未用過的編號 |
speaker_name_duplicate | 422 | speaker_name 與其他聲道目前的名稱重複 | 改用其他名稱(已被改名讓出的舊名可接手) |
too_many_channels | 400 | 聲道數已達上限 | 先 remove_channel 再新增 |
channel_language_required | 400 | 未指定恰好一種轉錄語言(per_channel) | transcription_languages 帶恰好 1 個 |
channel_language_not_allowed | 400 | shared 模式帶了 transcription_languages | 移除該欄位 |
invalid_transcription_language | 400 | 語言代碼無效 | 確認語言代碼格式(如 zh-TW) |
invalid_parameter | 400 | speaker_name 超長(>100 字元)或含控制字元 | 修正名稱 |
plan_feature_not_allowed | 403 | 超過方案的聲道路數上限(details.field 為 max_stt_streams) | 移除其他聲道或升級方案 |
too_many_languages | 400 | 新路的語言使同時識別語言數超過方案上限 | 改用既有語言或升級方案 |
channel_action_while_paused | 400 | 暫停中無法增減聲道 | 先 resume |
session_not_started | 400 | 錄音尚未開始 | 先呼叫 start |
stt_start_failed | 500 | 該路語音辨識啟動失敗(本次新增未生效) | 稍後重試 |
注意事項
- 編號不可重用:
channel_id一經使用(含已被移除的)即永久佔用——語者身分是寫入逐字稿當下就決定的,重用編號會讓兩個不同的人共用同一個語者身分。 - 啟動延遲:新增成功後該路約 4 秒內開始出字;期間傳入的音訊不會丟失,只是延遲出字。
- 新路的時間軸自動對齊全場(第 65 秒加入的人,他的發言時間戳從約第 65 秒起算)。
- 計費路數在每一分鐘開始時依當下路數採計,新增的聲道自下一分鐘起計費,詳見計費說明。
shared模式:新增的聲道共用全場的辨識,不增加計費路數;狀態直接套用第一路當下的狀態。
remove_channel - 停用聲道(多聲道)
功能說明
多聲道模式錄音進行中停用一路聲道(v1.10.0):與會者提前離席時,把他那一路停掉即可自下一個計費分鐘起少收一條的費用。語意是「停用」而非「刪除」——該路已產生的逐字稿與單軌音檔全部保留。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 remove_channel |
channel_id | int | 是 | 要停用的聲道編號 |
請求範例
{
"type": "voice-translation",
"data": {
"action": "remove_channel",
"channel_id": 4
}
}
成功回應
回傳 channel_status 事件(reason: "removed"、status: "removed"):
{
"type": "voice-translation",
"data": {
"action": "channel_status",
"channel": {
"channel_id": 4,
"speaker_name": "陳同學",
"transcription_languages": ["zh-TW"],
"status": "removed"
},
"active_channels": 3,
"stt_stream_count": 3,
"reason": "removed"
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
not_multi_channel_session | 400 | 本場錄音不是多聲道模式 | 僅在 recognition_mode: "multi_channel" 下使用 |
channel_id_required | 400 | 未帶 channel_id | 提供要停用的編號 |
invalid_channel_id | 400 | channel_id 超出值域(1~8) | 修正編號 |
unknown_channel_id | 400 | 未知的 channel_id(可能已被移除) | 確認該聲道存在且未被移除 |
channel_remove_not_allowed | 400 | 最後一路聲道不可移除;或 shared 模式的第一路 | 要結束錄音請用 stop |
channel_action_while_paused | 400 | 暫停中無法增減聲道 | 先 resume |
session_not_started | 400 | 錄音尚未開始 | 先呼叫 start |
注意事項
- 收尾窗:停用後有約 3 秒的收尾窗,讓該路已講完但尚未回來的最後一句話補進逐字稿;這段期間該路已不再接收新音訊。
- 編號不可重用:停用後該
channel_id不可再用於add_channel(會回channel_id_in_use)。 - 停用後再對該編號送
audio會回unknown_channel_id。 - 計費:自下一個計費分鐘起立即少計一條,詳見計費說明。
set_channel_language - 變更聲道語言(多聲道)
功能說明
多聲道模式錄音進行中變更單一聲道的轉錄語言(v1.10.0)。channel_id 與語者身分(speaker_id)維持不變,逐字稿保持連續——這正是本 action 存在的理由:remove_channel + add_channel 因編號不可重用,同一個人會在逐字稿裡變成兩個語者。
系統會將該路切換為新語言(其他路不受影響),切換約 4 秒生效,期間該路不出字。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 set_channel_language |
channel_id | int | 是 | 目標聲道編號 |
transcription_languages | string[] | 二擇一 | 新的轉錄語言,恰好 1 個(與 start 的 channels[] 同形) |
language | string | 二擇一 | 新的轉錄語言(單值寫法)。與 transcription_languages 同時帶且值不同會回 invalid_parameter |
請求範例
{
"type": "voice-translation",
"data": {
"action": "set_channel_language",
"channel_id": 3,
"transcription_languages": ["en-US"]
}
}
成功回應
回傳 channel_status 事件(reason: "language_change"、status: "preparing"):
{
"type": "voice-translation",
"data": {
"action": "channel_status",
"channel": {
"channel_id": 3,
"speaker_name": "佐藤",
"transcription_languages": ["en-US"],
"status": "preparing"
},
"active_channels": 3,
"stt_stream_count": 3,
"reason": "language_change"
}
}
該路以新語言辨識出第一句時會再收到一次 channel_status(status: "ready")。
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
not_multi_channel_session | 400 | 本場錄音不是多聲道模式 | 僅在 recognition_mode: "multi_channel" 下使用 |
channel_id_required | 400 | 未帶 channel_id | 提供目標聲道編號 |
invalid_channel_id | 400 | channel_id 超出值域(1~8) | 修正編號 |
unknown_channel_id | 400 | 未知的 channel_id(可能已被移除) | 確認該聲道存在且未被移除 |
channel_language_required | 400 | 未提供新語言 | 帶 transcription_languages 或 language |
invalid_parameter | 400 | 帶了多於一個語言/兩個語言欄位值不一致/與該路目前語言相同 | 依 details 修正參數 |
invalid_transcription_language | 400 | 語言代碼無效 | 確認語言代碼格式(如 zh-TW) |
too_many_languages | 400 | 新語言使同時識別語言數超過平台上限 10 或方案上限 | 改用既有語言或升級方案 |
channel_rebuild_too_frequent | 400 | 同一路 5 秒內重複切換 | 稍後再試(details.cooldown_seconds 為需等待的秒數) |
channel_action_while_paused | 400 | 暫停中無法變更聲道語言 | 先 resume |
session_not_started | 400 | 錄音尚未開始 | 先呼叫 start |
channel_language_not_allowed | 400 | shared 模式不支援變更聲道語言(v1.21.0) | 全場語言於 start 決定,錄音中不能變更 |
stt_start_failed | 500 | 切換未生效(另收 status: "error" 的 channel_status 事件,系統將自動嘗試恢復) | 等待自動恢復或稍後重試 |
注意事項
- 操作間隔限制(5 秒):同一路兩次語言變更至少間隔 5 秒(
channel_rebuild_too_frequent);間隔只在驗證全數通過後才開始計,被拒絕的請求不佔用間隔。 - 語言集合只增不減:換語言引入 session 尚未使用的語言時,該語言會併入 session 級
transcription_languages;舊語言不會移除(該路先前的逐字稿仍是舊語言)。因此換語言受平台同時識別語言數上限(10)與方案語言上限管制。 - 換成與該路目前相同的語言會回
invalid_parameter(不做無意義的切換)。 switch_language在多聲道一律禁用(回multichannel_switch_language_not_allowed);變更語言請一律使用本 action。
若操作當下正有一句話說到一半,那一句無法保留,會另外收到 segment_discarded(
reason: "language_change")。事件帶channel_id指明是哪一路。
set_summary - 錄音中更換摘要設定
功能說明
錄音進行中更換「停止時要套用的摘要設定」。即時錄音的摘要只在停止時生成一次,因此本 action 的即時生效等同於「該次自動摘要改採最新設定」——中途更換多次時,以停止前最後一次為準。
典型用途:開始錄音後才決定改用其他摘要樣板或自訂 prompt。直接更新即可,不需等停止後再額外呼叫一次摘要重生成,可省下一次摘要生成費用。
參數分為兩組,彼此獨立:
- 摘要來源組:
summary_mode、summary_template、summary_prompt、summary_prompt_slug。帶summary_mode才會套用,且四個欄位整組替換——切換模式時會自動清除另一模式的欄位。 - 選項組:
auto_summary、summary_language、summary_plain_text。各自獨立,有帶才更新。
兩組互不影響:更新摘要來源不會自動開啟 auto_summary。若錄音開始時已關閉自動摘要,需另外帶 auto_summary: true 才會恢復生成。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 set_summary |
summary_mode | string | 條件 | builtin(通用樣板)或 custom(自訂 prompt)。要更換摘要來源時必填;只調整選項組時可省略 |
summary_template | string | 條件 | builtin 模式的樣板識別碼。custom 模式禁止帶入 |
summary_prompt | string | 條件 | custom 模式的完整 prompt,上限 3000 字元,必填(只含空白字元視同未填) |
summary_prompt_slug | string | 條件 | custom 模式的識別碼,上限 64 字元,必填(只含空白字元視同未填)。builtin 模式禁止帶入 |
auto_summary | boolean | 否 | false 表示停止時不生成摘要;true 恢復生成 |
summary_language | string | 否 | 摘要輸出語言,上限 20 字元 |
summary_plain_text | boolean | 否 | 是否以純文字輸出(移除 Markdown) |
至少需提供
summary_mode或選項組其中一項,否則回傳invalid_data。 與start不同,本 action 不會在缺少summary_mode時自動推斷為builtin;帶了摘要來源欄位卻未指定模式會回傳summary_mode_field_mismatch。
摘要來源必填規則
只有在請求會影響摘要來源或啟用狀態時才檢查來源,也就是「帶了摘要來源組」或「明確送 auto_summary: true」這兩種情況:
- 只調整
summary_language/summary_plain_text→ 不檢查。這類請求既不改變摘要是否生成、也不改變來源,未指定過樣板的錄音同樣可以呼叫。 - 帶
auto_summary: false→ 不檢查,可只送選項組。 - 帶摘要來源組,或明確送
auto_summary: true→ 依序判斷:- 本次有帶
summary_template或summary_prompt→ 直接採用。 - 本次沒帶,或帶的內容只含空白字元 → 視為未提供,沿用先前設定;若從未指定過,回傳
summary_mode_field_mismatch並要求提供。
- 本次有帶
未指定
summary_template的錄音(conversation/broadcast允許不指定)會沿用系統預設樣板生成摘要。這類錄音若要明確開啟自動摘要或更換來源,仍需一併提供樣板或自訂 prompt。
請求範例(改用自訂 prompt)
{
"type": "voice-translation",
"data": {
"action": "set_summary",
"summary_mode": "custom",
"summary_prompt": "請以條列式整理本次會議的決議與待辦事項,並標註負責人。",
"summary_prompt_slug": "meeting-actions-v2"
}
}
請求範例(改用通用樣板)
{
"type": "voice-translation",
"data": {
"action": "set_summary",
"summary_mode": "builtin",
"summary_template": "meeting"
}
}
請求範例(停止本次自動摘要)
{
"type": "voice-translation",
"data": { "action": "set_summary", "auto_summary": false }
}
成功回應
回傳當前生效的設定。基於安全考量,回應不包含 summary_prompt 全文,請以 summary_prompt_slug 辨識:
{
"type": "voice-translation",
"data": {
"action": "summary_updated",
"summary_mode": "custom",
"summary_prompt_slug": "meeting-actions-v2",
"summary_language": "zh-TW",
"auto_summary": true,
"summary_plain_text": false,
"message": "摘要設定已更新"
}
}
錯誤碼
| 錯誤碼 | HTTP | 說明 | 處理建議 |
|---|---|---|---|
invalid_data | 422 | 未提供任何欄位,或 summary_language 超長 | 至少帶一個可更新的欄位 |
summary_invalid_mode | 400 | summary_mode 不是 builtin / custom | 使用兩個合法值之一 |
summary_mode_field_mismatch | 400 | 模式與欄位組合不符,或啟用摘要時缺少來源 | 依 details 的 missing_field 補齊 |
summary_prompt_too_long | 400 | summary_prompt 超過 3000 字元 | 縮短 prompt |
summary_prompt_slug_too_long | 400 | summary_prompt_slug 超過 64 字元 | 縮短識別碼 |
summary_prompt_slug_invalid | 400 | summary_prompt_slug 含控制字元 | 移除控制字元 |
invalid_summary_template | 400 | 樣板不存在或未啟用 | 改用有效樣板 |
session_not_started | 400 | 錄音尚未開始或已停止 | 先呼叫 start;已停止請改用摘要重生成 API |
注意事項
- 斷線續接後,
resume_ok的settings會回傳更新後的摘要設定,可直接用於狀態對齊。 - 送出
stop之後才呼叫本 action 會回傳session_not_started;已經開始生成的摘要不受影響。 - 錄音停止後仍可透過摘要重生成端點,以任意樣板重新生成摘要。
broadcast_go_live - 切換到正式階段
功能說明
在廣播預備階段(standby)切換到正式階段(live)。切換後,STT/翻譯結果開始廣播給觀眾,並開始寫入逐字稿。
請求範例
{
"type": "voice-translation",
"data": {
"action": "broadcast_go_live"
}
}
成功回應
回傳 broadcast_phase_changed 事件:
{
"type": "voice-translation",
"data": {
"action": "broadcast_phase_changed",
"phase": "live",
"message": "廣播已開始"
}
}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
broadcast_not_enabled | 400 | 非廣播模式 | 確認 type: "broadcast" |
session_not_started | 400 | 語音辨識尚未開始,或錄音已結束(含結束後仍在處理中) | 尚未開始請先呼叫 start |
注意:若已在正式階段(live),會回傳狀態訊息「廣播已經在進行中」,不視為錯誤。
若操作當下正有一句話說到一半,那一句無法保留,會另外收到 segment_discarded(
reason: "broadcast_go_live")。預備階段的句子本來就不進正式逐字稿。
broadcast_announcement - 發送公告
功能說明
主講者發送自訂訊息公告給所有觀眾。觀眾會透過 SSE 收到 announcement 事件。公告訊息會自動翻譯成所有翻譯語言,觀眾收到的 SSE 事件會包含 translations 欄位。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 broadcast_announcement |
message | string | 是 | 公告訊息內容 |
請求範例
{
"type": "voice-translation",
"data": {
"action": "broadcast_announcement",
"message": "會議將在 5 分鐘後結束"
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "status",
"message": "公告已發送"
}
}
觀眾端收到的 SSE 事件(含翻譯):
event: announcement
data: {"message":"會議將在 5 分鐘後結束","translations":{"en-US":"The meeting will end in 5 minutes","ja-JP":"会議は5分後に終了します"}}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
broadcast_not_enabled | 400 | 非廣播模式 | 確認 type: "broadcast" |
invalid_parameter | 400 | 訊息為空 | 提供有效的 message 參數 |
set_standby_message - 設定預備階段文字
功能說明
在廣播預備階段(standby)動態設定顯示給觀眾的訊息。允許主講者進入預備模式後再設定等待訊息,而非在 start 時就必須提供。
訊息會自動翻譯成所有翻譯語言,觀眾收到的 SSE 事件會包含 translations 欄位。
請求參數
| 參數 | 類型 | 必填 | 說明 |
|---|---|---|---|
action | string | 是 | 固定為 set_standby_message |
message | string | 是 | 預備階段顯示文字(將透過翻譯流程翻譯給各語言觀眾) |
請求範例
{
"type": "voice-translation",
"data": {
"action": "set_standby_message",
"message": "演講即將開始,請稍候..."
}
}
成功回應
{
"type": "voice-translation",
"data": {
"action": "status",
"message": "預備階段文字已更新"
}
}
觀眾端收到的 SSE 事件(含翻譯):
event: standby
data: {"message":"演講即將開始,請稍候...","translations":{"en-US":"The presentation is about to begin, please wait...","ja-JP":"プレゼンテーションがまもなく始まります。お待ちください..."}}
錯誤碼
| 錯誤碼 | HTTP 狀態碼 | 說明 | 處理建議 |
|---|---|---|---|
broadcast_not_enabled | 400 | 非廣播模式 | 確認 type: "broadcast" |
broadcast_not_in_standby | 400 | 不在預備階段 | 只能在 standby 階段使用 |
注意:此 action 只能在預備階段(standby)使用。若已進入正式階段(live),會回傳錯誤。
版本:V1.24.1 最後更新:2026-10-07