webRTC中語音降噪模組ANS細節詳解(四)

上篇(webRTC中語音降噪模組ANS細節詳解(三))講了雜訊的初始估計方法以及怎麼算先驗SNR和後驗SNR。 本篇開始講基於帶噪語音和特徵的語音和雜訊的概率計算方法和雜訊估計更新以及基於維納濾波的降噪。

 

一, 帶噪語音和特徵條件下的語音概率

先看怎麼算帶噪語音和特徵條件下的語音概率。其中會用到先前算好的先驗SNR和後驗SNR,也會用到特徵條件下的語音概率,從而涉及到怎麼算特徵條件下的語音概率,有了特徵條件下的語音概率後結合先前算好的先驗SNR和後驗SNR帶噪語音和特徵條件下的語音概率就好算了。

1,  帶噪語音和特徵條件下的語音概率

令H1(k, m)表示第m幀的第k個頻點上是語音狀態,表示H0(k, m)第m幀的第k個頻點上是雜訊狀態,Y(k,m)表示第m幀的第k個頻點上的幅度譜,{F}表示特徵集合。為方便書寫,簡寫為H1、H0、Y和F。P(H1 | Y F)表示在帶噪語音和特徵條件下是語音的概率,其他類推。因為只有語音和雜訊兩種類型,所以有式1和2(P(•)表示概率):

                                (1)

                                  (2)

對式1展開得式3:

                      (3)

因為

所以得到式4:

               (4)

還可得到式5:

                                   (5)

 

在帶噪語音和特徵條件下是語音的概率為P(H1 | YF) ,把式4和5帶入得到式6:

                                               (6)

在式2中,令P(H1 | F) = q(k, m),這裡簡計為q,則P(H0| F) = 1 – q。

再令Δ(k, m) =  為似然比, 所以得到式7:

                                                                   (7)

看怎麼求似然比。這裡會用到復高斯分布,先了解一下什麼是復高斯分布。假設實隨機高斯變數x和y的均值分別為mx與my,方差為σ2,則x的概率密度函數為

y的概率密度函數為

若x與y相互獨立,則x與y的聯合概率密度函數為

定義 z = x + iy,則z為復高斯隨機變數。求z的均值和方差如下(E(•)表示期望):

對於乾淨語音和雜訊來說,轉換到頻域後是複數,一般假設服從零均值的復高斯分布,所以

 mz= 0, 從而 mx + imy= 0,所以 mx = 0,my = 0。

把mx = 0,my = 0以及σ2 z = 2σ2帶入,得到

這就是乾淨語音和雜訊的概率密度函數。

在H0下(即雜訊下),Y(k,m) = N(k,m),由於雜訊服從均值為0的復高斯分布,可得f(Y | H0)為與雜訊有相同方差的高斯分布,所以在雜訊條件下帶噪語音的條件概率密度函數表示如式8:

                                        (8)

在H1下(即語音下),Y(k,m) = S(k,m) + N(k,m),由於語音和雜訊均服從均值為0的復高斯分布,以及S(k,m)和N(k,m)相互獨立,可得f(Y | H1)也為高斯分布,方差為語音和雜訊的方差和,所以在語音條件下帶噪語音的條件概率密度函數表示如式9:

         (9)

所以

軟體實現時同計算先後驗信噪比一樣,用幅值代替能量,從而

用上篇(webRTC中語音降噪模組ANS細節詳解(三))計算出的先驗信噪比和後驗信噪比表示就可以寫成式10:

                                 (10)

為方便計算,對似然比取自然對數得到式11:

                       (11)

軟體實現時,沒有嚴格按照這個表達式來,而是用2ρ(k, m)代替了ρ(k, m), 用(1+ σ(k, m))代替了σ(k, m)。所以式11變成了式12:

        (12)

為了防止幀間頻變導致似然比波動較大,對似然比進行了平滑,並將式12帶入得到表達式13(為平滑係數):

        (13)

ln(Δ(k,m))能算出,取自然指數就算出Δ(k,m)了。回看在帶噪語音和特徵條件下算語音的概率如式7:

Δ(k,m)已算出,只要再算出q(q = P(H1 | F) ,特徵條件下是語音的概率),就可算出在帶噪語音和特徵條件下的語音概率了。下面看怎麼算在特徵條件下語音的概率。

 

2, 特徵條件下的語音概率

webRTC用到的特徵有似然比檢驗(Likelihood Rate Test, LRT)均值、頻譜平坦度(Spectral Flatness)和頻譜模板差異度(Spectral Difference)。先看這些特徵,然後看怎麼算在這些特徵條件下的語音概率。

1) LRT均值特徵

似然比Δ(k,m)上面已算出,定義F1為LRT均值特徵,如下式14:

                  (14)

N為頻點數,當取樣率為16k HZ時,N = 129,下同。

 

2) 頻譜平坦度特徵

語音比雜訊的諧波多,其表現是語音頻譜通常在基頻和諧波中出現能量峰值,而雜訊頻譜則相對平坦,因此頻譜平坦度可以區分語音和雜訊。定義F2為頻譜平坦度特徵,頻譜平坦度演算法是幾何平均除以算術平均,計算如式15:

                                                         (15)       

由於不太方便計算,軟體實現時先取對數,變成加法運算,加法算好後再取指數從而得到幾何平均,具體如下,令

 

所以

算出F2後還要做一個平滑處理。

 

3)頻譜模板差異度特徵

先定義五個變數:avgMagn/varMagn (magnitude的均值和方差均值)和avgPause/varPause(conservative noise spectrum的均值和方差均值),以及covMagnPause(magn和pause的協方差均值)

 

定義F3為頻譜模板差異度特徵,表達式如式16:

                         (16)

同頻譜平坦度一樣,最後也要做一個平滑。

三個特徵得到後,特徵條件下的語音概率P(H1 | F)或者q(k, m)的更新模型可用式17表示:

                                     (17)

其中β為平滑係數,M(F)為映射函數,宜用非線性函數,如人工智慧(AI)中常用做激活函數的S函數(sigmoid)和雙曲正切(tanh)等,因為它們都把函數的取值範圍壓在了(0, 1)或者(-1, 1)範圍內。映射函數根據特徵、閾值和寬度參數,將頻點劃分為語音(M接近1)或者雜訊(M接近0)。WebRTC中用的是tanh。這裡簡單說一下tanh,它的定義式如下:

 

可以證明它的取值範圍是(-1, 1), 並且是單調遞增的。tanh的波形圖如下圖:

實現中M(F) = 0.5 * [tanh(ω*|F – T|) + 1.0],因為tanh的取值範圍是(-1, 1),所以M(F)的取值範圍是(0,1)。這裡F表示特徵,T是閾值,參數ω代表映射函數的形狀和寬度。當有多個特徵後,每個特徵都有一定的權重,這時q(k, m)的更新模型變為式18:

        (18)

再回看在帶噪語音和特徵條件下算語音的概率如式7:

似然比Δ(k,m)已求出,特徵(F1/F2/F3)條件下語音的概率q(k, m)也求出,在帶噪語音和特徵條件下算語音的概率P(H1 | YF)就算出來了,程式碼如下:

q = inst->priorSpeechProb, Δ = inst->logLrtTimeAvg

根據程式碼,

 

所以語音概率,跟式7是一致的。 

P(H1 | YF)求出,在帶噪語音和特徵條件下雜訊的概率P(H0 | YF) = 1 – P(H1 | YF) 也就求出來了。

 

二,雜訊估計更新

在帶噪語音和特徵條件下語音和雜訊的概率求出來後就可以去更新雜訊的估計了(因為先前的估計是初始估計,不太准)。表達式如式19:

   (19)

其中N(k, m)為本幀將要估計出來的雜訊,N(k, m-1)為上幀已估計出來的更新過的雜訊,Y(k,m-1)為本幀帶噪的語音,γ為平滑係數,P(H1 | YF)為是語音的概率,P(H0 | YF)為是雜訊的概率。

 

三,基於維納濾波降噪

因為估計出來的雜訊更新了,應該是雜訊估計的更准了,有必要重新算一下先驗信噪比和後驗信噪比。計算方法依舊是用webRTC中語音降噪模組ANS細節詳解(三)中提到的方法,這裡再把數學表達式列一下:

利用後驗信噪比和DD方法算先驗信噪比:

webRTC中語音降噪模組ANS細節詳解(一)中講過,維納濾波的標準表達式是式20:

                                            (20)

具體軟體實現時對對H(k, m)做了一定的改進,如式21:

                                            (21)

即用β替代1。β是根據設定的降噪程度來取值的,設定的降噪程度越厲害,β取值越大。同時對H(k, m)做一定的防越界處理,最大值是1(即不降噪),最小值也是根據設定的降噪程度來取值的,比如取0.5。算出的H(k, m)保存在數組inst->smooth里。

 

得到H(k, m)後,降噪後的語音就可以利用表達式 S(k, m) = H(k, m)Y(k,m)求出來了。

 

至此webRTC里的ANS就講完了。對核心降噪部分簡單總結下,先利用分位數雜訊估計法得到雜訊的初始估計並基於這個估計出來的雜訊算後驗信噪比和先驗信噪比,然後基於先後驗信噪比算似然比以及在帶噪語音和特徵條件下得到語音和雜訊的概率,再利用得到的語音和雜訊的概率去更新雜訊的估計,從而得到更準確的雜訊估計,最後基於更新後的雜訊估計重新算後驗信噪比和先驗信噪比,根據基於先驗信噪比的維納濾波表達式去得到降噪後的語音。