上篇(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就講完了。對核心降噪部分簡單總結下,先利用分位數噪聲估計法得到噪聲的初始估計並基於這個估計出來的噪聲算后驗信噪比和先驗信噪比,然后基於先后驗信噪比算似然比以及在帶噪語音和特征條件下得到語音和噪聲的概率,再利用得到的語音和噪聲的概率去更新噪聲的估計,從而得到更准確的噪聲估計,最后基於更新后的噪聲估計重新算后驗信噪比和先驗信噪比,根據基於先驗信噪比的維納濾波表達式去得到降噪后的語音。