文章目錄
- 安卓可用的回聲消除手段
- 各種回聲消除技術優缺點
- WebRTC回聲消除
- WebRTC
- 回聲消除
- 回聲消除處理流程
- WebRTC AECM
- APP
安卓可用的回聲消除手段
- 硬件回聲消除
使用 AudioRecord 的 VOICE_COMMUNICATION 模式:通過 AudioRecord 的 VOICE_COMMUNICATION 音頻源可以直接啟用硬件級別的回聲消除功能。這種方式簡單且兼容性好,因為它依賴于 Android 系統底層的回聲消除算法。不過,使用時音頻采樣率通常需設置為 8000 或 16000Hz,通道數設為 1 個。 - Android 系統回聲消除API
使用 Android 自帶的 AcousticEchoCanceler:Android SDK 提供了 AcousticEchoCanceler 類,可在軟件層面進行回聲消除。使用時,需先通過 AudioRecord 獲取 AudioSessionId,在創建 AudioTrack 時傳入相同的 AudioSessionId,最后將此 AudioSessionId 用于 AcousticEchoCanceler 的創建和配置。但這種方式支持的設備可能有限,例如 Nexus 5 支持該方式。 - 免費第三方庫
當 Android 自帶的回聲消除效果不滿足需求時,可考慮使用 Speex、WebRTC 等第三方庫。這些庫提供了豐富的音頻處理功能,包括回聲消除。使用時,需將采集到的音頻數據和播放的音頻數據分別作為源數據和參考數據傳入庫中,并設置合適的延時間隔。不過,設置合適的延時間隔可能較困難,有時設置好后,通話一段時間效果可能會變差。 - 付費第三方庫
阿里云音視頻通信 RTC,即構科技 Purio AI 音頻引擎,網易云信音視頻通話 SDK,擎聲科技QttAudio,騰訊云TRTC等。
各種回聲消除技術優缺點
回聲消除技術 | 優點 | 缺點 |
---|---|---|
硬件回聲消除 | 處理高效、穩定,延遲低 | 成本高,靈活性差,可能有兼容性問題 |
Android 系統回聲消除 API | 使用方便,與系統集成好,免費 | 功能有限,可定制性差,依賴系統更新 |
WebRTC | 開源跨平臺,算法強,實時性好 | 集成難,可能耗資源,有兼容性問題 |
Speex | 輕量高效,開源可定制,支持多格式 | 回聲消除能力有限,實時性欠佳,文檔及社區支持弱 |
付費庫 | 專業,可定制,有技術支持 | 有成本,集成復雜,對平臺有依賴 |
WebRTC回聲消除
WebRTC
WebRTC是一個由谷歌主導開發的開源項目,其目標是通過簡單的API,實現實時通信(RTC)。WebRTC項目包含了多個處理音視頻通訊問題的模塊,其中就包括了一個性能優異的回聲消除(AEC)模塊。
回聲消除
WebRTC 的回聲消除系統主要包含聲學回聲消除(AEC)模塊、語音活動檢測(VAD)模塊、舒適噪聲生成(CNG)模塊等。其中,AEC 模塊是核心,負責回聲的識別和消除;VAD 模塊用于判斷當前是否有語音活動,輔助 AEC 模塊進行處理;CNG 模塊則在無語音時生成舒適噪聲,提升用戶體驗。
回聲消除處理流程
- 信號采集:通過麥克風采集近端語音信號,同時獲取揚聲器播放的遠端語音信號作為參考信號。
- 自適應濾波:使用自適應濾波器對參考信號進行濾波,得到模擬回聲信號。
- 回聲消除:將模擬回聲信號從麥克風采集的信號中減去,得到初步估計的純凈語音信號。
- 雙講檢測與處理:利用 VAD 模塊檢測是否處于雙講狀態,并根據檢測結果調整自適應濾波器的參數。
- 回聲抑制和非線性處理:對初步估計的純凈語音信號進行回聲抑制和非線性處理,進一步提高語音質量。
- 輸出處理后的語音信號:將經過處理的語音信號進行編碼和傳輸。
WebRTC AECM
WebRTC AECMj是從開源項目WebRTC提取并優化的聲學回聲消除(AEC)模塊,專為移動設備設計。它旨在為開發者提供一個高效、可靠的解決方案,以消除通話中的回聲干擾,提升用戶體驗。
源碼:
https://github.com/cpuimage/WebRTC_AECM
訪問不了就用這個:
https://gitcode.com/gh_mirrors/we/WebRTC_AECM
主要的函數接口
// 創建一個 AECM(Acoustic Echo Canceller Mobile,移動聲學回聲消除器)實例
// WebRtcAecm_Create 函數用于分配并初始化一個 AECM 實例
// 該函數返回一個指向 AECM 實例的指針,后續的操作都將基于這個實例進行
WebRtcAecm_Create();// 初始化 AECM 實例
// aecmInst 是通過 WebRtcAecm_Create 函數創建的 AECM 實例指針
// sampleRate 是音頻的采樣率,單位為 Hz,例如 8000、16000 等
// 該函數將使用指定的采樣率對 AECM 實例進行初始化,使其能夠正確處理音頻數據
WebRtcAecm_Init(aecmInst, sampleRate);// 設置 AECM 的配置參數
// aecmInst 是 AECM 實例指針
// config 是一個包含 AECM 配置信息的結構體
// 通過設置不同的配置參數,可以調整 AECM 的工作模式、性能等,以適應不同的應用場景
WebRtcAecm_set_config(aecmInst, config);// 緩存遠端音頻數據
// aecmInst 是 AECM 實例指針
// far_input 是一個指向遠端音頻數據的指針,即揚聲器播放的音頻數據
// samples 是遠端音頻數據的樣本數量
// 該函數將遠端音頻數據緩存到 AECM 實例中,以便后續進行回聲消除處理
WebRtcAecm_BufferFarend(aecmInst, far_input, samples);// 執行回聲消除處理
// aecmInst 是 AECM 實例指針
// near_input 是一個指向近端音頻數據的指針,即麥克風采集的音頻數據
// NULL 表示不使用額外的參考信號
// out_buffer 是一個指向輸出緩沖區的指針,用于存儲經過回聲消除處理后的音頻數據
// samples 是近端音頻數據的樣本數量
// 140 是回聲延遲的估計值,單位為樣本,用于更準確地進行回聲消除處理
WebRtcAecm_Process(aecmInst, near_input, NULL, out_buffer, samples, 140);
主要回聲消除函數就是上面介紹的這幾個,如果要放到Android上調,就要把這幾個包成jni的形式。
在c/c++下怎么進行回聲消除,在上面git源碼中的main.cc中會有實例。
網上也有已經包裝好jni的git源碼
比如https://github.com/theeasiestway/android-webrtc-aecm
APP
如果只是體驗一下在安卓上的效果,可以直接下載別人編譯的測試APP,
Android App下載地址:
https://gitcode.net/techinged/share/-/raw/master/android/echo_cancel/webrtc_echo_cancel(Android).zip
作者:帥得不敢出門