WebRtc 的VAD算法解析

来源:互联网 发布:软件开发属于什么行业 编辑:程序博客网 时间:2024/06/04 19:07

摘要:本篇文章主要讲述VAD算法的原理并且列举相关公式。该VAD的算法主要用了2 个 models 来对语音建模,并且分成噪声类和语音类。通过比较似然比的方法来确定是否是语音。其中有三个模式可以选择,每个模式算法是一直的,只是相关阈值不同。GMM的更新方法是梯度法,并没有使用常见的EM算法。这是因为其数据量不够大,难以准确估计种类,另外也节省部分运算量。 

1、  将信号通过分频降到8kHz。在这个频带计算噪声和语音的特征做VAD判决。

2、  WebRtcVad_CalculateFeatures函数计算特征,其特征包括6个频带的log能量,分别是80-250、250-500、500-1kHZ、1kHz-2kHz、2kHz -3kHz、3kHz -4kHz。使用分频方法计算这些特征。这六个特征放在向量feature_vector中,使用2维度的GMM模型来建模。

3、 WebRtcVad_GaussianProbability函数输入信号、均值 、方差 ,计算高斯分别概率密度:P\left( x \right) = \frac{1}{\sigma }{e^{\frac{{ - {{\left( {x - \bar x} \right)}^2}}}{{2{\sigma ^2}}}}} 。注意这里少了一个 \frac{1}{{\sqrt {2\pi } }}的系数,因为后面用到概率的时候都是相对量,能够抵消。例如似然比和后验概率。

4、 对于每一个特征 求对数似然比L\left( {x\left( n \right),i} \right) = \log \left( {\frac{{{P_s}\left( {x\left( n \right),i} \right)}}{{{P_n}\left( {x\left( n \right),i} \right)}}} \right),一共6个

5、 计算加权对数似然比{L_s}\left( {x\left( n \right)} \right) = \sum\limits_{}^{} {{K_i}L\left( {x\left( n \right),i} \right)} {K_i}是似然比的加权系数。

6、 如果6个特征中有一个满足似然比超过了阈值就认为有语音

{F_{vad}}\left( n \right) = \left\{ {\begin{array}{ccccccccccccccc}{\begin{array}{ccccccccccccccc}1&{L\left( {x,i} \right) > {T_l}}\end{array}}\\{\begin{array}{ccccccccccccccc}0&{else}\end{array}}\end{array}} \right.

或者加权似然比超过了阈值

{F_{vad}}\left( n \right) = \left\{ {\begin{array}{ccccccccccccccc}{\begin{array}{ccccccccccccccc}1&{{L_s}\left( x \right) > {T_a}}\end{array}}\\{\begin{array}{ccccccccccccccc}0&{else}\end{array}}\end{array}} \right.

7、 WebRtcVad_FindMinimum函数对每个特征feature,求出了100个帧里头的16个最小值。这些最小值都有一个年龄,最大不超过100,也就是说100帧之后失效。这个最小值用来更新噪声的均值。

8、 计算噪声加权均值 u\left( n \right) = {\alpha _{n1}}{u_{n1}}\left( {n - 1} \right) + {\alpha _{n2}}{u_{n2}}\left( {n - 1} \right)

9、 模型参数更新,包括语音和噪声的两个高斯分布均值和方差更新。其中j = 1,2 。注意噪声均值的更新使用了长期的最小值,也即公式的第三部分。该部分与VAD的标志位是无关的。跟新完后结束VAD计算。最后需要对均值和方差做相应的限制。

1)  噪声模型均值更新:

{u_{nj}}\left( n \right) = {u_{nj}}\left( {n - 1} \right) + \left[ {1 - {F_{vad}}\left( n \right)} \right]{K_{\Delta n}}\frac{{{\nabla _{{u_{nj}}}}{p_n}\left( {x\left( n \right)} \right)}}{{{p_n}\left( {x\left( n \right)} \right)}} + {K_L}\left[ {{x_{\min }}\left( n \right) - {u_n}\left( n \right)} \right]

2)  语音模型均值更新:

{u_{sj}}\left( n \right) = {u_{sj}}\left( {n - 1} \right) + {F_{vad}}\left( n \right){K_{\Delta s}}\frac{{{\nabla _{{u_{sj}}}}{p_{\rm{s}}}\left( {x\left( n \right)} \right)}}{{{p_s}\left( {x\left( n \right)} \right)}}

3)  噪声模型方差更新:

{\sigma _{nj}}\left( n \right) = {\sigma _{nj}}\left( {n - 1} \right) + \left[ {1 - {F_{vad}}\left( n \right)} \right]{C_{\Delta n}}\frac{{{\nabla _{{\sigma _{nj}}}}{p_n}\left( {x\left( n \right)} \right)}}{{{p_n}\left( {x\left( n \right)} \right)}}

4)  语音模型方差更新:

{\sigma _{sj}}\left( n \right) = {\sigma _{sj}}\left( {n - 1} \right) + {F_{vad}}\left( n \right){C_{\Delta n}}\frac{{{\nabla _{{\sigma _{sj}}}}{p_s}\left( {x\left( n \right)} \right)}}{{{p_s}\left( {x\left( n \right)} \right)}}



1 0
原创粉丝点击