即時語音翻譯指南
目錄
概述
VAS 即時語音翻譯服務透過 WebSocket 提供低延遲的語音辨識(STT)與即時翻譯功能。完整流程為:
- 客戶端透過麥克風擷取音訊
- 將音訊串流傳送到 VAS 伺服器
- 伺服器進行語音辨識,回傳逐字稿
- 同步進行多語言翻譯並回傳結果
- (選用)生成 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_languages | string[] | 是 | 語音辨識語言,最多 10 個(如 ["zh-TW"]) |
translation_languages | string[] | 否 | 翻譯目標語言,可多個(最多 12 個;空陣列或不傳代表不翻譯)。v1.6.7 起指定多個語言即同時即時翻譯全部語言,見多語言翻譯 |
type | string | 是 | 錄音類型:transcribe、conversation、record、broadcast |
audio_format | string | 否 | 音訊格式:pcm(預設)或 webm |
summary_template | string | 條件 | 摘要模板(transcribe 類型必填,如 meeting、interview) |
realtime_translation | boolean | 否 | 即時翻譯模式(預設 false) |
recognition_mode | string | 否 | single(單人,預設)或 multi_speaker(多人語者分離);multi_speaker 下 transcription_languages 必須恰好 1 個,否則回傳 diarization_multilang_conflict 錯誤並拒絕開始(type=conversation 除外,自 v1.7.2 起豁免) |
name | string | 否 | 初始預設錄音名稱(最大 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_language | TTS 輸出語言(需在 translation_languages 中) |
tts_voice | TTS 語音名稱(如 en-US-JennyNeural) |
tts_mode | sync(自動播放,預設)或 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_final | false 為中間結果(會被覆蓋),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 |
channels | 1–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相同。見 長時間沒有語音時自動結束。
事件流程
停止後,系統會依序執行以下步驟並推送事件:
status-- 確認語音辨識已停止- (背景處理) -- 上傳音檔、儲存逐字稿
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。
- (若設定了摘要模板) -- 系統自動生成摘要;可用點數不足以支付摘要費用時不產生,改送
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