通過 AOQ 接入 fun-asr-realtime,發送麥克風音頻並即時接收語音辨識結果。用戶端代碼以 Android Java 為例,AOQ 支援的其他平台使用相同的介面。
方案概述
fun-asr-realtime 將音頻流即時轉寫為帶標點的文本。AOQ SDK 將媒體和事件分軌傳輸:用戶端通過 Audio 軌上行音頻,通過 Data 軌發送控制事件並接收識別事件。該模型使用 Inference 事件協議,而不是 Realtime 事件協議。
該方案適用於即時字幕、會議轉寫、語音輸入和智能助手。Audio 軌避免用戶端把音頻編碼成事件訊息,Data 軌則保留 run-task、result-generated 和 finish-task 等完整任務語義。
- 用戶端向業務 AppServer 請求臨時 AOQ 串連憑證。
- AppServer 使用 API Key 向百鍊申請 Token,並把串連欄位返回用戶端。
- 用戶端建立 AOQ 串連並發送 run-task;收到 task-started 後開始上行麥克風音頻。
- 服務端持續返回 result-generated;用戶端發送 finish-task 後等待最終結果和 task-finished。
準備工作
- 開通阿里雲百鍊,並按擷取與配置 API Key。API Key 只儲存在業務 AppServer,不要寫入用戶端代碼或提交到代碼倉庫。
- 根據業務部署地區確認 AOQ Endpoint。地區和接入地址的選擇方法請參見選擇地區、服務部署範圍和接入網域名稱。
- 從SDK 下載擷取最新版 AOQ Client SDK。本文傳輸 PCM 音頻,不需要額外整合 Opus 外掛程式。
- 搭建業務 AppServer,並按Token 鑒權實現 AOQ Inference 協議的服務端代理鑒權。每次建立新串連前,用戶端都應從 AppServer 擷取新的串連憑證。
匯入 SDK
根據開發平台選擇相應的 SDK 匯入方式。後續用戶端實現以 Android Java 為例;其他平台使用相同的介面設計和事件流程。
- Android
- iOS
- HarmonyOS
- Linux (Python)
- 將 AoqClientSdk-release.aar 放入 app/libs 目錄,並在 app/build.gradle 中配置依賴和 ABI:
- 在 AndroidManifest.xml 中聲明網路和錄音許可權:
- 在開始錄音前動態申請 RECORD_AUDIO 許可權。純語音辨識不需要 CAMERA 許可權。
體驗 Demo
阿里雲百鍊提供適用於 Android 平台的 Demo,可用於快速驗證 AOQ 接入效果。下載 APK 並配置 API Key 和 workspaceId 後,即可體驗部分模型。
掃描以下二維碼下載 Demo:

實現流程
- AppServer 使用 Inference Token 地址擷取 fun-asr-realtime 的 AOQ 串連參數。
- 用戶端把 Token 響應轉換為 AoqConnectConfig,發布 Audio 和 Data 軌,並訂閱 Data 軌。
- 用戶端按業務需求和模型要求配置音頻編碼參數,啟動麥克風採集但暫不發送音頻,然後建立 AOQ 串連。
- 串連成功後發送 run-task;收到 task-started 後開啟 Audio 軌發送。
- 用戶端在 onDataMsg 中處理 result-generated;結束錄音時先關閉 Audio 軌發送,再發送 finish-task。
- 收到 task-finished 後,可在同一串連上使用新的 task_id 發起下一輪識別,或中斷連線並銷毀引擎。

AppServer 擷取 Token
在 AppServer 設定 DASHSCOPE_API_KEY,並使用所選地區的 Endpoint 發送請求。clientIp 為終端的真實公網 IP;該欄位可選,但建議傳入,以便服務分配合適的 Relay 存取點。
響應欄位 | SDK 欄位 |
aoqTokenForClient | AoqConnectConfig.token |
sid | AoqConnectConfig.sid |
clientRelayCertFingerprint | AoqConnectConfig.certFingerprint |
clientRelayEndpoints | AoqConnectConfig.relayEndpoints |
extraInfo.workspaceIdHash | AoqConnectConfig.workspaceIdHash |
實現 Android 用戶端
以下步驟按串連和任務的實際執行順序拆分 Android Java 用戶端代碼。各片段來自後文的完整樣本。
1. 建立引擎並設定回調
建立 AOQ 用戶端引擎,並註冊串連狀態和 Data 軌事件回調。請根據商務邏輯實現回調處理;串連成功後再啟動識別任務。
2. 配置音頻編碼
配置發送給模型的音頻編碼。請根據業務需求和模型要求設定格式、採樣率和聲道數。以下代碼以 16 kHz 單聲道 PCM 為例;支援範圍請參見用戶端事件中的 run-task 參數。
3. 配置串連和傳輸軌道
使用 AppServer 返回的憑證配置 AOQ 串連,並根據業務需要選擇發布和訂閱的軌道。以下代碼為即時語音辨識發布 Audio 和 Data 軌,並訂閱 Data 軌。
4. 啟動音頻採集並建立串連
配置音頻採集方式並建立 AOQ 串連。請根據業務選擇內建或外部採集、是否啟用 VoIP 模式以及聲道數。收到 task-started 前保持 Audio 軌發送關閉。
5. 啟動識別任務
串連成功後產生任務 ID,並發送 run-task 啟動識別。請根據實際使用的模型和音頻輸入配置 model、format、sample_rate 及其他任務參數,完整說明請參見用戶端事件。
6. 處理服務端事件
處理任務狀態、識別結果和錯誤事件,並將結果傳遞給業務層。請根據應用的展示和狀態管理需求實現回調邏輯;收到 task-started 後再發送音頻,展示結果時過濾心跳事件。完整響應結構請參見服務端事件。
7. 結束識別任務
使用者結束本輪錄音時,停止音頻上行並發送 finish-task。保持串連直至收到最終識別結果和 task-finished;後續可按業務需要啟動新任務或釋放串連。事件格式請參見用戶端事件。
8. 中斷連線並銷毀引擎
頁面銷毀或不再需要識別時,釋放音頻採集、AOQ 串連和引擎資源。請根據應用生命週期決定釋放時機,不要在剛發送 finish-task 時立即釋放。
完整樣本
該 Android Java 類將 AppServer 返回的 JSON 轉換為 AoqConnectConfig,並組合前述串連、採集、任務和資源釋放邏輯。
調用樣本
將 AppServer 的 Token 響應傳給 parseConnectConfig,然後建立用戶端。首次串連成功後自動開始識別。停止按鈕只結束當前任務;頁面銷毀時才釋放串連和本地資源。
運行並驗證
- 啟動 AppServer,確認 Token 請求返回 HTTP 200,並包含 sid、aoqTokenForClient、clientRelayEndpoints、clientRelayCertFingerprint 和 extraInfo.workspaceIdHash。
- 在 Android 裝置上安裝並運行應用,授予麥克風許可權,然後說一段話。
- 觀察回調。正常事件順序如下:
典型情境
同一串連多次識別
收到 task-finished 後調用 beginRecognition,可在同一 AOQ 串連上啟動下一輪識別。每輪任務必須使用新的 task_id,不需要重新申請 Token 或重建串連;如果串連已經斷開,則需要重新擷取串連憑證。
Android 後台識別
Android 10 及以上版本中,如需在應用進入後台後繼續採集麥克風音頻,應使用 foregroundServiceType=microphone 的前台服務,並在應用仍對使用者可見時啟動該服務。
常見問題
問題 | 處理方法 |
串連失敗 | 確認 Token 尚未到期、Endpoint 與業務地區一致,並檢查 AppServer 是否傳入了終端真實公網 IP。串連斷開後不要複用舊 Token。 |
任務已啟動但沒有識別結果 | 確認收到 task-started 後才開啟 Audio 軌發送,並根據當前模型的用戶端事件檢查音頻格式、採樣率等輸入參數。 |
收不到最終結果 | 先關閉 Audio 軌發送,再發送 finish-task;等待最終 result-generated 和 task-finished,不要立即中斷連線。 |
Android 載入 SDK 失敗 | 確認 AAR 已加入依賴,並且應用只打包 SDK 支援的 armeabi-v7a 或 arm64-v8a ABI。 |
同一串連的下一輪任務被拒絕 | 確認上一輪已經收到 task-finished,並為新一輪 run-task 產生新的 task_id。 |