使用指南

Broadcast

目錄

  1. 概述
  2. 完整流程圖
  3. 主講者端流程
  4. 觀眾端流程
  5. 密碼保護
  6. 容量管理與排隊機制
  7. 廣播狀態與生命週期
  8. 預備階段(Standby)詳解
  9. 公告功能
  10. 錯誤處理
  11. 相關 Reference 文件

概述

VAS 廣播功能提供 1 對多的即時字幕廣播,主講者透過 WebSocket 傳送音訊進行語音辨識與翻譯,觀眾透過 SSE 即時接收多語言字幕。

核心特色

  • 即時字幕:主講者語音即時轉為多語言字幕
  • 1 對多架構:一個主講者,多個觀眾同時接收
  • 多語言翻譯:支援多個翻譯語言,觀眾可選擇偏好語言
  • TTS 語音:觀眾端可接收翻譯語音播放
  • 預備階段:主講者可先熱機測試,確認設備正常後再正式開播
  • 密碼保護:支援公開或密碼保護的廣播
  • 容量管理:觀眾上限與排隊機制
  • 說話者辨識:支援多人語者分離(Speaker Diarization)

涉及的 API 類型

API 類型角色用途
REST API主講者建立、查詢、更新、撤銷廣播
REST API觀眾查詢廣播資訊、密碼驗證
WebSocket主講者音訊傳送、控制廣播、觀眾管理
SSE觀眾接收即時字幕、翻譯、TTS
廣播 REST API觀眾查詢廣播即時狀態

認證方式

  • 主講者端:REST API 使用 API Key,WebSocket 使用 Ticket 認證。詳見 認證說明
  • 觀眾端:透過廣播 Token 認證,無需 API Key。密碼保護廣播需額外取得 viewer_access_token

完整流程圖

主講者端                                     觀眾端
========                                     ========

[1] POST /api/v1/broadcasts
    建立廣播,取得 token & share_url
         |
[2] 分享 share_url 給觀眾 ──────────────────> 收到分享連結
         |                                         |
[3] POST /api/v1/auth/ticket                 [A] GET /api/v1/viewer/broadcasts/{token}
    取得 WebSocket Ticket                         查詢廣播公開資訊
         |                                         |
[4] WebSocket 連線                            [B] (若密碼保護)
    wss://vas-poc.vurbo.ai/ws                        POST /viewer/broadcasts/{token}/verify
         |                                         取得 viewer_access_token
[5] 發送 start action                              |
    type: "broadcast"                         [C] EventSource 連線
    broadcast_token: "xxx"                        GET /broadcast/{token}/text
    broadcast_phase: "standby"                     |
         |                                         |
    ===== 預備階段(Standby)=====                  |
         |                                    收到 connected 事件
[6] STT/翻譯結果僅主講者可見                  收到 standby 事件
    主講者測試設備                             顯示「準備中,請稍候...」
         |                                         |
    ===== 切換到正式階段 =====                      |
         |                                         |
[7] broadcast_go_live ─────────────────────> 收到 phase_changed 事件
         |                                    phase: "live"
    ===== 正式直播(Live)=====                     |
         |                                         |
[8] 傳送音訊 (audio action)                  [D] 接收即時字幕
    接收辨識結果                                   origin 事件(原文)
    接收翻譯結果                                   translation 事件(翻譯)
         |                                         tts_ready 事件(TTS 音訊)
         |                                         |
[9] 暫停 (pause) ──────────────────────────> 收到 paused 事件
         |                                         |
[10] 恢復 (resume) ────────────────────────> 收到 resumed 事件
         |                                         |
[11] 發送公告 ─────────────────────────────> 收到 announcement 事件
         |                                         |
[12] 停止 (stop) ──────────────────────────> 收到 ended 事件
                                                   關閉 SSE 連線

主講者端流程

步驟 1:建立廣播

透過 REST API 建立廣播頻道,取得分享 Token 和連結。

curl -X POST "https://vas-poc.vurbo.ai/api/v1/broadcasts" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "transcription_language": "zh-TW",
    "translation_languages": ["en-US", "ja-JP"],
    "name": "技術研討會即時字幕",
    "access_type": "public",
    "max_viewers": 100,
    "speaker_diarization": false,
    "tts_config": {
      "en-US": {"voice": "en-US-JennyNeural", "speaking_rate": 1.0},
      "ja-JP": {"voice": "ja-JP-NanamiNeural", "speaking_rate": 1.0}
    },
    "summary_template": "meeting",
    "summary_language": "zh-TW"
  }'

關鍵請求參數:

參數必填說明
transcription_language轉錄語言(主講者說的語言)
translation_languages翻譯語言陣列
name頻道名稱(最大 100 字元)
access_typepublic(預設)或 password
pass_code條件密碼(password 類型時必填,4-12 字元)
max_viewers最大觀眾人數(預設為方案上限)
speaker_diarization是否啟用說話者辨識(預設 false
tts_configTTS 預設設定
summary_template摘要模板 slug(如 meetinglecture
summary_language摘要輸出語言(不指定時使用 transcription_language
callback_urlWebhook 回呼 URL(錄音處理完成/失敗時通知)

成功回應重點欄位:

欄位說明
id廣播 ID(用於後續 REST API 操作)
token分享 Token(4 字元短碼 a-z0-9,用於觀眾端連線)
share_url分享連結(直接給觀眾的完整 URL)
status初始狀態為 pending

完整參數請參考 REST API - Broadcasts

Webhook 通知:加入 callback_url 參數後,廣播錄音處理完成時會收到 recording.completed 事件通知。詳見 Webhook 回呼指南

步驟 2:分享連結給觀眾

將回應中的 share_url 分享給觀眾。觀眾可透過此連結進入廣播頁面。

https://vas-poc.vurbo.ai/broadcast/a3f9

步驟 3:WebSocket 連線

主講者需建立 WebSocket 連線來傳送音訊。

3.1 取得 Ticket:

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

3.2 建立 WebSocket 連線:

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

3.3 發送 start action:

{
  "type": "voice-translation",
  "data": {
    "action": "start",
    "type": "broadcast",
    "broadcast_token": "a3f9",
    "audio_format": "pcm",
    "broadcast_phase": "standby",
    "standby_message": "演講即將開始,請稍候..."
  }
}

廣播模式 start 的關鍵參數:

參數必填說明
type必須為 "broadcast"
broadcast_token建立廣播時取得的 Token
audio_formatpcmwebm
broadcast_phasestandby(預備)或 live(預設)
standby_message預備階段觀眾看到的訊息
tts_config多語言 TTS 設定(可覆蓋建立時的設定)
summary_template摘要模板 slug(可覆蓋建立時的設定,不指定時使用廣播頻道的預設值)

注意:廣播模式的語言設定會自動從廣播頻道設定取得,無需在 start 中傳送 transcription_languagestranslation_languagessummary_templatesummary_language 也會從廣播頻道設定取得,僅在需要覆蓋時才需傳入。

成功回應:

{
  "type": "voice-translation",
  "data": {
    "action": "session_started",
    "session_id": "550e8400-e29b-41d4-a716-446655440000",
    "recording_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": "語音辨識已開始"
  }
}

步驟 4:預備階段(standby)

預備階段讓主講者在正式開播前進行設備測試和 STT/翻譯熱機。

預備階段特性:

  • STT/翻譯結果只給主講者,觀眾看不到
  • 觀眾會看到 standby_message 設定的等待訊息
  • 主講者可確認麥克風、辨識準確度等是否正常
  • 隨時可動態更新預備訊息

動態更新預備訊息:

{
  "type": "voice-translation",
  "data": {
    "action": "set_standby_message",
    "message": "講師正在準備中,預計 5 分鐘後開始..."
  }
}

觀眾端會即時收到更新的 standby 事件,訊息會自動翻譯成所有翻譯語言。

詳細說明請參考 預備階段詳解

步驟 5:正式直播(go_live)

確認設備正常後,切換到正式階段:

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

成功回應:

{
  "type": "voice-translation",
  "data": {
    "action": "broadcast_phase_changed",
    "phase": "live",
    "message": "廣播已開始"
  }
}

切換後:

  • STT/翻譯結果開始廣播給觀眾
  • 結果開始寫入逐字稿
  • TTS 開始發送給觀眾
  • 觀眾端收到 phase_changed 事件

注意:如果 start 時設定 broadcast_phase: "live"(預設),則跳過預備階段直接進入正式直播。

步驟 6:直播中操作

正式直播期間,主講者可進行以下操作:

傳送音訊:

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

暫停直播:

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

觀眾端會收到 paused 事件,並顯示「直播暫停中」。

恢復直播:

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

觀眾端會收到 resumed 事件。

步驟 7:動態更新設定

廣播進行中可透過 REST API 即時調整設定:

curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/broadcasts/{id}" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "translation_languages": ["en-US", "ja-JP", "ko-KR"],
    "max_viewers": 200
  }'

可動態更新的設定:

設定說明
access_type切換公開/密碼保護
pass_code更新密碼
max_viewers調整觀眾上限
transcription_language變更轉錄語言
translation_languages新增或移除翻譯語言
speaker_diarization開啟/關閉說話者辨識
tts_config更新 TTS 設定
summary_template摘要模板(空字串清除)
summary_language摘要輸出語言(空字串清除)

只有 pendingactivepaused 狀態的廣播可以更新。

步驟 8:觀眾管理

主講者可在直播期間監控觀眾人數。系統每 3 秒檢查一次,若有變動會推送 viewer_count 事件:

{
  "type": "voice-translation",
  "data": {
    "action": "viewer_count",
    "viewer_count": 45,
    "queue_count": 8,
    "peak_viewers": 50,
    "total_viewers": 123
  }
}
欄位說明
viewer_count目前在線觀眾數
queue_count排隊等待中的觀眾數
peak_viewers本次廣播峰值觀眾數
total_viewers累計曾連線的觀眾總數

步驟 9:停止廣播

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

停止後:

  • 所有觀眾收到 ended 事件
  • 系統自動上傳音檔和逐字稿
  • 廣播狀態變更為 ended
  • 主講者收到 task_complete 事件(含 task_id 可用於後續查詢)

觀眾端流程

步驟 1:取得廣播資訊

觀眾開啟分享連結後,先查詢廣播資訊。

方式 A:透過 Viewer API

curl -X GET "https://vas-poc.vurbo.ai/api/v1/viewer/broadcasts/{token}"

回應包含頻道名稱、存取類型、可用語言、TTS 語音列表等資訊。前端可據此顯示廣播資訊頁面。

Viewer API 回應重點欄位:

欄位說明
name頻道名稱
access_typepublicpassword
requires_password是否需要密碼驗證
is_live是否正在直播
translation_languages可用的翻譯語言
tts_languages支援 TTS 的語言
tts_voices各語言可用的 TTS 語音列表

步驟 2:密碼驗證(若需要)

如果廣播設定為密碼保護(requires_password: true),觀眾需先驗證密碼:

curl -X POST "https://vas-poc.vurbo.ai/api/v1/viewer/broadcasts/{token}/verify" \
  -H "Content-Type: application/json" \
  -d '{"password": "mySecret123"}'

成功回應:

{
  "data": {
    "viewer_access_token": "aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vWaB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW",
    "expires_at": "2026-01-04T10:00:00.000Z"
  }
}

取得的 viewer_access_token 在後續 SSE 連線時需帶入。Token 有效期 24 小時。

步驟 3:SSE 連線接收字幕

觀眾透過 SSE 連線即時接收字幕串流。

基本連線(公開廣播):

const eventSource = new EventSource(
  'https://vas-poc.vurbo.ai/broadcast/{token}/text'
);

篩選特定翻譯語言:

const eventSource = new EventSource(
  'https://vas-poc.vurbo.ai/broadcast/{token}/text?lang=en-US'
);

啟用 TTS:

const eventSource = new EventSource(
  'https://vas-poc.vurbo.ai/broadcast/{token}/text?lang=en-US&tts=true'
);

密碼保護廣播:

const eventSource = new EventSource(
  'https://vas-poc.vurbo.ai/broadcast/{token}/text?lang=en-US&viewer_access_token=aB3dE5fG7hI9jK1l...'
);

SSE 連線參數:

參數必填說明
token廣播分享 Token(路徑參數)
lang篩選特定翻譯語言(如 en-US
tts是否啟用 TTS(true / false
viewer_access_token條件密碼保護廣播時必填

步驟 4:接收即時內容

連線成功後,觀眾會依序收到以下事件:

4.1 connected(連線確認)

{
  "session_id": "abc123",
  "source_lang": "zh-TW",
  "subscribed_lang": "en-US",
  "available_langs": ["en-US", "ja-JP"],
  "tts_languages": ["en-US"],
  "phase": "live",
  "recognition_mode": "single",
  "client_id": "client_xyz"
}

4.2 origin(原文)

{
  "sid": 1,
  "text": "大家好,歡迎參加今天的技術研討會",
  "speaker_id": "0",
  "start_time": "00:05",
  "is_final": true
}

4.3 translation(翻譯)

{
  "sid": 1,
  "language": "en-US",
  "text": "Hello everyone, welcome to today's technical seminar",
  "speaker_id": "Royx",
  "is_final": true
}

4.4 tts_ready(TTS 音訊,需啟用 tts=true)

{
  "sid": 1,
  "language": "en-US",
  "transcript": "大家好,歡迎參加今天的技術研討會",
  "text": "Hello everyone, welcome to today's technical seminar",
  "audio": "Base64EncodedMP3...",
  "format": "mp3",
  "duration_ms": 3200,
  "boundaries": [...]
}

步驟 5:選擇語言與 TTS

觀眾端可透過 SSE 連線參數選擇偏好的翻譯語言和 TTS 設定。

切換語言:需要斷開現有 SSE 連線,使用新的 lang 參數重新連線。

// 切換到日文
eventSource.close();
const newEventSource = new EventSource(
  `https://vas-poc.vurbo.ai/broadcast/${token}/text?lang=ja-JP&tts=true`
);

完整觀眾端範例:

function connectBroadcast(token, lang, enableTts, viewerToken) {
  let url = `https://vas-poc.vurbo.ai/broadcast/${token}/text`;
  const params = new URLSearchParams();
  if (lang) params.set('lang', lang);
  if (enableTts) params.set('tts', 'true');
  if (viewerToken) params.set('viewer_access_token', viewerToken);

  if (params.toString()) url += `?${params.toString()}`;

  const eventSource = new EventSource(url);

  // 連線確認
  eventSource.addEventListener('connected', (e) => {
    const data = JSON.parse(e.data);
    console.log(`已連線,可用語言:${data.available_langs.join(', ')}`);
  });

  // 預備階段
  eventSource.addEventListener('standby', (e) => {
    const data = JSON.parse(e.data);
    const msg = data.translations?.[lang] || data.message;
    showWaitingScreen(msg);
  });

  // 階段變更
  eventSource.addEventListener('phase_changed', (e) => {
    const data = JSON.parse(e.data);
    if (data.phase === 'live') {
      hideWaitingScreen();
    }
  });

  // 原文
  eventSource.addEventListener('origin', (e) => {
    const data = JSON.parse(e.data);
    displayOriginText(data.sid, data.text, data.speaker_id, data.start_time);
  });

  // 翻譯
  eventSource.addEventListener('translation', (e) => {
    const data = JSON.parse(e.data);
    displayTranslation(data.sid, data.language, data.text);
  });

  // TTS
  eventSource.addEventListener('tts_ready', (e) => {
    const data = JSON.parse(e.data);
    playTtsAudio(data.audio, data.boundaries, data.text);
  });

  // 暫停/恢復
  eventSource.addEventListener('paused', (e) => {
    showPausedOverlay();
  });
  eventSource.addEventListener('resumed', (e) => {
    hidePausedOverlay();
  });

  // 公告
  eventSource.addEventListener('announcement', (e) => {
    const data = JSON.parse(e.data);
    const msg = data.translations?.[lang] || data.message;
    showAnnouncement(msg);
  });

  // 結束
  eventSource.addEventListener('ended', (e) => {
    const data = JSON.parse(e.data);
    showEndedScreen(data.reason);
    eventSource.close();
  });

  // 被踢除
  eventSource.addEventListener('kicked', (e) => {
    showKickedMessage();
    eventSource.close();
  });

  // 排隊
  eventSource.addEventListener('queued', (e) => {
    const data = JSON.parse(e.data);
    showQueuePosition(data.position, data.estimated_wait);
  });
  eventSource.addEventListener('admitted', (e) => {
    hideQueueScreen();
  });

  // 錯誤
  eventSource.addEventListener('error', (e) => {
    if (e.data) {
      const error = JSON.parse(e.data);
      handleError(error.error_code, error.message);
    }
    eventSource.close();
  });

  return eventSource;
}

密碼保護

廣播可設定為密碼保護,觀眾需輸入正確密碼才能進入。

建立密碼保護廣播

curl -X POST "https://vas-poc.vurbo.ai/api/v1/broadcasts" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "transcription_language": "zh-TW",
    "translation_languages": ["en-US"],
    "access_type": "password",
    "pass_code": "mySecret123"
  }'

觀眾端驗證流程

[1] GET /api/v1/viewer/broadcasts/{token}
    ↓ 確認 requires_password: true
[2] 顯示密碼輸入畫面
    ↓ 觀眾輸入密碼
[3] POST /api/v1/viewer/broadcasts/{token}/verify
    ↓ 取得 viewer_access_token
[4] SSE 連線帶入 viewer_access_token
    GET /broadcast/{token}/text?viewer_access_token=xxx

動態切換存取類型

廣播進行中可將公開廣播改為密碼保護,或反之:

# 改為密碼保護
curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/broadcasts/{id}" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "access_type": "password",
    "pass_code": "newPassword"
  }'

# 改回公開
curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/broadcasts/{id}" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "access_type": "public"
  }'

容量管理與排隊機制

觀眾上限

每個廣播可設定最大觀眾人數(max_viewers),超過上限的觀眾會進入排隊佇列。

排隊流程

當觀眾人數已達上限時:

  1. 新觀眾連線 SSE 後收到 queued 事件
  2. 系統告知排隊位置和預估等待時間
  3. 有觀眾離開時,佇列中的觀眾依序進入
  4. 觀眾進入直播時收到 admitted 事件

queued 事件:

{
  "position": 3,
  "estimated_wait": "約 2 分鐘"
}

admitted 事件:

{
  "message": "已進入直播"
}

排隊超時

排隊等待過久的觀眾會收到 ended 事件,原因為 capacity_exceeded

{
  "reason": "capacity_exceeded",
  "duration_ms": 0
}

動態調整上限

主講者可在直播期間動態調整觀眾上限:

curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/broadcasts/{id}" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"max_viewers": 200}'

提高上限後,排隊中的觀眾會自動進入。


廣播狀態與生命週期

狀態流轉

pending  ──(WebSocket start)──>  active  ──(pause)──>  paused
                                   |                      |
                                   |    <──(resume)───────
                                   |
                                   ├──(stop)──>  ended
                                   |
pending  ──(DELETE)──>  revoked

狀態說明

狀態說明允許操作
pending已建立,等待主講者啟動更新設定、撤銷
active直播中暫停、停止、更新設定、傳送音訊
paused已暫停恢復、停止、更新設定
ended已結束無(唯讀)
revoked已撤銷(僅 pending 狀態可撤銷)無(唯讀)

is_live 欄位

is_live 為便利欄位,當狀態為 activepaused 時為 true,表示廣播正在進行中。

結束原因

廣播結束時,觀眾收到的 ended 事件包含結束原因:

reason說明
session_stopped主講者正常結束
token_revokedToken 被撤銷
host_timeout主講者斷線超時
capacity_exceeded排隊超時

預備階段(Standby)詳解

預備階段是廣播正式開始前的熱機時段,讓主講者在正式開播前測試設備和確認辨識品質。

啟用預備階段

在 WebSocket start action 中設定 broadcast_phase: "standby"

{
  "type": "voice-translation",
  "data": {
    "action": "start",
    "type": "broadcast",
    "broadcast_token": "YOUR_TOKEN",
    "audio_format": "pcm",
    "broadcast_phase": "standby",
    "standby_message": "演講即將開始,請稍候..."
  }
}

預備階段行為

項目行為
STT 辨識正常運作,結果只發給主講者
翻譯正常運作,結果只發給主講者
觀眾字幕不發送,觀眾看到 standby_message
TTS不發送給觀眾
逐字稿不寫入

動態更新預備訊息

進入預備階段後,可隨時更新顯示給觀眾的訊息:

{
  "type": "voice-translation",
  "data": {
    "action": "set_standby_message",
    "message": "設備調整中,預計 3 分鐘後開始"
  }
}

更新後,所有觀眾立即收到新的 standby 事件:

event: standby
data: {"message":"設備調整中,預計 3 分鐘後開始","translations":{"en-US":"Adjusting equipment, expected to start in 3 minutes","ja-JP":"機器の調整中、約3分後に開始予定"}}

注意set_standby_message 只能在預備階段使用。已進入正式階段(live)時會回傳錯誤。

觀眾在預備階段的體驗

  1. 觀眾連線後收到 connected 事件(phase: "standby"
  2. 緊接著收到 standby 事件,包含等待訊息和多語言翻譯
  3. 主講者切換到正式階段時,觀眾收到 phase_changed 事件(phase: "live"
  4. 之後開始接收字幕和翻譯
eventSource.addEventListener('standby', (e) => {
  const data = JSON.parse(e.data);
  // 根據觀眾選擇的語言顯示對應翻譯
  const displayLang = 'en-US';
  const msg = data.translations?.[displayLang] || data.message;
  showWaitingScreen(msg);
});

eventSource.addEventListener('phase_changed', (e) => {
  const data = JSON.parse(e.data);
  if (data.phase === 'live') {
    hideWaitingScreen();
    // 開始顯示字幕區域
  }
});

公告功能

主講者可在直播期間發送公告訊息給所有觀眾。

發送公告

{
  "type": "voice-translation",
  "data": {
    "action": "broadcast_announcement",
    "message": "會議將在 5 分鐘後結束"
  }
}

觀眾端接收

觀眾透過 SSE 收到 announcement 事件,包含原文和多語言翻譯:

{
  "message": "會議將在 5 分鐘後結束",
  "translations": {
    "en-US": "The meeting will end in 5 minutes",
    "ja-JP": "会議は5分後に終了します"
  }
}

前端可根據觀眾選擇的語言顯示對應翻譯:

eventSource.addEventListener('announcement', (e) => {
  const data = JSON.parse(e.data);
  const displayLang = 'en-US';
  const msg = data.translations?.[displayLang] || data.message;
  showAnnouncementPopup(msg);
});

錯誤處理

主講者端常見錯誤

錯誤碼說明處理建議
broadcast_token_required廣播模式需要 Token確認提供 broadcast_token
broadcast_token_invalidToken 無效確認 Token 正確且未過期
broadcast_not_ready廣播服務尚未啟動稍後重試
broadcast_not_enabled非廣播模式確認 type: "broadcast"
broadcast_not_in_standby不在預備階段只能在 standby 階段使用
broadcast_cannot_update無法更新設定檢查廣播目前狀態
broadcast_cannot_revoke無法撤銷只有 pending 狀態可撤銷

觀眾端常見錯誤

錯誤碼說明處理建議
broadcast_not_found找不到廣播確認 Token 正確
broadcast_session_ended廣播已結束提示觀眾廣播已結束
broadcast_capacity_full觀眾已達上限加入排隊等待
broadcast_token_invalidToken 無效確認 Token 正確
broadcast_token_revokedToken 已撤銷廣播已被撤銷
broadcast_password_incorrect密碼錯誤重新輸入密碼

斷線處理

主講者斷線:

  • 觀眾收到 paused 事件(reason: "host_disconnected"
  • 如果主講者超時未重連,觀眾收到 ended 事件(reason: "host_timeout"

觀眾斷線:

  • SSE 連線斷開後,瀏覽器會自動重連(EventSource 內建機制)
  • 重連後會收到新的 connected 事件
  • SSE 使用 15 秒間隔的心跳保持連線活躍

相關 Reference 文件


版本:V1.5.7 最後更新:2026-05-20

Copyright © 2026