語音增強的整個過程,通常假設噪聲為加性隨機平穩噪聲,且語音短時平穩,下面的原理描述中,都是在這兩個假設前提之下來做的。整個語音增強的流程大致可以分為兩大部分
一、噪聲估計
二、衰減因子(有的地方也叫做增益因子)的計算
最后,把衰減因子應用於帶噪語音,就可以得到我們期望的“純凈語音”。語音增強最難的部分,應該是噪聲估計,而不是衰減因子的確定。因些這里重點說下噪聲估計部分,要進行噪聲估計的話,先要了解帶噪語音的特點,根據這些特點進行噪聲的估計,那么,帶噪語音都有哪些特點呢?
(1)噪所對語音頻譜的影響在頻率上是不均勻的,有的頻譜區域影響大,有的頻譜區域影響小,很自然就可以想到,可以利用各頻帶來估計噪聲,當特定頻帶的信噪比或者語音存在概率比較低時,可以獨立更新噪聲譜,這就是時間遞歸平均型噪聲估計算法的出發點
(2)即便是在語音活動期間,單個頻帶的帶噪語音功率通常都會衰減到噪聲的功率水平,這是最小值跟蹤噪聲估計算法的出發點。通過在每個頻帶跟蹤帶噪語音功率的最小值,可以得到該頻帶噪聲水平的一個粗略估計。
speex使用的噪聲估計算法結合了這兩個特性,我們分別說下根據上面兩個特性延伸出來的兩個噪聲估計算法:最小值跟蹤、時間遞歸平均。先說下最小值跟蹤噪聲估計算法,這類估計算法主要有三種:最小值統計、最小值搜索、連續譜最小值跟蹤。
最小值統計算法是通過統計過去D幀的各頻點最小值、計算相應的偏差因子來估計噪聲的,具體內容請參考論文:Noise Power Spectral Density Estimation Based on Optimal Smoothing and Minimum Statistics。這里不再詳細闡述。
最小值搜索是以遍歷的方式查找過去D幀各頻點的最小值來估計噪聲的,這種方法有的地方也稱為最小值查找
連續譜最小值跟蹤具體內容請參考一個頻域語音降噪算法實現及改進方法中的內容,這里同樣也不再詳述。
下面再說下時間遞歸平均型噪聲估計算法。這種方法是要用以下的通用形式來估計噪聲
\[\hat \sigma _d^2(\lambda ,k) = \alpha (\lambda ,k)\hat \sigma _d^2(\lambda - 1,k) + [1 - \alpha (\lambda ,k)]|Y(\lambda ,k){|^2}\]
這里lamda表示幀數,k表示頻點索引,Y表示頻域的帶噪語音譜,sigma表示噪聲譜,alpha表示平滑因子,這類噪聲估計算法就是要求出時頻相關平滑因子,然后就可以用上式來估計噪聲,平滑因子可以基於信噪比來求,也可以是一個固定的值。但更常用的是基於頻點k處語音存在或不存在的概率來計算,隨后可以看到這個平滑因子與語音存在概率之間的關系。
先簡單說下基於信噪比的遞歸平均噪聲估計算法,他的主要思想是,當信噪比大時(表示有語音的可能性大),使平滑因子趨向於1,即傾向於使用前一幀的噪聲來做為當前幀的噪聲估計,當信噪比小時(表示沒有語音,全是噪聲可能性大),使平滑因子趨向於0,表示盡可能的用當前幀的功率來做為噪聲估計。這種方法主要工作考慮是如何在信噪比與平滑因子之間建立函數關系或者分段函數關系。
再重點說下基於信號存在概率的遞歸平均算法。我們先看把條件概率引入時,計算噪聲的方式如何變化,我們首先把噪聲功率譜密度表示為
\[\sigma _d^2(\lambda ,k) = E\{ |D(\lambda ,k){|^2}\} \]
那么,在最小均方誤差意義上最優的噪聲功率譜密度可以表示為
\[\sigma _d^2(\lambda ,k) = E[\sigma _d^2(\lambda ,k)|Y(\lambda ,k)] = E[\sigma _d^2(\lambda ,k)|{H_0}]P({H_0}|Y(\lambda ,k)] + E[\sigma _d^2(\lambda ,k)|{H_1}]P({H_1}|Y(\lambda ,k))\]
也就是說,當引入概率時,噪聲功率譜密度可以由帶噪語音譜在頻點k不存在語音的條件概率和存在語音的條件概率分別對不存在語音條件下的噪聲功率譜密度、存在語音條件下的噪聲功率譜密度進行加權、然后求和得到。
我們可以根據貝葉斯定理很容易的計算上面式子中的兩個條件概率。如下所示
\[\begin{array}{l}
r \buildrel \Delta \over = P(H_1^k)/P(H_0^k) \\
\Lambda (\lambda ,k) \buildrel \Delta \over = \frac{{P(Y(\lambda ,k)|H_1^k)}}{{P(Y(\lambda ,k)|H_0^k)}} \\
P(H_0^k|Y(\lambda ,k)) = \frac{{P(Y(\lambda ,k)|H_0^k)P(H_0^k)}}{{P(Y(\lambda ,k)|H_0^k)P(H_0^k) + P(Y(\lambda ,k)|H_1^k)P(H_1^k)}} = \frac{1}{{1 + r\Lambda (\lambda ,k)}} \\
P(H_1^k|Y(\lambda ,k)) = \frac{{r\Lambda (\lambda ,k)}}{{1 + r\Lambda (\lambda ,k)}} \\
\end{array}\]
上面的4個式子中,第一個式子r表示存在語音的先驗概率與不存在語音的先驗概率之比、第二個式子被稱為似然比。第三個式子和第四個式子分別代表頻點k不存在語音的條件概率、頻點k存在語音的條件概率。把上面的兩個條件概率代入到求噪聲功率譜密度的式子中,得到新的噪聲功率譜密度估計
\[\sigma _d^2(\lambda ,k) = \frac{1}{{1 + r\Lambda (\lambda ,k)}}E[\sigma _d^2(\lambda ,k)|{H_0}] + \frac{{r\Lambda (\lambda ,k)}}{{1 + r\Lambda (\lambda ,k)}}E[\sigma _d^2(\lambda ,k)|{H_1}]\]
當頻點k不存在語音時,我們可以將不存在語音條件下的噪聲功率譜均值用當前頻點的短時功率譜近似、當頻點k存在語音時,我們可以將存在語音條件下的噪聲功率譜均值近似為前一幀的噪聲估計,如下所示:
\[\begin{array}{l}
E[\sigma _d^2(\lambda ,k)|{H_0}] \Rightarrow |Y(\lambda ,k){|^2} \\
E[\sigma _d^2(\lambda ,k)|{H_1}] \Rightarrow \sigma _d^2(\lambda - 1,k) \\
\end{array}\]
這樣,估計噪聲就變成了如下的形式
\[\sigma _d^2(\lambda ,k) = \frac{{r\Lambda (\lambda ,k)}}{{1 + r\Lambda (\lambda ,k)}}\sigma _d^2(\lambda - 1,k) + \frac{1}{{1 + r\Lambda (\lambda ,k)}}|Y(\lambda ,k){|^2}\]
對比上述的遞歸表達式與時間遞歸平均噪聲估計的通用形式可以發現,時頻相關平滑因子alpha在意義上代表頻點k存在語音的條件概率。即:
\[\begin{array}{*{20}{c}}
{\alpha (\lambda ,k) = \frac{{r\Lambda (\lambda ,k)}}{{1 + r\Lambda (\lambda ,k)}}} & {1 - \alpha (\lambda ,k) = \frac{1}{{1 + r\Lambda (\lambda ,k)}}} \\
\end{array}\]
也就是說,平滑因子是似然比的函數,並與語音存在的概率相關,當頻點k存在語音的條件概率越大時,越傾向於使用前一幀的噪聲估計,相當於越傾向於停止噪聲估計。反之,就越傾向於繼續使用當前頻點k的功率來估計噪聲。
現在我們已經介紹了最小值跟蹤、時間遞歸平均兩類噪聲估計方法。那么,能不能同時使用這兩種估計方法來使得噪聲的估計更加准確呢。還真是可以的,這種方法就是最小值控制的遞歸平均(MCRA)算法。下面就來看下,這種方法的思路及出發點。這里噪聲更新的思路是:當語音不存在時,更新噪聲的估計,當語音存在時,用前一幀的噪聲估計值做為當前幀的噪聲估計值。如下所示
\[\begin{array}{l}
H_0^k:\hat \sigma _D^2(\lambda ,k) = \alpha \hat \sigma _D^2(\lambda - 1,k) + (1 - \alpha )|Y(\lambda ,k){|^2} \\
H_1^k:\hat \sigma _D^2(\lambda ,k) = \hat \sigma _D^2(\lambda - 1,k) \\
\end{array}\]
於是,噪聲功率譜密度的均方估計可以表示如下:
\[\begin{array}{l}
\hat \sigma _d^2(\lambda ,k) = E[\sigma _d^2(\lambda ,k)|Y(\lambda ,k)] \\
= E[\sigma _d^2(\lambda ,k)|H_0^k]p(H_0^k|Y(\lambda ,k)) + E[\sigma _d^2(\lambda ,k)|H_0^k]p(H_1^k|Y(\lambda ,k)) \\
= [\alpha \hat \sigma _D^2(\lambda - 1,k) + (1 - \alpha )|Y(\lambda ,k){|^2}]p(H_0^k|Y(\lambda ,k)) + \hat \sigma _D^2(\lambda - 1,k)p(H_1^k|Y(\lambda ,k)) \\
= [\alpha \hat \sigma _D^2(\lambda - 1,k) + (1 - \alpha )|Y(\lambda ,k){|^2}](1 - p(\lambda ,k)) + \hat \sigma _D^2(\lambda - 1,k)p(\lambda ,k) \\
= [\alpha \hat \sigma _D^2(\lambda - 1,k)(1 - p(\lambda ,k)) + \hat \sigma _D^2(\lambda - 1,k)p(\lambda ,k)] + (1 - \alpha )|Y(\lambda ,k){|^2}(1 - p(\lambda ,k)) \\
= [\alpha (1 - p(\lambda ,k)) + p(\lambda ,k)]\hat \sigma _D^2(\lambda - 1,k) + [(1 - \alpha )(1 - p(\lambda ,k))]|Y(\lambda ,k){|^2} \\
= [\alpha + \alpha p(\lambda ,k) + p(\lambda ,k)]\hat \sigma _D^2(\lambda - 1,k) + [1 - p(\lambda ,k) - \alpha + \alpha p(\lambda ,k)]|Y(\lambda ,k){|^2} \\
= [\alpha + (1 - \alpha )p(\lambda ,k)]\hat \sigma _D^2(\lambda - 1,k) + [1 - \alpha - (1 - \alpha )p(\lambda ,k)]|Y(\lambda ,k){|^2} \\
= [\alpha + (1 - \alpha )p(\lambda ,k)]\hat \sigma _D^2(\lambda - 1,k) + [1 - (\alpha + (1 - \alpha )p(\lambda ,k)]|Y(\lambda ,k){|^2} \\
\end{array}\]
其中,上式中的
\[p(\lambda ,k) = p(H_1^k|Y(\lambda ,k))\]
表示語音存在的概率。最終,噪聲功率譜密度的均方估計可以化簡為:
\[\begin{array}{*{20}{c}}
{\hat \sigma _d^2(\lambda ,k) = {\alpha _d}(\lambda ,k)\hat \sigma _d^2(\lambda - 1,k) + [1 - {\alpha _d}(\lambda ,k)]|Y(\lambda ,k){|^2}} & {{\alpha _d}(\lambda ,k) \buildrel \Delta \over = \alpha + (1 - \alpha )p(\lambda ,k)} \\
\end{array}\]
從上面的推導過程我們可以看到,MCRA算法的主要流程是:
(1)先用最小值跟蹤法獲得帶噪語音的最小值,它代表的是對噪聲的初步估計
(2)再利用這個最小值來計算語音存在的概率p
(3)根據上式計算噪聲估計的平滑因子
(4)利用遞歸平均來估計噪聲
speex的噪聲估計就是采用的這種思路,具體細節就不多說了,詳細問題可以到下面的群里討論!