使用指南

即時語音翻譯指南

目錄

  1. 概述
  2. 前置準備
  3. 開始語音翻譯
  4. 傳送音訊
  5. 接收辨識與翻譯結果
  6. 操作控制
  7. 進階功能
  8. 多聲道語者分離
  9. 互譯模式
  10. 停止與摘要
  11. 完整流程圖
  12. 相關文件

概述

VAS 即時語音翻譯服務透過 WebSocket 提供低延遲的語音辨識(STT)與即時翻譯功能。完整流程為:

  1. 客戶端透過麥克風擷取音訊
  2. 將音訊串流傳送到 VAS 伺服器
  3. 伺服器進行語音辨識,回傳逐字稿
  4. 同步進行多語言翻譯並回傳結果
  5. (選用)生成 TTS 語音合成播放翻譯結果

適用場景

場景錄音類型(type)
會議記錄、訪談紀錄transcribe
雙語即時互譯、跨語言對話conversation
語音備忘、快速記錄record
講座、演講、直播broadcast(請參考廣播指南)

前置準備

1. 取得 API Key

確保您已擁有有效的 API Key(格式:vas_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)。認證方式詳見 認證機制。

2. 取得 Ticket

WebSocket 連線使用 Ticket 機制認證。先以 API Key 換取一次性 Ticket:

curl -X POST "https://vas-poc.vurbo.ai/api/v1/auth/ticket" \
  -H "X-API-Key: vas_your_api_key_here"

回應:

{
  "ticket": "aBcDeFgHiJkLmNoPqRsTuVwXyZ012345",
  "expires_in": 60
}

注意:Ticket 有效期為 60 秒,且僅能使用一次。

3. 建立 WebSocket 連線

將 Ticket 放入 Sec-WebSocket-Protocol,格式為 ticket.{TICKET_VALUE}:

const ws = new WebSocket('wss://vas-poc.vurbo.ai/ws', [`ticket.${ticket}`]);

ws.onopen = () => {
  console.log('WebSocket 已連線');
};

4. 維持心跳

建議每 30 秒發送一次 ping,確保連線不會逾時:

{
  "type": "health",
  "data": { "action": "ping" }
}

伺服器會回應 pong。


開始語音翻譯

連線成功後,發送 start action 啟動語音翻譯工作階段。

基本請求

{
  "type": "voice-translation",
  "data": {
    "action": "start",
    "transcription_languages": ["zh-TW"],
    "translation_languages": ["en-US"],
    "type": "transcribe",
    "audio_format": "pcm",
    "summary_template": "meeting"
  }
}

核心參數說明

參數類型必填說明
transcription_languagesstring[]是語音辨識語言,最多 10 個(如 ["zh-TW"])
translation_languagesstring[]否翻譯目標語言,可多個(最多 12 個;空陣列或不傳代表不翻譯)。v1.6.7 起指定多個語言即同時即時翻譯全部語言,見多語言翻譯
typestring是錄音類型:transcribe、conversation、record、broadcast
audio_formatstring否音訊格式:pcm(預設)或 webm
summary_templatestring條件摘要模板(transcribe 類型必填,如 meeting、interview)
realtime_translationboolean否即時翻譯模式(預設 false)
recognition_modestring否single(單人,預設)或 multi_speaker(多人語者分離);multi_speaker 下 transcription_languages 必須恰好 1 個,否則回傳 diarization_multilang_conflict 錯誤並拒絕開始(type=conversation 除外,自 v1.7.2 起豁免)
namestring否初始預設錄音名稱(最大 60 字元,系統仍可覆蓋;未提供則自動生成如 Transcription #1)

最佳實務:轉錄語言只列實際會出現的

指定多個轉錄語言時,系統會自動辨識每段語音的語言;候選語言越多、越容易誤判,尤其當內容含跨語言共通的詞(專有名詞、數字、外來語)時。建議:

  • 只列出實際會出現的語言,不要為了保險列滿 10 個。
  • 候選越少越準;確定只有單一語言時就只填一種(不需語言辨識、最準確)。
  • 避免同時列入「同文字系統或同語系近親」的語言(如多種拉丁字母歐語、zh-CN 與 zh-TW、同語言的不同地區變體),這類最容易互相誤判。

含 TTS 的請求

若要啟用翻譯結果的語音合成,加入 TTS 相關參數:

{
  "type": "voice-translation",
  "data": {
    "action": "start",
    "transcription_languages": ["zh-TW"],
    "translation_languages": ["en-US"],
    "type": "transcribe",
    "audio_format": "pcm",
    "summary_template": "meeting",
    "tts_enabled": true,
    "tts_language": "en-US",
    "tts_voice": "en-US-JennyNeural",
    "tts_mode": "sync"
  }
}
TTS 參數說明
tts_enabled是否啟用 TTS(預設 false)
tts_languageTTS 輸出語言(需在 translation_languages 中)
tts_voiceTTS 語音名稱(如 en-US-JennyNeural)
tts_modesync(自動播放,預設)或 async(手動控制)

成功回應

啟動成功後,伺服器回傳 session_started 事件:

{
  "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": "語音辨識已開始"
  }
}

保存 session_id 和 task_id,後續 API 操作會用到。


傳送音訊

Session 啟動後,持續傳送音訊資料給伺服器。

音訊格式要求

PCM 格式(預設、推薦):

項目規格
取樣率16000 Hz
位元深度16-bit
聲道Mono(單聲道)
位元組順序Little-endian

WebM/Opus 格式: 任意取樣率與聲道,伺服器自動轉換。

傳送格式

音訊資料需經 Base64 編碼後,以 audio action 傳送:

{
  "type": "voice-translation",
  "data": {
    "action": "audio",
    "payload": "Base64 編碼的音訊資料..."
  }
}

前端擷取音訊範例

const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const audioContext = new AudioContext({ sampleRate: 16000 });
const source = audioContext.createMediaStreamSource(stream);
const processor = audioContext.createScriptProcessor(4096, 1, 1);

processor.onaudioprocess = (e) => {
  const float32 = e.inputBuffer.getChannelData(0);
  // 轉換為 16-bit PCM
  const int16 = new Int16Array(float32.length);
  for (let i = 0; i < float32.length; i++) {
    int16[i] = Math.max(-32768, Math.min(32767, float32[i] * 32768));
  }
  // Base64 編碼後傳送
  const base64 = btoa(String.fromCharCode(...new Uint8Array(int16.buffer)));
  ws.send(JSON.stringify({
    type: 'voice-translation',
    data: { action: 'audio', payload: base64 }
  }));
};

source.connect(processor);
processor.connect(audioContext.destination);

接收辨識與翻譯結果

伺服器會透過 result 事件推送辨識與翻譯結果。

語音辨識結果(Origin)

{
  "type": "voice-translation",
  "data": {
    "action": "result",
    "origin": {
      "sid": 1,
      "language": "zh-TW",
      "text": "你好,很高興認識你",
      "is_final": true,
      "speaker_id": "0",
      "detected_language": "zh-TW",
      "start_time": "00:05"
    }
  }
}
欄位說明
sid句子編號,從 1 開始遞增
text辨識出的文字
is_finalfalse 為中間結果(會被覆蓋),true 為最終結果
speaker_id說話者 ID(多人模式下有意義)
start_time句子開始時間(格式 mm:ss)

翻譯結果(Translations)

{
  "type": "voice-translation",
  "data": {
    "action": "result",
    "translations": {
      "en-US": {
        "sid": 1,
        "text": "Hello, nice to meet you",
        "is_final": true
      }
    }
  }
}

重點:origin 和 translations 可能在同一個 result 事件中,也可能分開推送。前端需根據 sid 做對應。

句中夾雜其他語言時,一律翻成翻譯語言;人名、品牌、產品等專有名詞與全大寫縮寫(如 AI、API)除外。原文裡已經是翻譯語言的部分不改。

TTS 語音就緒(TTS Ready)

若啟用了 TTS,翻譯完成後會收到 tts_ready 事件:

{
  "type": "voice-translation",
  "data": {
    "action": "tts_ready",
    "sid": 1,
    "language": "en-US",
    "text": "Hello, nice to meet you",
    "audio": "Base64EncodedMP3...",
    "format": "mp3",
    "duration_ms": 2500,
    "boundaries": [...]
  }
}

boundaries 陣列包含 Word Boundary 資訊,可用於實作卡拉 OK 同步高亮效果。


操作控制

暫停

暫時停止語音辨識處理:

{
  "type": "voice-translation",
  "data": { "action": "pause" }
}

恢復

恢復已暫停的語音辨識:

{
  "type": "voice-translation",
  "data": { "action": "resume" }
}

設定錄音名稱

有兩種方式設定錄音名稱:

方式一:在 start 時指定 name 參數(初始預設名稱)

{
  "type": "voice-translation",
  "data": {
    "action": "start",
    "transcription_languages": ["zh-TW"],
    "type": "transcribe",
    "summary_template": "meeting",
    "name": "產品規劃會議"
  }
}

此名稱為初始預設,Session 結束時系統仍可能根據逐字稿內容覆蓋。

方式二:在錄音進行中使用 set_name(固定名稱)

{
  "type": "voice-translation",
  "data": {
    "action": "set_name",
    "name": "產品規劃會議"
  }
}

使用 set_name 設定的名稱不會被系統覆蓋。

若未設定名稱,系統會自動使用「類型 + 流水號」格式(如 Transcription #1、Broadcast #3)。Session 結束後,系統會根據逐字稿內容嘗試自動生成更有意義的名稱(但不會覆蓋透過 set_name 設定的名稱)。

切換翻譯語言

單語言場次:在錄音進行中切換目標語言,系統會自動將已翻譯的句子重新翻譯:

{
  "type": "voice-translation",
  "data": {
    "action": "switch_language",
    "translation_languages": ["ja-JP"]
  }
}

系統會依序回傳 language_switch_start → 多個 batch_retranslation → language_switch_done 事件。

多語言場次(v1.6.7):switch_language 改為「新增/移除單一語言」語意,必須帶 op:

{
  "type": "voice-translation",
  "data": {
    "action": "switch_language",
    "op": "add",
    "translation_languages": ["de-DE"]
  }
}
  • op: "add":新增語言並自動補譯既有句子(回應序列同上),上限 12 種
  • op: "remove":移除語言,回 translation_language_removed 事件;歷史譯文保留,至少需保留 1 種
  • 多語言場次不帶 op 會回 switch_language_op_required 錯誤(防止誤用單語言置換語意破壞語言集)

語言集同步:op:add 與單語言置換送出的事件同形(皆走 language_switch_start/done)。這些事件已回帶 translation_languages(當前完整翻譯語言集)——請直接以此覆寫本地語言集,勿只憑事件裡的單一 translation_language 推測是附加或置換(當前僅 1 種語言時 op:add 擴增為第 2 種,只看單一語言會誤判為置換而洗掉既有語言)。

詳見 WebSocket 參考 switch_language。

重新翻譯指定句子

修正辨識錯誤後,可對單句重新翻譯:

{
  "type": "voice-translation",
  "data": {
    "action": "retranslate",
    "sid": 1,
    "translation_languages": ["en-US"],
    "text": "修正後的原文"
  }
}

進階功能

多語言翻譯

在 translation_languages 中指定多個目標語言(最多 12 個),即可同時翻譯為多種語言,適用 transcribe 與 broadcast(互譯的翻譯語言由伺服器指定、恆為單一語言;record 自 v1.7.0 起不支援翻譯):

{
  "transcription_languages": ["zh-TW"],
  "translation_languages": ["en-US", "ja-JP", "ko-KR"]
}

接收方式(v1.6.7):每個語言各回一則獨立的 result 事件——同一句(同一 sid)會收到 N 則 result,每則的 translations 僅含單一語言 key。客戶端需以「sid + 語言代碼」累積譯文、不可互相覆蓋;各語言完成順序不固定(並行翻譯),部分語言失敗時其餘語言仍照常送達。

即時程度:與單語言相同,由 realtime_translation 決定——true 時句子辨識過程中(interim)就逐字翻譯全部語言;false(預設)時整句完成才翻譯全部語言。

中途調整語言:多語言場次可透過 switch_language(op: "add" / op: "remove")中途新增或移除語言,見切換翻譯語言。

計費提醒:翻譯自第 2 種語言起按語言數量計費加乘,指定 N 種即按 N 種計費(詳見計費說明)。多語言即時翻譯的點數消耗顯著高於單語言,請依實際需求選擇語言數。

說話者辨識(Multi Speaker)

設定 recognition_mode 為 multi_speaker 啟用說話者辨識:

{
  "recognition_mode": "multi_speaker"
}

注意:multi_speaker 模式下 transcription_languages 必須恰好 1 個。若提供多個語言會收到 diarization_multilang_conflict 錯誤並拒絕開始。互譯(type=conversation)自 v1.7.2 起豁免此限制 —— 會接受 speaker_diarization 但忽略它。

提示:若每位發言者都有專屬麥克風,建議改用多聲道語者分離——語者由聲道決定、不需推斷,且每路可各自綁定不同語言。

啟用後,辨識結果中的 speaker_id 會自動區分不同說話者(如 Guest-1、Guest-2)。可搭配以下操作管理說話者:

  • rename_speaker:全域重命名說話者(如 Guest-1 改為 王經理)
  • reassign_speaker:修改單句的說話者身份
  • merge_speakers:合併兩位說話者(將一方的所有句子歸到另一方)

TTS 播放控制

在 async 模式下,可手動控制 TTS 播放:

播放指定句子:

{
  "type": "voice-translation",
  "data": {
    "action": "tts_play",
    "sid": 5,
    "length": 3
  }
}

停止播放:

{
  "type": "voice-translation",
  "data": { "action": "tts_stop" }
}

切換播放模式:

{
  "type": "voice-translation",
  "data": {
    "action": "tts_mode",
    "tts_mode": "async"
  }
}
模式行為
sync自動播放最新的 is_final=true 翻譯,前一句播完才播下一句
async手動透過 tts_play 控制播放

文字處理參數(Config)

可在 start 之前或錄音進行中,透過 config action 設定術語庫、模糊詞校正和翻譯字典:

{
  "type": "voice-translation",
  "data": {
    "action": "config",
    "terminology": {
      "zh-TW": [
        { "term": "語者分離" },
        { "term": "CVD製程" }
      ]
    },
    "translation_dict": {
      "en-US": [{ "source": "語者分離", "target": "Speaker Diarization" }]
    }
  }
}
設定項目說明
terminology術語庫 -- 提升特定詞彙的辨識準確度(所有語言合計最多 500 筆)
fuzzy_correction模糊詞校正 -- 修正讀音與術語不同的錯字(同音錯字由 terminology 直接涵蓋,通常不需設定此欄)
translation_dict翻譯字典 -- 確保專有名詞翻譯一致(每個語言最多 3000 條)

推薦做法:優先用 terminology。它除了驅動同音校正,還會提升辨識率本身 —— 也就是從源頭減少錯字,而不只是事後修正。讀音不同的錯字(例如外語品牌名被聽成 音韻無關的詞)才需要另外設 fuzzy_correction。

術語超過 500 筆時:terminology 的上限是所有語言合計 500 筆。超出的部分可以放進 fuzzy_correction、只給 correct 不給 incorrect(中文適用),一樣會依讀音自動比對, 規則上限是 4000 條。差別是這條路不會提升辨識率,只做事後修正。


多聲道語者分離

多聲道語者分離(recognition_mode: "multi_channel")讓一場錄音同時接入多支實體麥克風,每支麥克風各自獨立進行語音辨識,語者身分由聲道決定——哪一路是誰,在 start 時即已宣告,完全不需 AI 推斷。適用 type 為 transcribe 與 record 的錄音。

注意:此功能需開通後才可使用。未開通的環境送出 recognition_mode: "multi_channel" 會收到 invalid_recognition_mode 錯誤。

三種語者分離方式對照

方式設定語者判定適用場景
單路(無分離)recognition_mode: "single"(預設)不區分語者單人口述、演講收音
AI 語者分離recognition_mode: "multi_speaker"系統從聲音特徵推斷一支麥克風收多人(如會議室單麥)
實體聲道分離recognition_mode: "multi_channel"由聲道(實體麥克風)決定每位發言者各有專屬麥克風

選用建議:

  • 做得到一人一麥,就用實體聲道分離:語者歸屬由聲道決定、不會誤判,多人同時發言也能各自完整辨識,且每路可各自綁定不同的轉錄語言。
  • 只有一支麥克風收多人時,用 AI 語者分離:由系統從聲音特徵推斷語者;transcription_languages 必須恰好 1 個。
  • 多聲道本身即是語者分離的一種,不可與 speaker_diarization 參數同時指定(回 invalid_parameter)。
  • type=conversation 不支援多聲道(回 invalid_parameter);type=broadcast 也不支援(回 multichannel_broadcast_not_allowed)。

開始多聲道錄音

{
  "type": "voice-translation",
  "data": {
    "action": "start",
    "type": "transcribe",
    "recognition_mode": "multi_channel",
    "channel_mode": "per_channel",
    "channels": [
      { "channel_id": 1, "speaker_name": "主講者", "transcription_languages": ["zh-TW"] },
      { "channel_id": 2, "speaker_name": "與談人 A", "transcription_languages": ["en-US"] }
    ],
    "transcription_languages": ["zh-TW", "en-US"],
    "translation_languages": ["ja-JP"],
    "audio_format": "pcm",
    "summary_template": "meeting"
  }
}
規則說明
channel_mode必填:"per_channel"(每路聲道獨立辨識)或 "shared"(各路輪流發言、共用一條辨識,見下方 輪流發言:shared 模式);其他值回 invalid_channel_mode
channels1–8 路(含主講者,慣例 channel_id: 1);channel_id 值域 1–8 且不可重複
每路語言per_channel:transcription_languages 恰好 1 個;各路語言的聯集必須與 session 級 transcription_languages 完全一致(去重後),否則回 channel_language_mismatch。shared:各路不帶語言
audio_format僅支援 pcm(16000 Hz/16-bit/Mono/Little-endian),其他值回 multichannel_requires_pcm
TTS首版不支援:tts_enabled: true 回 multichannel_tts_not_allowed
方案上限方案可設聲道路數上限,超過時在 start/add_channel 當場回 plan_feature_not_allowed(details.field: "max_stt_streams")

啟動成功後,session_started(與斷線重連的 resume_ok)的 data 會帶 channel_mode 與 channels[](每路含 channel_id、speaker_name、transcription_languages、status;shared 模式不帶 transcription_languages),可直接用來初始化或還原 UI。

傳送多路音訊

多聲道下,每一幀 audio 都必須帶 channel_id 標明來源聲道:

{
  "type": "voice-translation",
  "data": {
    "action": "audio",
    "channel_id": 2,
    "payload": "Base64 編碼的音訊資料..."
  }
}
  • 未知或已移除的 channel_id 會收到 unknown_channel_id 錯誤。
  • 建議每 100ms 送一幀。
  • 每一路都要持續送音訊(靜音也要送):單一聲道沒有聲音不會結束錄音;整場所有聲道都長時間沒有辨識出文字時,錄音才會自動結束(見 長時間沒有語音時自動結束)。

接收多聲道結果

result 事件的 origin 會帶 channel_id 與由聲道決定的語者欄位:

{
  "type": "voice-translation",
  "data": {
    "action": "result",
    "origin": {
      "sid": 3,
      "language": "en-US",
      "text": "Hello everyone",
      "is_final": true,
      "channel_id": 2,
      "speaker_id": "channel_2",
      "speaker_label": "與談人 A",
      "detected_language": "en-US",
      "start_time": "00:12"
    }
  }
}
  • speaker_id 格式為 channel_{N}(由聲道決定、不可變);speaker_label 為該路的 speaker_name。
  • translations 不帶 channel_id,請以 sid 對回 origin。
  • 多聲道下各路獨立發句,sid 不保證遞增;逐字稿每句會帶 channel_id 欄位(單路錄音不帶此欄位)。

錄音中管理聲道

Action用途重點
add_channel動態加一路(channels 恰好帶 1 個元素)編號不可重用(含已移除的,回 channel_id_in_use);受總上限 8 路與方案路數上限管;新路約 4 秒後開始出字(期間音訊不會丟失,只是延遲出字)
remove_channel停用一路(帶 channel_id)最後一路不可移除(channel_remove_not_allowed);已產生的逐字稿與音檔保留;約 3 秒收尾窗讓最後一句話回來;下一分鐘起計費路數減少
set_channel_language換單路語言(帶 channel_id 與恰 1 個新語言)channel_id/speaker_id 不變、逐字稿連續;同一路 5 秒內僅接受一次切換(channel_rebuild_too_frequent);引入新語言時受平台上限 10 與方案語言上限管(too_many_languages);切換後約 4 秒恢復出字
set_speaking_speed調整斷句門檻多聲道支援,全部聲道套用新門檻,套用期間各路短暫不出字(操作間隔限制 5 秒,同 channel_rebuild_too_frequent)
  • switch_language(含 op:add/op:remove)在多聲道一律回 multichannel_switch_language_not_allowed——語言綁在聲道上,請改用 set_channel_language。
  • 暫停中不可執行聲道操作(回 channel_action_while_paused),請先 resume。
  • 換語言請用 set_channel_language,不要用 remove_channel + add_channel:編號不可重用,換編號會讓同一個人在逐字稿裡變成兩個語者。

各 action 的完整參數與錯誤碼詳見 Voice Translation Reference。

channel_status 事件與 UI 狀態燈

聲道每次建立、設定變更、移除或異常,伺服器會推送 channel_status 事件:

{
  "type": "voice-translation",
  "data": {
    "action": "channel_status",
    "channel": {
      "channel_id": 2,
      "speaker_name": "與談人 A",
      "transcription_languages": ["ja-JP"],
      "status": "preparing"
    },
    "active_channels": 3,
    "stt_stream_count": 3,
    "reason": "language_change"
  }
}
status意義建議 UI 呈現
preparing準備中(建立或套用新設定中),該路講的話會延遲數秒才出字黃燈(準備中)
ready該路已開始出字綠燈(運作中)
removed已被 remove_channel 停用灰燈(已停用)
error該路異常且無法自動恢復紅燈(異常)

reason 說明狀態變化的原因,值域:added(新增)、language_change(切換語言)、reconnect(斷線自動重連)、resumed(暫停後恢復)、removed(停用)、speaking_speed(語速調整)、stt_error(辨識異常)。

實作建議:以 channel_status 驅動每一路的狀態燈——preparing 時顯示「準備中」提示使用者稍候(這段期間講的話不會丟失,只是延遲出字;唯獨切換當下說到一半的那一句無法保留,會另外收到 segment_discarded),ready 時亮綠燈,error 時提示檢查該路或重新加入。斷線重連後以 resume_ok 的 channels[] 快照整批還原狀態,不要只靠事件累積。

設備要求

  • 使用指向性/近講麥克風,收音距離建議 5–10 公分。
  • 麥克風之間保持足夠間距,避免一人講話被多路同時收到(串音)。
  • 不符合設備要求時的串音不在品質保證範圍:一人講話多路收音時,同一句話可能在多路各出現一次。

客戶端串音對策(擇一或並用):

  • 選路:同一時刻只送能量最強的那一路(其他路照送靜音幀)。
  • 物理隔離:確保每支麥克風只收到自己的發言者。

輪流發言:shared 模式

同一時間只有一個人說話的場合(例如主持人與來賓輪流發言),可用 channel_mode: "shared":各路共用一條辨識,語者依「那段聲音從哪一路送進來」標記,計費固定以 1 路採計(語音辨識 1.0+語者分離 0.5,每分鐘 1.5 點)。

{
  "type": "voice-translation",
  "data": {
    "action": "start",
    "type": "transcribe",
    "recognition_mode": "multi_channel",
    "channel_mode": "shared",
    "transcription_languages": ["zh-TW"],
    "audio_format": "pcm",
    "channels": [
      { "channel_id": 1, "speaker_name": "主持人" },
      { "channel_id": 2, "speaker_name": "來賓 A" },
      { "channel_id": 3, "speaker_name": "來賓 B" },
      { "channel_id": 4, "speaker_name": "來賓 C" }
    ]
  }
}

客戶端必須遵守:

  • 同一時刻只送一路:只送目前發言者那一路的 audio。同時送多路時,各路聲音會依收到的順序排進同一條辨識,逐字稿會錯亂。
  • 持續送靜音:沒有人說話時,目前那一路也要持續送靜音幀,不要停送。
  • 僅 pcm。
  • 語言全場共用:各路不帶 transcription_languages(帶了回 channel_language_not_allowed);錄音中不能變更語言。
  • 第一路不可移除:channels[] 的第一路承載全場的辨識,remove_channel 會回 channel_remove_not_allowed。

聲道狀態:其他聲道的 preparing/ready/error 跟著第一路,第一路狀態改變時每一路各收到一則 channel_status;add_channel 新增的聲道直接套用第一路當下的狀態;removed 依各路自己。詳見 channel_status。

已知限制:

  • 換人的間隔小於約 0.8 秒時,前後兩人的話可能被併成一句,整句只標一個語者。
  • 語者依聲道標記決定,在輪流發言的情境下準確度高;無法事後改派或合併語者。
  • 暫停恢復後的補轉錄是整條最後 60 秒,所有聲道一起補、語者照標。

已知限制

  • 首版不支援 TTS 語音合成(multichannel_tts_not_allowed)。
  • 不支援廣播(multichannel_broadcast_not_allowed)與互譯(invalid_parameter)。
  • 檔案匯入不支援多聲道。
  • 暫停期間錄音檔照常保存、不出字;恢復後暫停期間講的話會補轉錄(時間戳落在實際講話時刻),補轉錄上限為全場共 60 秒的尾段(per_channel 多路時平分到各路;shared 為整條最後 60 秒),超過的部分僅保存在音檔中、不進逐字稿。暫停瞬間講到一半的句子可能不會出現在逐字稿(與單路一致);若該句確實沒有留下,恢復時會另外收到 segment_discarded(reason: "resumed")指明是哪一句。
  • 語者管理:rename_speaker 可用(可在該路發言前先改名);reassign_speaker 與 merge_speakers 不適用於多聲道(回 speaker_op_not_allowed_multi_channel)。
  • 音檔長度上限:一場多聲道錄音保存的音訊有總量上限,開著的聲道越多越早碰到(8 路約 70 分鐘)。碰到上限後,音檔與錄音時長停在上限當下,逐字稿與扣點照常繼續。

計費提醒:多聲道屬語者分離的一種,計費為語音辨識 1.0 點/分鐘+語者分離 0.5 點/分鐘,per_channel 另依當下聲道路數 N 加收 (N−1)×1.0 點/分鐘(第 1 路已含在基礎費),shared 固定以 1 路採計、不加收;每一分鐘開始時依當下路數扣點,add_channel 新增的聲道自下一分鐘起計費,remove_channel 後下一分鐘起降價。使用吃到飽方案時,多聲道需方案含此功能。詳見計費說明。


互譯模式

互譯模式讓兩個說不同語言的人透過單一 WebSocket 連線進行即時互譯對話。系統自動偵測每句話的語言,翻譯為對方語言,並以 TTS 語音回傳翻譯結果。語言偵測完全自動,不需手動切換。

開始互譯

{
  "type": "voice-translation",
  "data": {
    "action": "start",
    "type": "conversation",
    "transcription_languages": ["zh-TW", "en-US"],
    "audio_format": "pcm",
    "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 個語言
  • active_language 可選,指定初始偏好語言(語言偵測仍為自動)
  • tts_config 可省略,系統自動使用預設語音
  • tts_enabled 預設 true,設為 false 則僅回傳文字翻譯
  • 互譯只翻譯整句辨識完成的句子,realtime_translation 在互譯沒有作用,帶或不帶結果相同

自動語言偵測

系統自動偵測每句話的語言。每句話的 origin.language 直接反映偵測到的語言,翻譯目標自動為兩個語言中的另一個。

注意:不需要手動呼叫 switch_language 切換語言,系統會自動偵測。switch_language 仍可使用,但僅更新內部偏好狀態。

途中切換 TTS 設定

在互譯進行中,可透過 set_tts 切換 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 事件,包含更新後的完整設定。

完整互譯流程

1. start (conversation, zh-TW + en-US)
2. session_started
3. 傳送音訊 (Person A 說中文)
4. result (origin.language: "zh-TW", translations: en-US)  ← 自動偵測
5. tts_ready (en-US 語音 → 播出給 Person B)
6. 傳送音訊 (Person B 說英文,不需切換!)
7. result (origin.language: "en-US", translations: zh-TW)  ← 自動偵測
8. tts_ready (zh-TW 語音 → 播出給 Person A)
9. stop
10. task_complete

停止與摘要

停止錄音

發送 stop action 結束語音翻譯工作階段:

{
  "type": "voice-translation",
  "data": { "action": "stop" }
}

錄音連續一段時間沒有辨識出任何文字(預設 15 分鐘)會自動結束,之後的流程與送出 stop 相同。見 長時間沒有語音時自動結束。

事件流程

停止後,系統會依序執行以下步驟並推送事件:

  1. status -- 確認語音辨識已停止
  2. (背景處理) -- 上傳音檔、儲存逐字稿
  3. task_complete -- 任務處理完成,包含 task_id
{
  "type": "voice-translation",
  "data": {
    "action": "task_complete",
    "task_id": "550e8400-e29b-41d4-a716-446655440000",
    "message": "任務處理完成"
  }
}

整場沒有收到任何音訊時,task_complete 會帶 noAudio: true,這筆錄音沒有逐字稿可以讀取。見 task_complete。

  1. (若設定了摘要模板) -- 系統自動生成摘要;可用點數不足以支付摘要費用時不產生,改送 summary_error

保存 task_id,後續可透過 Tasks API 查詢結果,或使用 SSE API 載入歷史紀錄。


完整流程圖

                    前置準備
                       │
        ┌──────────────┼──────────────┐
        │              │              │
   取得 API Key   取得 Ticket    建立 WebSocket
        │              │              │
        └──────────────┼──────────────┘
                       │
               ┌───────▼───────┐
               │  config(選用)│  設定術語庫 / 校正規則
               └───────┬───────┘
                       │
               ┌───────▼───────┐
               │     start     │  開始語音翻譯
               └───────┬───────┘
                       │
               session_started
                       │
          ┌────────────▼────────────┐
          │                         │
    ┌─────▼─────┐            ┌─────▼─────┐
    │   audio   │────────────│   result  │
    │  (持續)  │  傳送音訊   │  辨識結果  │
    └─────┬─────┘            └─────┬─────┘
          │                        │
          │    ┌───────────────────┤
          │    │                   │
          │  origin           translations
          │  (原文)          (翻譯結果)
          │                        │
          │               ┌────────▼────────┐
          │               │ tts_ready(選用)│
          │               └─────────────────┘
          │
    ┌─────▼─────┐    ┌──────────┐
    │  pause /  │◄──►│ resume   │  操作控制
    │  resume   │    └──────────┘
    └─────┬─────┘
          │
    ┌─────▼─────┐
    │   stop    │  停止翻譯
    └─────┬─────┘
          │
    ┌─────▼──────────┐
    │  task_complete  │  任務完成(含 task_id)
    └─────┬──────────┘
          │
    ┌─────▼─────┐
    │  summary  │  摘要生成(若有設定模板)
    └───────────┘

相關文件

文件說明
認證機制API Key、Ticket 認證詳細說明
Voice Translation Reference所有 action 的完整 API 規格
回應事件 Reference所有回應事件格式參考
歷史紀錄與回放停止後如何載入歷史紀錄
TTS 語音合成TTS 功能完整指南
說話者管理說話者重命名、重新指派、合併
計費說明各功能計費規則(含多聲道加價)

版本:V1.24.1 最後更新:2026-10-07

Copyright © 2026