webrtc 之vad的理解

1、语音信号的采样率是8kHz,因此其最高频率必须限制在4kHz以下;

2、首先把语音信号划分为10ms一帧数据进行计算,帧与帧之间不重叠;

3、将一帧信号分解到六个频段:80~250,250~500,500~1000,1000~2000,2000~3000,3000~4000,

4、计算每个频率内的信号能量,取log10,我们称之为对数能量;

5、下面的话很重要,很重要,很重要:

在每个频段内,这个对数能量都是遵循一定的概率分布的,这里我们假定噪声为H0,语音H1(我个人理解应该是噪声+语音),

如果是噪声,那么服从的概率分布为:

p(x)=\pi_{00} p(x|\mu_{00},\sigma_{00}) + \pi_{01} p(x|\mu_{01},\sigma_{01})

如果是语音,那么服从的概率分布为:

p(x)=\pi_{10} p(x|\mu_{10},\sigma_{10}) + \pi_{11} p(x|\mu_{11},\sigma_{11})

假定噪声的概率是p(H0),信号的概率是p(H1),那么收到一个信号(还不确是噪声还是语音)那它服从以下概率分布:

p(x)=p(H0)(\pi_{00} p(x|\mu_{00},\sigma_{00}) + \pi_{01} p(x|\mu_{01},\sigma_{01}))+p(H1)(\pi_{10} p(x|\mu_{10},\sigma_{10}) + \pi_{11} p(x|\mu_{11},\sigma_{11}))

那么这个信号属于信号还是属于噪声,可以用后验概率来估计。

p( H0 | x ) = \frac{ p(H0,x) } { p(x) } =\frac{ p(x | H0)p(H0) } { p(x | H0)p(H0)+p(x | H1)p(H1) }

p( H1 | x ) = \frac{ p(H1,x) } { p(x) } =\frac{ p(x | H1)p(H1) } { p(x | H0)p(H0)+p(x | H1)p(H1) }

看二者的概率,那个高就用确定是哪一个。

这里我们用二者的比值,则有:

如果\frac{p( H1 | x )} {p( H0 | x )} = \frac{ p(x | H1)p(H1) } { p(x | H0)p(H0) } > 1就是语音,否则就是噪声。

该判别式两侧同乘以\frac{p( H0 )} {p( H1 )},再变形一下是这样,

\frac{ p(x | H1) } { p(x | H0) } > \frac{ p(H0) } { p(H1) }判定为语音,否则是噪声

因此可以知道,\frac{p( H0 )} {p( H1 )}是预先假设的噪声和信号概率的比值,webrtc用它来作为四个级别不同的门限来判别。

基本原理就是这么简单,但是实际的实现中会有一些列的问题:

比如权重更新。对于GMM的权重更新,一般都会想到是EM算法,但是实际工程应用中确实不允许的,因为权重可能是不断变化的。在这一种场景下设置好的权重,未必在另一种场景下就使用,因此需要更新,更新的准则是什么呢?

还回到这个式子

p(x)=p(H0)(\pi_{00} p(x|\mu_{00},\sigma_{00}) + \pi_{01} p(x|\mu_{01},\sigma_{01}))+p(H1)(\pi_{10} p(x|\mu_{10},\sigma_{10}) + \pi_{11} p(x|\mu_{11},\sigma_{11}))

假定我们收到了数据x(n),我们用最大似然估计的方法,即权重的设置会让概率最大,我们取对数ln(p(x(n)))

\frac{\partial ln(p( x) ) } { \partial m _ {00} } = \frac{ p(H0) \pi _ {00} N(x | m _ {00}, \sigma _ {00}) } { p(x) } \frac{ (x-m _{00}) }{ \sigma_{00} ^ 2 }

\frac{\partial ln(p( x) ) } { \partial \sigma _ {00} } = \frac{ p(H0) \pi _ {00} N(x | m _ {00}, \sigma _ {00}) } { p(x) } \frac{ (x-m _{00}) ^2}{ \sigma_{00} ^ 2 }\frac{1}{\sigma _{00}}

注意这里的p(x)和webrtc代码中的不太一样,webrtc代码的p(x)是这样定义的:

对信号:

p(x)=\pi_{10} p(x|\mu_{10},\sigma_{10}) + \pi_{11} p(x|\mu_{11},\sigma_{11})

对噪声:

p(x)=\pi_{00} p(x|\mu_{00},\sigma_{00}) + \pi_{01} p(x|\mu_{01},\sigma_{01})

什么原因?webrtc的估计把噪声和语音分开来进行权重更新的的,也就是说,在确定是噪声的情况下,那么权重会使得噪声的极大似然概率最大,所以p(x)只取噪声部分;在确定是信号的情况下,权重的选择会使得信号极大似然概率最大,p(x)只取信号部分。注意这是有前提的,但是这个前提又是如何来保证呢???从代码中可以看出:在确定是噪声的情况下,才会对噪声权重进行梯度更新,在确定是信号的情况下,才会对信号的梯度部分进行权重更新。

需要注意的是,webrtc并没有对p(H0)、p(H1)、\pi进行更新。

值得注意的是webrtc对于噪声均值估计还有一个更新项,就是不论是否是噪声,都会查找前100帧信号中的5个最小值,取5个最小值的中值,用这个中值部分更新通道的最小值,然后用通道最小值减去原来的和的加权平均,然后进行修正,它的依据是什么??这个我还没有想明白。

为什么webrtc使用的是梯度值不加负号呢?要计算最小值是梯度下降,计算最大值则是梯度上升,这里计算的是最大似然,当然需要梯度上升了。

你可能感兴趣的:(语音识别)