天天看點

WebRTC 的回聲消除技術在 Android 可視對講程式中的應用

來源 http://www.qttaudio.com/webrtc-android.html

1 引言

随着移動互聯技術的成熟和發展,智能手機上基于無線網絡的可視對講功能的應用已經開始逐漸興起。在Android系統上的此類應用程式的開發過程中,都會遇到聲學回聲問題。由于AEC技術非常複雜,需要非常專業的聲學和音頻處理技術。WebRTC的釋出改變了這一局面。

2 WebRTC簡介

WebRTC是谷歌公司2011年釋出的一項技術。WebRTC技術主要用于在支援HTML5的浏覽器上實作實時音視訊對話。功能包括會話初始化協定SIP的實作、音視訊編解碼和音視訊資料處理等等。經過源代碼分析,将AEC部分的代碼單獨摘取出來,并編譯成動态連結庫,通過jni技術使Java代碼調用動态連結庫,實作高品質回聲消除。

3 WebRTC的AEC子產品實作原理

WebRTC的AEC子產品采用自适應濾波算法實作回聲消除。該算法以輸出到揚聲器的音頻資料為依據,根據現場的回聲路徑特征,模拟出回聲信号。以模拟回聲信号為依據,從麥克風采集到的音頻資料中濾除模拟回聲信号。算法的實作原理如圖1所示。y(n)代表遠端語音資料,y(n)在交給近端揚聲器播放的同時,還送到自适應濾波器,産生回聲估計值d^(n)。x(n)代表近端有用語音,麥克風采集的資料是x(n)和y(n)産生的回聲d(n)的疊加,即x(n)+d(n)。經濾波處理,最終近端語音資料為:u(n)=x(n)+d(n)-d^(n)。其中e(n)=d(n)-d^(n),稱為回聲消除誤差。理想狀态下,e(n)應為0。但現實中e(n)不可能為0。濾波器會根據e(n)的值自動調整濾波系數。

WebRTC 的回聲消除技術在 Android 可視對講程式中的應用

WebRTC 的回聲消除技術在 Android 可視對講程式中的應用

4 WebRTC的移植

我們将AEC子產品分成了兩個大塊,第一個大塊是音頻處理的通用子產品WebTRC_audio(該子產品編譯成功後生成“libwebrtc_spl.so”動态庫,供第二大塊調用),源代碼位于WebRTC源代碼根路徑下的“common_audio\signal_processing”中。第二大塊是WebRTC_aec(該子產品編譯成功後生成“libwebrtc_aec.so”動态庫),源代碼位于WebRTC源代碼根路徑下的“modules\audio_processing\aec”中。

如下是WebRTC_aec子產品的編譯腳本主要部分:

LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:=signal_prebuilt

LOCAL_SRC_FILES:=webrtc_signal/libwebrtc_spl.so

include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := libwebrtc_aec

LOCAL_SHARED_LIBRARIES := signal_prebuilt

include $(BUILD_SHARED_LIBRARY)

先看編譯腳本的前五行,定義了一個預編譯子產品,即WebRTC_

a u d i o 塊, 然後通過L O C A L _ S H A R E D _ L I B R A R I E S :=signal_prebuilt來導入該子產品。

5 應用層多線程實作回聲消除

如果想要成功消除回聲,必須将近端資料和遠端資料之間的時間差控制在合理範圍内。在Android應用開發中,使用AudioRecord進行音頻采集,使用AudiorTrack進行遠端音頻播放。協調好這兩個類的輸入輸出時間同步,是回聲消除功能實作的重要保障。為了保證時間上的連續性和時間差,需要使用兩個單獨線程ReadThread和WriteThread來分别進行音頻采集和音頻播放。另外還有兩個單獨的線程InTrhead和OutThread來完成資料的接收和發送,還有一個線程AecThread完成回聲消除操作。線程之間的資料交換使用隊列來完成。