1. 程式人生 > >Android回聲消除功能實現(原始碼、編譯)

Android回聲消除功能實現(原始碼、編譯)

好久沒寫部落格了,今天抽空把這段時間對Android平臺回升消除模組的研究進行一下總結。不要心急哦,下面我會把這個專案的原始碼都開放出來的。

一、回聲消除介紹

傳統的回聲消除都是採用硬體方式,在硬體電路上整合DSP處理晶片,如我們常用的固定電話、手機等都有專門的迴音消除處理電路,而採用軟體方式實現回聲消除一直存在技術難點,包括國內應用最廣泛的QQ超級語音,便是採用國外的GIPS技術,由此可見一般。

回聲消除已經成為即時通訊中提供全雙工語音的標準方法。聲學回聲消除是通過消除或者移除本地話筒中拾取到的遠端的音訊訊號來阻止遠端的聲音返回去的一種處理方法。這種音訊的移除都是通過數字訊號處理來完成的。回聲消除技術是數字訊號處理的典型應用之一。

二、實現思路

想要實現aec功能主要有三個切入點:

  • AcousticEchoCanceler(API4.1提供,部分手機不支援)
  • AudioSource.VOICE_COMMUNICATION(使用voip通道錄音,不靠譜)
  • webrtc(業界有名的回聲消除庫,支援跨平臺,難點是計算delay時間)

綜合以上情況,所以我是以webrtc為主,系統api為輔的方式來實現aec效果。

三、除錯方法

1.獲取計算delay時間的pcm檔案

修改專案中的com.android.aec.conf.PluginConfig.AECDebug = true;
將會開啟除錯模式,在除錯模式下進行的所有測試都會在手機的sdcard根目錄下生成debug_out.pcm(回聲消除後的資料)/debug_far.pcm(播放的資料)/debug_near.pcm(mic採集的資料)檔案。

2.對比檔案估計delay值

使用工具GoldWave工具開啟debug_far.pcm、debug_near.pcm檔案,將時間座標放大,找到兩個波形相似的地方,找到一個起始點,如圖,我們發現record.pcm的波形起始時間為0:09:80,而play.pcm波形的起始時間為0:09:65,我們就可以近似的得到兩個波形的時間差為150ms。
實際的這個值並不是準確的值,只是一個大概的預估值。
這裡寫圖片描述

四、重點來了

注意:經過了幾個月的不斷除錯,終於把這個功能完成了,效果也是不錯的,也有實際專案在使用。