本文介紹通過 AOQ Client SDK 接入 Realtime API 的通用流程:獲取連接憑證、初始化 SDK、配置媒體方向、建立連接、按目標模型協議交互,以及釋放資源。
AOQ 將音視頻媒體與模型事件分軌傳輸。SDK 負責媒體採集、編解碼、傳輸和播放;應用通過 Data 軌發送模型事件並處理回復。接入不同模型時,需要分別選擇媒體方向和模型事件協議。
客戶端向業務 AppServer 請求憑證。AppServer 根據目標模型選擇 Realtime 或 Inference 建連地址,並攜帶 API Key 和
新建連接時獲取新的連接憑證。同一連接內能否復用會話或啓動下一輪任務,由目標模型協議決定。
創建引擎並註冊連接狀態、Data 消息和錯誤回調。以 iOS Swift 為例:
實現
以下“推”和“拉”均以客戶端為視角。按業務實際使用的輸入、輸出模態配置,不需要的方向不添加媒體軌道。
Data 軌獨立於這四個方向:發佈 Data 軌用於發送模型事件,訂閱 Data 軌用於接收回復。純文本輸入或輸出也需要 Data 軌。
下表是典型場景的媒體配置建議。具體模型及版本的支持範圍以 Realtime API 概述和模型文檔為準。
音頻上行和下行應分別配置:上行使用
在建連前關閉上行媒體發送,避免模型尚未就緒時收到輸入:
採集、發佈軌道和允許發送是不同的操作。關閉發送不等於停止本地採集,也不影響 Data 軌事件收發。未添加的軌道不會因開啓發送而自動創建。
將憑證與軌道配置填入
等待
客戶端通過 Data 軌發送事件。iOS Swift 示例:
在
滿足當前模型、當前會話或任務的就緒條件後,僅開啓已配置的上行方向。例如,需要語音輸入時調用:
需要視頻輸入時再開啓
不再使用連接時,由客戶端業務層調用AOQ SDK 的斷開連接和釋放資源接口:
異常斷開後清理業務層就緒狀態,按連接狀態管理處理後續連接;重新建連後按模型協議重新初始化。
客戶端通過AOQ SDK 的 Data 軌發送和接收模型事件。連接時需要發佈和訂閱 Data 軌;發送時將模型事件序列化後放入
多模態交互套件的雙向事件定義在同一篇交互協議中。請按實際接入的模型版本選擇事件定義,不同模型之間不共用一套固定事件。
模型事件的發送與接收還應遵循以下規則:
媒體發送控制只控制媒體傳輸。模型響應取消、輪次提交等行為仍需使用目標模型的事件協議。
前提條件
- 已完成接入概覽中的準備工作,並確認目標模型、地域和 AOQ 支持範圍。
- 已從 SDK 下載導入對應平台 SDK;使用 Opus 時,導入對應插件。
- 業務 AppServer 已實現 Token 鑒權。API Key 保存在 AppServer,客戶端使用臨時連接憑證。
僅在需要採集時申請麥克風或攝像頭權限。例如,語音合成不需要這兩項權限。
整體流程

- 客戶端通過業務 AppServer 獲取連接憑證。
- 創建 SDK 引擎並註冊回調。
- 配置媒體和 Data 軌道,關閉上行媒體發送。
- 建立 AOQ 連接,等待連接成功。
- 按模型協議完成配置,收到確認後開啓所需媒體發送。
- 完成交互後斷開連接並釋放資源。
- 音視頻媒體數據由 AOQ SDK 接管,負責採集、處理、發送、接收和播放;Data 數據需要調用方遵循目標模型的事件定義進行發送和接收。
-
連接成功表示與模型的傳輸通道已建立。如果業務需要配置音色等前置操作,應先完成模型配置,再啟動媒體發送。例如,Realtime 模型需要等待
session.updated,Inference 模型需要等待task-started。因此,客戶端應在模型初始化成功後,才能開啟所需的上行媒體。
1. 獲取連接憑證
客戶端向業務 AppServer 請求憑證。AppServer 根據目標模型選擇 Realtime 或 Inference 建連地址,並攜帶 API Key 和 x-dashscope-rtc-transport: moq 請求網關。完整地址、請求和字段說明見 Token 鑒權。
將響應映射到 AoqConnectConfig:
| 網關響應 | SDK 配置 |
|---|---|
aoqTokenForClient | token |
sid | sid |
clientRelayCertFingerprint | certFingerprint |
clientRelayEndpoints | relayEndpoints,按結構轉換各接入點 |
extraInfo.workspaceIdHash | workspaceIdHash |
2. 初始化 SDK 並註冊回調
創建引擎並註冊連接狀態、Data 消息和錯誤回調。以 iOS Swift 為例:
AoqEngineDelegate,在 onConnectionStatusChange 中維護連接狀態,在 onDataMsg 中解析目標模型事件,在 onError 中處理 SDK 錯誤。模型返回的錯誤事件也需要在 Data 消息處理邏輯中單獨處理。SDK 接口及錯誤說明請參見 AOQ 客戶端 SDK。
3. 配置 SDK
選擇四個媒體方向
以下“推”和“拉”均以客戶端為視角。按業務實際使用的輸入、輸出模態配置,不需要的方向不添加媒體軌道。
| 方向 | 配置內容 | 典型用途 |
|---|---|---|
| 推音頻 | 發佈 Audio 軌,設置音頻編碼器,配置內置或外部採集 | 語音識別、語音對話、語音翻譯 |
| 拉音頻 | 訂閱 Audio 軌,設置音頻解碼器,配置播放器或外部播放 | 語音合成、語音回復 |
| 推視頻 | 發佈 Video 軌,配置攝像頭或外部視頻輸入及編碼參數 | 向支持視覺輸入的模型發送畫面 |
| 拉視頻 | 僅當目標模型/應用明確支持視頻輸出時配置訂閱及接收處理 | 以目標模型/應用文檔為準 |
各模型如何選擇
下表是典型場景的媒體配置建議。具體模型及版本的支持範圍以 Realtime API 概述和模型文檔為準。
| 模型/應用 | 推音頻 | 拉音頻 | 推視頻 | 拉視頻 |
|---|---|---|---|---|
| Qwen-Omni-Realtime | 語音輸入時開啓 | 需要語音回復時開啓 | 需要視覺輸入時開啓 | 不支持開啓 |
| Qwen-Audio-Realtime | 語音對話時開啓 | 需要語音回復時開啓 | 不支持開啓 | 不支持開啓 |
| Qwen-Audio-TTS、CosyVoice | 不支持開啓 | 開啓 | 不支持開啓 | 不支持開啓 |
| Qwen-Audio-ASR-Streaming、Qwen-Audio-ASR-Message | 開啓 | 不支持開啓 | 不支持開啓 | 不支持開啓 |
| Fun-ASR-Realtime | 開啓 | 不支持開啓 | 不支持開啓 | 不支持開啓 |
| Qwen-LiveTranslate-Realtime | 語音輸入時開啓 | 需要語音譯文時開啓 | 按所選版本及場景配置 | 不支持開啓 |
| multimodal-dialog | 按應用輸入配置 | 按應用輸出配置 | 按應用能力配置 | 僅在應用明確支持時配置 |
配置媒體參數和軌道
音頻上行和下行應分別配置:上行使用 setAudioEncoderConfig,下行使用 setAudioDecoderConfig。這些參數用於網絡傳輸,網關會將音頻轉換為模型所需的格式。傳輸編碼配置與模型事件中的音頻格式參數應分別按 SDK 和目標模型的要求設置。
按方向啓動 startAudioCapture、startAudioPlayer 或 startVideoCapture。自定義輸入輸出見下文高階能力。
publishTracks 表示客戶端發送的軌道,subscribeTracks 表示客戶端接收的軌道:
| 場景 | publishTracks | subscribeTracks |
|---|---|---|
| 語音對話 | Audio、Data | Audio、Data |
| 帶畫面輸入的語音對話 | Audio、Video、Data | Audio、Data |
| 語音識別 | Audio、Data | Data |
| 語音合成 | Data | Audio、Data |
4. 建立連接
將憑證與軌道配置填入 AoqConnectConfig,調用:
onConnectionStatusChange 返回 .connected,再進入模型初始化流程。connect 調用返回不等於連接成功。
5. 按模型協議交互並收發媒體
發送和解析模型事件
客戶端通過 Data 軌發送事件。iOS Swift 示例:
onDataMsg 中解析回復。不要統一假定事件類型位於 type:Realtime 事件通常使用 type,Inference 服務端事件使用 header.event。完整字段、參數及結束條件應遵循目標模型文檔。
就緒後開啓所需媒體
滿足當前模型、當前會話或任務的就緒條件後,僅開啓已配置的上行方向。例如,需要語音輸入時調用:
.video。TTS 場景輸入文本,無需開啓上行音視頻。
音視頻通過對應媒體軌道傳輸;模型事件和文本通過 Data 軌傳輸。例如,Omni 的 AOQ 接入無需使用 input_audio_buffer.append 或 input_image_buffer.append 重復發送媒體。下行音頻由已配置的播放器或外部播放邏輯處理。
6. 結束交互並釋放資源
不再使用連接時,由客戶端業務層調用AOQ SDK 的斷開連接和釋放資源接口:
Data 通道發送和接收事件
客戶端通過AOQ SDK 的 Data 軌發送和接收模型事件。連接時需要發佈和訂閱 Data 軌;發送時將模型事件序列化後放入 AoqDataMsg,調用 engine.send(msg);接收時在 onDataMsg 回調中解析消息。
發送事件的名稱、字段、參數和調用時機遵循目標模型的客戶端事件定義;收到消息後的解析方式、狀態變更、結果和錯誤處理遵循該模型的服務端事件定義。初始化事件根據模型要求按需發送,後續文本和控制事件按照業務需要發送。
| 模型/應用 | 客戶端事件定義(發送) | 服務端事件定義(接收) |
|---|---|---|
| Qwen-Omni-Realtime | 客戶端事件 | 服務端事件 |
| Qwen-Audio-Realtime | 客戶端事件 | 服務端事件 |
| Qwen-Audio-TTS、CosyVoice | 客戶端事件 | 服務端事件 |
| Qwen-Audio-ASR-Streaming | 客戶端事件 | 服務端事件 |
| Qwen-Audio-ASR-Message | 客戶端事件 | 服務端事件 |
| Fun-ASR-Realtime | 客戶端事件 | 服務端事件 |
| Qwen-LiveTranslate-Realtime | 客戶端事件 | 服務端事件 |
| multimodal-dialog | 交互協議中的 Input Message | 交互協議中的 Output Message |
-
按模型定義識別事件類型和關聯標識。例如,Realtime 事件通常使用
type;Inference 客戶端使用header.action、服務端使用header.event,通過task_id關聯任務。 - 模型要求的初始化確認、輸入提交、響應取消和任務結束等操作,均在 Data 通道中按對應協議處理;它們屬於模型交互語義,與斷開傳輸連接是不同操作。
-
例如,Inference 模型使用
finish-task結束任務,並通過task-finished確認任務結束;如需完整結果,應在收到剩餘結果後再釋放連接,需要完整播放時還應處理完本地待播音頻。 - 音視頻數據通過媒體軌道傳輸。引用模型事件文檔時,媒體封裝和可用交互模式仍遵循本文的接入方式,不直接套用 WebSocket 的媒體發送方式。
高階能力
| 能力 | 使用場景 | 文檔 |
|---|---|---|
| 獨立控制音視頻發送 | 等待模型就緒、暫停上行、按需開啓視頻 | 媒體流發送管理 |
| 音頻設備與處理 | 編解碼、揚聲器、文件混音、音頻幀回調 | 音頻常用功能 |
| 外部音頻輸入 | 使用業務側音頻源 | 自定義音頻採集 |
| 外部音頻輸出 | 由業務側處理或播放輸出音頻 | 自定義音頻播放 |
| 視頻採集與輸入 | 攝像頭及業務側畫面輸入 | 視頻常用功能、自定義視頻輸入 |
最佳實踐
- Omni 實時通話:音視頻輸入、語音回復和會話事件。
- Omni 按鍵語音對話:按鍵控制輸入及手動輪次。
- Qwen-Audio 實時語音對話:雙向音頻交互。
- Qwen-Audio 語音合成:Data 軌輸入文本,Audio 軌輸出語音。
- Fun-ASR 實時語音識別:Audio 軌輸入語音,Data 軌輸出識別結果。