前面的幾篇文章講了webRTC中的語音降噪。最近又用到了基於MCRA-OMLSA的語音降噪,就學習了原理並且軟件實現了它。MCRA主要用於噪聲估計,OMLSA是基於估計出來的噪聲去做降噪。類比於webRTC中的降噪方法,也有噪聲估計(分位數噪聲估計法)和基於估計出來的噪聲降噪(維納濾波),MCRA就相當於分位數噪聲估計法,OMLSA就相當於維納濾波。本文先講講怎么用MCRA和OMLSA來做語音降噪的原理,后續會講怎么來做軟件實現。
一, MCRA
MCRA的全稱是Minima Controlled Recursive Averaging(最小值控制的遞歸平均),是cohen提出的一種常用的噪聲估計方法,具體見論文《Noise Estimation by Minima Controlled Recursive Averaging for Robust Speech Enhancement》。 從名字就可看出這個方法主要包括兩部分,最小值控制和遞歸平均。 最小值控制用來算語音存在概率,遞歸平均用來做噪聲估計,即基於語音存在概率做噪聲估計。先定義一些名稱,然后分別看這兩部分。用l表示第l幀,k表示第k個頻點,Y(k, l)表示帶噪語音第l幀的第k個頻點的幅度譜,N(k, l)表示噪聲第l幀的第k個頻點的幅度譜,S(k, l)表示干凈語音第l幀的第k個頻點的幅度譜,H0(k, l)表示第l幀的第k個頻點上只有噪聲,H1(k, l)表示第l幀的第k個頻點上有語音。P(H1(k, l) | Y(k, l)) 表示第l幀的第k個頻點上是語音的概率,P(H0(k, l) | Y(k, l)) 表示第l幀的第k個頻點上是噪聲的概率,顯然P(H0(k, l) | Y(k, l)) + P(H1(k, l) | Y(k, l)) = 1。
1, 用最小值控制來算語音存在概率
前面的文章( webRTC中語音降噪模塊ANS細節詳解(四) )講過webRTC的ANS是基於似然比等來算語音存在概率。而這里是用最小值控制來算語音存在概率,即基於當前帶噪語音的能量譜與指定長度幀內帶噪語音的能量譜的最小值的比值來計算,具體如下:
1) 對帶噪語音的能量譜做頻域平滑和時域平滑
從上式可見,平滑窗的長度是奇數(2w + 1),系數是b(i)。
其中,αs (0 < αs < 1)是平滑因子。
2) 搜索能量譜最小值
定義Smin(k, l)和Stmp(k, l),並對它們初始化如下:
然后按頻點從第一幀開始逐幀比較:
當到第L幀后:
后面以L幀為一個周期,重復上面兩步,得到這個周期內的Smin(k, l)和Stmp(k, l)。搜索窗的幀長度L會影響到噪聲的跟蹤速度,一般按照經驗選0.5s~1.5s左右。
3) 計算語音存在概率
定義Sr(k, l)為當前幀相應頻點的能量譜與最小值的比值,即
再定義二值I (k, l)如下:
最終語音存在概率通過下式得到:
其中,αp (0 < αp < 1)是平滑因子。此處的p(k, l)就是P(H1(k, l) | Y(k, l))。為書寫方便,下文用p表示P(H1(k, l) | Y(k, l)),用1-p表示P(H0(k, l) | Y(k, l))。
2, 用遞歸平均來估計噪聲
通常認為噪聲都是加性噪聲,所以有下式:
定義σ(k, l)表示第l幀的第k個頻點上的噪聲能量譜。這里噪聲更新的思路如下:當語音不存在時更新噪聲的估計,當語言存在時用前一幀的噪聲估計值作為當前噪聲的估計值,表示如下式:
其中,αd (0 < αd < 1)是平滑因子。
所以噪聲能量譜的估計如下式(p = P(H1(k, l) | Y(k, l)),為語音存在概率):
αd是tuning出來的,每個頻點上的語音存在概率是上面基於最小控制的方法算出來的,上一幀估計出來的噪聲能量譜σ(k, l-1)和當前幀的帶噪語音的能量譜均已知,這樣當前幀的估計出來的噪聲的能量譜就可求出了。
通常令,這樣上式就可寫成下式:
這就是噪聲估計的數學表達式。
二, OMLSA
噪聲估計出來后就要基於它做降噪了。這里用的是OMLSA(Optimally Modified Log-Spectral Amplitude Estimator,最優修正的對數幅度譜估計),依舊是cohen提出來的,論文是《Optimal Speech Enhancement Under Signal Presence Uncertainty Using Log-Spectral Amplitude Estimator》。OMLSA是MMSE-LSA的改進算法,目的是得到增益gain。算法推導有些復雜,這里只給出gain的表達式,如下:
其中,Gmin為預先設定的值,p(k, l)是語音存在概率。這里
, ξ(k, l)是先驗性噪比,γ(k, l)是后驗性噪比。先驗性噪比和后驗性噪比在文章(webRTC中語音降噪模塊ANS細節詳解(一) )中講過。后驗性噪比的計算基於上面用MCRA估計出來的噪聲,
, 先驗性噪比計算依舊用文章( webRTC中語音降噪模塊ANS細節詳解(三) )中提到的DD方法,表達式如下:
其中,αSNR (0 < αSNR < 1)是平滑因子。
G(k, l)得到后,降噪后干凈語音的每個頻點的幅度譜可通過下式得到:
S(k, l) = G(K, l)Y(k, l)
以上就是基於MCRA-OMLSA的語音降噪原理。這里需要指出的是噪聲估計和語音降噪相對獨立,有不同的組合方式來降噪,比如MCRA也可以和維納濾波結合來降噪。