1. 程式人生 > >webrtc語音增強處理演算法綜述

webrtc語音增強處理演算法綜述

    作為實時音視訊通訊框架的webrtc,裡面有著豐富的語音處理演算法,其中主要涉及到AEC(聲學回聲抑制),NS(噪音抑制),AGC(自增益控制),VAD(語活檢測)和CNG(舒適噪聲)等。語音處理資料分為近端和遠端,近端資料是採集到的音訊資料,遠端資料為接受到並播放的資料,一般演算法都是以遠端資料為參考,對近端資料,處理資料為pcm資料,支援8k、16k、32k和48k取樣。webrtc語音處理演算法大致順序示意圖如下:

                

    圖中實線標書資料處理,虛線表示引用,下面對每個演算法思想做一些簡單的介紹。

    先來看看回聲消除。播放的遠端語音,通過直接傳輸或者反射被mic採集成為近端聲音一部分,這部分訊號叫echo(回聲),所以從echo形成的原理來看,echo應該是近端採集訊號中與遠端訊號相關的訊號,也就是遠端訊號延時(時移)和衰減(權重)組合。AEC(Acoustic Echo Chancellor)亦即聲學回聲消除,其基本思想就是利用自適應濾波對裝置回聲系統進行辨識,也就是找出剛才說的時移和權重資訊,當系統穩定了,就可以通過遠端通過加權組合得到echo,然後近端訊號減去echo即為需要的近端語音訊號。webrtc中採用的是基於分段頻域NLMS(歸一化最小均方)自適應濾波演算法,可參考論文Partioned block frequeney domain adaptive filter(PBFDAF)。詳細可參考部落格

語音自適應回聲消除(AEC)演算法。我理解,aec應該需要一個DTD(Double Talk Detect),在沒有近端語音的時候,也就是此時mic採集到的訊號是回聲(可能有噪聲),這時候自適應濾波的理想訊號就是近端訊號,可以對自適應濾波器機型引數更新;當沒有遠端語音的時候,不做處理;當近端和遠端都有語音的時候,利用係數進行濾波。但是在我分析webrtc aec的原始碼時,並沒有看到DTD相關原始碼,不知道是不是我理解有誤(望博友指教)。webrtc自適應濾波結束後,還進行了NLP(非線性處理)濾波,將殘餘echo消除(這部分程式碼也不是很明確,大概是將比較弱的訊號剔除)。

    剛才說到了DTD,雙端語音檢測,我們順便來看webrtc VAD(Voice Activity Detect)。語活檢測就是檢測訊號中是否有語音存在。webrtc用的是混合高斯模型對語音和噪聲進行建模,通過模型計算出語音和噪聲的概率,然後通過似然比來對是否有語音進行判斷。VAD檢測用的是能量資訊,將訊號4khz以下部分分成六個子帶,並計算能量,對每一個子帶能量進行建模。每個模型中分為語音和噪聲模型,分別由兩個高斯分佈組成,所以一共有24高斯分佈(24組均值和方差),對每個模型引數具有初始化值。計算中,分為區域性和全域性似然比,如果某一個子帶似然比大於閾值,就認為有語音,或者似然比之和大於閾值也認為有語音。模型更新採用的是梯度下降法。更詳細可參考

WebRTC之VAD演算法高斯混合模型(GMM model)以及梯度下降法(gradient descent)更新引數

    現在我們來看看webrtc的NS(Noise Suppression),也就是降噪。降噪就是從給定的觀察到資料裡面,估計出噪聲,然後將噪聲部分剔除。這有點像兩種墨水混合在一起,要分開他們的意思,難度比較大,既然要分開他們,必須有可區分特徵可用才能區分,webrtc用的區分特徵是似然比、頻譜平坦度和頻譜模板差異度,通過對映函式將特徵轉換成概率模型。因為訊號短時平穩,假設語音和噪聲都符合高斯分佈,對訊號進行分位數初始噪聲估計(這一塊演算法不是很清楚),然後可以得到後驗信噪比,通過DD決策,得到先驗信噪比,將以上資訊組合,利用貝葉斯方程,可以計算出語音和噪聲的後驗概率,然後利用後驗對噪聲進行更新,這樣估計出噪聲,再用維納濾波器將噪聲去除。不管是VAD還是NS都有對噪聲的初始假設,也就是是噪聲的先驗概率,所以演算法效能受限於此(VAD是固定初始化,NS是分位數估計初始化,不知道理解正確不,忘博友指正)。詳細可參考

WebRTC之noise suppression演算法

    最後我們看看AGC和CNG。AGC(Automatic Gain Control)就是對訊號的幅度自動增益控制,根據訊號的快慢包絡,得到對應的增益,然後對訊號進行增益處理。由於人耳對不同頻率增益敏感度不一樣,在處理的時候需要基於等響曲線的非線性增益表來獲得不同頻點的增益。CNG(Comfortable Noise Generate)舒適噪聲生成,這個主要用在通訊沒有聲音的時候,產生一個舒適噪聲,既可以降低頻寬,有不能讓對方感覺已經斷線,平時微信語音對方不說話的時候裡面聽到的斯斯生就是舒適噪聲,舒適噪聲生成演算法可參考部落格舒適噪聲生成演算法及其實現