精华内容
下载资源
问答
  • webrtc VAD 算法

    千次阅读 2019-01-18 14:11:00
    webrtc VAD 算法 简介 一,K-means 聚类 二,EM估计 三,GMM 高斯混合模型 四,webrtc 中的 VAD 实现 五,参考资料:

    webrtc VAD 算法

    简介

    本文的目地是为了尽可能少的使用公式将webrtc的VAD算法讲清楚,为此忽略算法的证明以及算法的严谨性,力求通俗易懂,多讲实例。
    因为webrtc的VAD算法主要使用了GMM高斯混合模型,所以重点在于理解GMM,要想理解GMM,又离不开K-means聚类和EM估计,下面从K-means开始说起。

    一,K-means 聚类

    K-means 属于传统机器学习中的无监督学习,体现了聚类思想,他可以对没有标签的数据进行分类,聚类过程主要分两步:

    • K:描述了簇的数量,也就是应当聚合成的几何数;
    • means:均值求解,确定已分类数据的聚类中心(Cluster Centroid)位置;

    具体实现步骤:
    (1)根据设定的聚类数 K ,随机地选择 K 个聚类中心(Cluster Centroid),这里要注意聚类中心(Cluster Centroid)的初始值(就是图中X的位置)会影响最终的分类结果
    在这里插入图片描述
    (2)评估各个样本到聚类中心的距离,如果样本距离第 i 个聚类中心更近,则认为其属于第 i 簇,
    d=(x1x2)2+(y1y2)2 欧式距离: d=\sqrt{(x_{1}-x_{2})^2+(y_{1}-y_{2})^2} 在这里插入图片描述
    (3)计算每个簇中样本的平均(Mean)位置,将聚类中心移动至该位置,实际就是求每个簇的数据在x轴和y轴上的平均值
    μiKiui=1KixKix 其中μi是簇K_{i}的均值向量,有时也称为质心,表达式为:u_{i}=\frac{1}{|K_{i}|}\sum_{x\in K_{i}}^{}x
    Alt
    重复以上(2),(3)步骤直至各个聚类中心的位置不再发生改变(这个过程一定会收敛,证明这里就不介绍了,主要理解聚类的思想)

    K-means 演示实例(需要翻墙)

    二,EM估计

    1,似然函数和极大似然估计

    硬币 结果 统计
    1 正正反正反 3正-2反

    如上图所示,如果我们知道这个硬币正面朝上的概率是0.5,那么抛5次有3次正面朝上的概率是0.5x0.5x0.5=0.125(这个是概率),如果我们不知道这个硬币正面朝上的概率,那么抛5次有3次正面朝上,现在求这个硬币正面朝上的概率是3/5=0.6(这个就是似然),似然和概率都是大概的意思,但是在统计学上是不同的。
    现在考虑一个问题,上一步求出的硬币正面朝上的概率为什么是3/5=0.6,为什么正面朝上的次数除以总次数就是硬币正面朝上的概率,其实这个就是用极大似然估计推导出来的,下面我们就看一下这个3/5=0.6的由来。

    • 已知硬币连续抛5次,3正2反,求硬币正面朝上的概率,假设正面朝上的概率为θ\theta,似然函数为:
      L(θ)=L(x1,...xn;θ)=i=1np(xi;θ),θΘL(\theta)=L(x_{1},...x_{n};\theta)= \prod_{i=1}^{n}p(x_{i};\theta),\theta\in\Theta
      在我们这个例子中似然函数为:
      L(θ)=i=13θi=12(1θ) L(\theta)=\prod_{i=1}^{3}\theta\prod_{i=1}^{2}(1-\theta)

    • 极大似然估计就是求似然函数L(θ)L(\theta)最大时,θ\theta的取值,这就转化成一个纯数学问题,求导,令导数等于0,就可以得到θ\theta的值,为了便于分析,还可以定义对数似然函数,将其变成连加的:
      H(θ)=lnL(θ)=lni=1np(xi;θ)=i=1nlnp(xi;θ),θΘ H(\theta)=lnL(\theta)=ln\prod_{i=1}^{n}p(x_{i};\theta)=\sum_{i=1}^{n}lnp(x_{i};\theta),\theta\in\Theta
      在我们这个例子中对数似然函数为:
      H(θ)=lnL(θ)=lni=13θ+lni=12(1θ)=i=13lnθ+i=12ln(1θ) H(\theta)=lnL(\theta)=ln\prod_{i=1}^{3}\theta+ ln\prod_{i=1}^{2}(1-\theta)=\sum_{i=1}^{3}ln\theta+\sum_{i=1}^{2}ln(1-\theta)
      我们对H(θ)H(\theta)求导,并令导数等于0,求解θ\theta:
      H(θ)=i=13lnθ+i=12ln(1θ) H(\theta)=\sum_{i=1}^{3}ln\theta+\sum_{i=1}^{2}ln(1-\theta)
      H(θ)=3lnθ+2ln(1θ) H(\theta)=3ln\theta+2ln(1-\theta)
      H(θ)=3θ+21θ×1 {H(\theta )}' =\frac{3}{\theta}+\frac{2}{1-\theta}\times-1
      H(θ)=3(1θ)θ(1θ)+2θ(1θ)θ {H(\theta )}'=\frac{3(1-\theta)}{\theta(1-\theta)}+\frac{-2\theta}{(1-\theta)\theta}
      H(θ)=35θ(1θ)θ {H(\theta )}'=\frac{3-5\theta}{(1-\theta)\theta}
      H(θ)=0{H(\theta )}'=0,得:35θ(1θ)θ=0\frac{3-5\theta}{(1-\theta)\theta}=0,所以35θ=03-5\theta=0, 最终θ=3/5=0.6\theta=3/5=0.6

    • 这就是极大似然估计,总结一下计算步骤:
      (1)写出似然函数;
      (2)对似然函数取对数,并整理;
      (3)求导数,令导数为0,得到似然方程;
      (4)解似然方程,得到的参数即为所求;

    2,EM估计

    • 通过一个简单的例子来了解EM算法,假设现在有两枚硬币1和2,,随机抛掷后正面朝上概率分别为P1,P2。为了估计这两个概率,做实验,每次取一枚硬币,连掷5下,记录下结果,如下:
    硬币 结果 统计
    1 正正反正反 3正-2反
    2 正反反正反 2正-3反
    1 正反正正反 3正-2反
    • 根据极大似然估计,我们很容易计算出p1和p2
      p1=(3+3)/10 = 0.6
      p2=2/5 = 0.4
    • 现在加大难度,还是求两枚硬币正面朝上的概率p1,p2,如下图所示:
    硬币 结果 统计
    未知 正正反正反 3正-2反
    未知 正反反正反 2正-3反
    未知 正反正正反 3正-2反
    • 现在引入了未知变量,如何求p1,p2呢?假设未知变量是k,它是个3维向量[k1,k2,k3],要求k,我们需要知道p1,p2,要求p1,p2,又要知道k,怎么办呢?要解决这个问题就要用到EM估计。

    • 首先我们假设一个p1,p2的值,然后用这个假设的值去求k,有了k之后,我们在利用极大似然估计去求p1和p2,然后看一下求出的p1和p2,与我们刚才假设的值是否相等,如果不相等,就用这个p1和p2去求k,在用k,求出一个新的p1和p2,一直迭代下去,直到求出的p1和p2与上一次求出的p1和p2相等,这个时候的p1和p2就是我们要求的答案了,这个过程是收敛的,证明过程请参考其他资料,下面我们针对这个例子来一步一步走一遍。

    • 首先我们假设p1=0.7,p2=0.3,计算第一轮实验,硬币是第一枚和是第二枚硬币的可能性

    • 第一步,求出未知变量k:
      p(硬1)=0.7x0.7x0.7x(1-0.7)x(1-0.7)=0.03087
      p(硬2)=0.3x0.3x0.3x(1-0.3)x(1-0.3)=0.01323
      因为p(硬1)>p(硬2),所以第一轮最有可能用的是第一枚硬币,依次求出剩下的两轮,如下表:

    轮数 是硬币1的概率 是硬币2的概率
    1 0.03087 0.01323
    2 0.01323 0.03087
    3 0.03087 0.01323

    所以k=[硬币1,硬币2,硬币3];

    • 第二步,根据求出的k=[硬币1,硬币2,硬币3],利用极大似然估计求出p1和p2
      p1=(3+3)/10 = 0.6
      p2=2/5 = 0.4
    • 第三步,根据第二步求出的p1和p2,与第一步使用的p1和p2做比较,如果相等就停止,不相等就重复第一步和第二步,直到相等为止,又是一个迭代的过程,这个算法也一定会收敛,证明过程请参考其他资料

    三,GMM 高斯混合模型

    1,高斯分布和极大似然估计求解

    • 正态分布(Normal distribution),也称“常态分布”,又名高斯分布(Gaussian distribution),最早由A.棣莫弗在求二项分布的渐近公式中得到。C.F.高斯在研究测量误差时从另一个角度导出了它。P.S.拉普拉斯和高斯研究了它的性质。是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。

    • 一维正态分布,若随机变量X服从一个数学期望为μ、标准方差为σ2的高斯分布,记为:
      XN(u,σ2) X\sim N(u,\sigma^{2})
      则其概率密度函数为:
      f(x)=1σ2πe(xu)22σ2 f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-u)^{2}}{2\sigma^{2}}}
      图像如下:
      在这里插入图片描述

    • 有一点要注意某一点x的值f(x),并不是x点对应的概率值,他代表的是概率累积函数在这点的导数,也就是梯度,但是他其实可以近似的表示某个点落在高斯分布x[x,x+0.001]x\in[x,x+0.001]所围城图形上的概率。

    • 现在我们看一下高斯分布公式中的两个未知参数是怎么求解的,有没有感觉和前面求解硬币正面朝上的概率很熟悉,没错,它也是用极大似然估计求解的,只不过它有两个参数u,σ2u,\sigma^{2},求解的套路是一样的,先求出高斯分布的对数似然函数,然后求导,令导数等于0,求解参数,这里要注意,由于有两个未知的参数,所以需要求偏导,令导数等于0,求解过程就不写了,直接列出最后的结果:
      u=1ni=1nxi u=\frac{1}{n}\sum_{i=1}^{n}x_{i}

    σ2=1ni=1n(xiu)2 \sigma^{2} = \frac{1}{n}\sum_{i=1}^{n}(x_{i}-u)^{2}
    2,GMM求解

    • 这里引用李航老师《统计学习方法》上的定义,如下:
      在这里插入图片描述
    • GMM其实就是把多个高斯分布乘以一个系数aka_{k},然后在累加起来,有没有发现aka_{k}和我们前面讲的EM估计中的向量k=[硬币1,硬币2,硬币3]很像,没有错它们都称为隐含变量,下面我们就用包含两个高斯分布的GMM来举例
    • 假设我们有10个身高数据[166178155175160180163188170170][166_{女},178_{男},155_{女},175_{男},160_{女},180_{男},163_{女},188_{男},170_{女},170_{男}]
      男生和女生的身高都分别符合一个高斯分布,根据前面的极大似然估计我们可以求出:
      u=1ni=1nxi=15(178+175+180+188+170)=178.2 u_{男}=\frac{1}{n}\sum_{i=1}^{n}x_{i}=\frac{1}{5}(178+175+180+188+170) = 178.2

    σ2=1ni=1n(xiu)2=15((178178.5)2+(175178.5)2+(180178.5)2+(188178.5)2+(170178.5)2)=44.2 \sigma^{2}_{男} = \frac{1}{n}\sum_{i=1}^{n}(x_{i}-u)^{2}=\frac{1}{5}((178-178.5)^{2}+(175-178.5)^{2}+(180-178.5)^{2}+(188-178.5)^{2}+(170-178.5)^{2})=44.2

    u=1ni=1nxi=15(166+155+160+163+170)=162.8 u_{女}=\frac{1}{n}\sum_{i=1}^{n}x_{i}=\frac{1}{5}(166+155+160+163+170) = 162.8

    σ2=1ni=1n(xiu)2=15((166162.8)2+(155162.8)2+(160162.8)2+(163162.8)2+(170162.8)2)=32.7 \sigma^{2}_{女} = \frac{1}{n}\sum_{i=1}^{n}(x_{i}-u)^{2}=\frac{1}{5}((166-162.8)^{2}+(155-162.8)^{2}+(160-162.8)^{2}+(163-162.8)^{2}+(170-162.8)^{2})=32.7

    • 假设我们获得的10个身高数据是[166178155175160180163188170170][166_{未知},178_{未知},155_{未知},175_{未知},160_{未知},180_{未知},163_{未知},188_{未知},170_{未知},170_{未知}],我们知道他们是属于两个高斯分布,我要如何求出这个高斯分布呢?,有没有一种熟悉的味道,和上面讲解的EM估计非常类似,其实他们的思想是一样的,我下面就一步一步计算一遍
    • 首先假设uu_{男}=178,σ2\sigma^{2}_{男}=44,uu_{女}=162,σ2\sigma^{2}_{女}=32
    • 第一步,求第一个数据166的可能性为:
      f(166)=1442πe(166178)22×44=0.0735688 f(166)_{男}=\frac{1}{\sqrt{44}\sqrt{2\pi}}e^{-\frac{(166-178)^{2}}{2\times 44}}=0.0735688

    f(166)=1322πe(166162)22×32=0.345092 f(166)_{女}=\frac{1}{\sqrt{32}\sqrt{2\pi}}e^{-\frac{(166-162)^{2}}{2\times 32}}=0.345092
    因为f(166)<f(166)f(166)_{男}<f(166)_{女},所以166这个数据属于女生的高斯分布的可能性大,下面我们计算剩余的数据;

    身高 男生高斯分布的可能性 女生高斯分布的可能性
    166 0.0735688 0.345092
    178 0.377883 0.00811579
    155 0.000926094 0.206064
    175 0.341146 0.0316009
    160 0.00951402 0.41626
    180 0.361091 0.00280474
    163 0.0293052 0.436237
    188 0.121294 0.000011
    170 0.182602 0.16301
    170 0.182602 0.16301

    我们根据可能性的大小,确定数据的属于那个分布,166178155175160180163188170170166_{女},178_{男},155_{女},175_{男},160_{女},180_{男},163_{女},188_{男},170_{男},170_{男}

    • 第二步,根据极大似然估计来计算两个高斯分布的u,σ2u,\sigma^{2}
    • 第三步,判断新计算的u,σ2u,\sigma^{2}与上一次的u,σ2u,\sigma^{2}是否相等,如果不相等重复第一步和第二步;
    • 这里有个问题,我们知道GMM中有个权重系数aka_{k}可是我们刚才并没有出现这个aka_{k},其实是为了方便直接使用男或女表示了,如果使用aka_{k}表示,则数据166166_{女},就表示为166[0,1]166_{[0,1]},GMM是多个高斯分布乘以系数aka_{k},然后相加得到的,所以:
      166=166[0,1]=0×+1×= 166_{女}=166_{[0,1]}=0\times 男生高斯分布+1\times女生高斯分布=女生高斯分布

    四,webrtc 中的 VAD 实现

    1,VAD激进模式设置

    • 共四种模式,用数字0~3来区分,激进程度与数值大小正相关。
      0: Normal,1:low Bitrate, 2:Aggressive;3:Very Aggressive

    2,帧长设置

    • 共有三种帧长可以用到,分别是80/10ms,160/20ms,240/30ms,实际上目前只支持10ms的帧长。
    • 其它采样率的48k,32k,24k,16k会重采样到8k来计算VAD。之所以选择上述三种帧长度,是因为语音信号是短时平稳信号,其在10ms-30ms之间可看成平稳信号,高斯马尔科夫等信号处理方法基于的前提是信号是平稳的,在10ms~30ms,平稳信号处理方法是可以使用的。

    3,高斯模型中特征向量选取

    • 在WebRTC的VAD算法中用到了聚类的思想,只有两个类,一个类是语音,一个类是噪声,对每帧信号都求其是语音和噪声的概率,根据概率进行聚类,当然为了避免一帧带来的误差也有一个统计量判决在算法里,那么问题来了,选择什么样的特征作为高斯分布的输入呢?这关系到聚类结果的准确性,也即VAD性能,毋庸置疑,既然VAD目的是区分噪声和语音,那么噪声信号和语音信号这两种信号它们的什么特征相差最大呢?选择特征相差比较大自然能得到比较好的区分度。

    • 众所周知,信号的处理分类主要有时域,频域和空域,从空域上看,webRTC的VAD是基于单麦克的,噪声和语音没有空间区分度的概念,在多麦克风场景,确实基于多麦克风的VAD算法,从时域上看,而者都是时变信号,且短时信号变化率比较小,所以推算来推算去只有频域的区分度可能是比较好的。

    • 汽车噪声频谱
      在这里插入图片描述

    • 粉红噪声频谱
      在这里插入图片描述

    • 白噪声频谱
      在这里插入图片描述

    • 语音声谱
      在这里插入图片描述

    • 从以上四个图中,可以看到从频谱来看噪声和语音,它们的频谱差异还是比较大,且以一个个波峰和波谷的形式呈现。

    • WebRTC正式基于这一假设,将频谱分成了6个子带。它们是:80Hz250Hz,250Hz500Hz,500Hz1K,1K2K,2K3K,3K4K。分别对应于feature[0],feature[1],feature[2],…,feature[5]。

    • 可以看到以1KHz为分界,向下500HZ,250Hz以及170HZ三个段,向上也有三个段,每个段是1KHz,这一频段涵盖了语音中绝大部分的信号能量,且能量越大的子带的区分度越细致。

    • 我国交流电标准是220V~50Hz,电源50Hz的干扰会混入麦克风采集到的数据中且物理震动也会带来影响,所以取了80Hz以上的信号。

    • 这个模型和我们上面讲个的身高的例子,原理是一样的,只是这个例子的输入不是身高的值,而是子带能量,这个GMM包含两个高斯分布,一个是语音的高斯分布,一个是噪音的高斯分布

    3,计算流程

    • 高斯模型有两个参数H0和H1,它们分表示的是噪声和语音,判决测试使用LRT(likelihood ratio test,似然比检测)。分为全局和局部两种情况
      在这里插入图片描述

    4,参数更新

    • 噪声均值更新,参数更新就是使用极大似然估计根据已经分类完的数据去重新计算均值uu和方差σ2\sigma^{2},WebRtcVad_FindMinimum函数对每个特征,求出100个帧里头的前16个最小值。每个最小值都对应一个age,最大不超过100,超过100则失效,用这个最小值来跟新噪声,这里要注意为什么要使用部分数据而不是全部的数据去更新参数呢,这个和随机梯度下降法是一个道理,因为数据太多了,计算量会很大,10ms 音频就有6个样本,如果是一个小时呢?

    • 更新噪声均值,语音均值,噪声方差,语音方差,自适应也就体现在这里

    五,参考资料:

    https://blog.csdn.net/shichaog/article/details/52399354/
    https://www.jianshu.com/p/1121509ac1dc
    https://blog.csdn.net/zouxy09/article/details/8537620

    展开全文
  • WebRTC VAD算法初探

    千次阅读 2018-03-23 10:37:40
    这几天对webrtc中的VAD算法做了一些研究,有了一些心得VAD算法中核心的是使用了GMM进行分类,noise作为一类,speech作为一类,两类求后验概率,并且实时的更新GMM的参数但是这个GMM的具体情况是怎么样的,它的均值,...

    这几天对webrtc中的VAD算法做了一些研究,有了一些心得


    VAD算法中核心的是使用了GMM进行分类,noise作为一类,speech作为一类,两类求后验概率,并且实时的更新GMM的参数

    但是这个GMM的具体情况是怎么样的,它的均值,方差,都是多少,使用特征的维度是多少?参数又是怎么更新的


    一、GMM的 权重,均值,方差分析

    频率域上分成了6个子带(channel),对每个子带求能量,初始值有一个GMM参数,包括 权重,均值,方差。

    对噪声、语音,每个子带上的GMM的混合系数2,即2个高斯的mixture,一共6(6个channel,或者子带)*2(noise和speech)*2(每个GMM和混合系数是2)

    你比如噪声的权重,kNoiseDataWeights,前六个和后六个分别是两个GMM的两组权重,Q7量化为2^7 =128

    显然, 34/128 + 94/128 = 1; 62/128+66/128 = 1;...依次类推


    使用的特征是6维的,但是这6维不是直接就使用一个GMM模型,而是裂解成6个子特征(6个channel),每个一维度的特征作为一个混合高斯模型的输入,每个高斯混合模型的混合系数是2

    问题比较简单了,既然不是多维度的,那么协方差矩阵的 正定问题 就归在一个方差值上面,也就这一个方差数大于0即可。

    、高斯混合模型的后验概率

    后验概率的公式我们先复习一下:(单维的公式就是简单明了啊)

    函数 WebRtcVad_GaussianProbability 就是专门求这个后验概率,它先计算

     1 / s 然后计算 1 / s^2 再  |tmp32| = (x - m)^2 / (2 * s^2), 再计算 exp(-(x - m)^2 / (2 * s^2)),最后算出来  (1 / s) * exp(-(x - m)^2 / (2 * s^2))

    暂时还没有看出来 1/sqrt(2*pi) 在哪里,估计在后面,或者忽略了。




    注意输入的input是Q4的。实际上求后验概率,就这么简单,但是程序中非出来一个判断函数,这个主要是为了如果要求 x-> exp(-x)

    当 |tmp32| = (x - m)^2 / (2 * s^2) (x是均值)这个值非常大的时候,超过一个范围 kCompVar = 22005的时候,认为 exp(-|tmp32|) 接近是 0直接给成0

    这下面 令 x  = |tmp32| (下图中的红色的X), 主要目的是使用了 ”换底公式” ,以前是求exp的幂,现在是求2的幂【2的幂在定点代码中比e的幂好算】

    我们主要方向,x --- > exp(-x) 考虑到Q值,Q10的量 另外 log2(exp(1)) = 1.4427
     x是Q10的,最后算出来的exp表达式也得是Q10,所以真正的 x到exp(-x),应该是

    exp(-x/1024)*1024 = 1024*( 2 ^ [log2(e))*(-x/1024)]) = 1024* 2^ (-1.4427* x/1024)

    这里面用了一些技巧,主要是为了方便求2个幂,我们给这个表达式上下都乘以一个数,2^[fix(x*1.4427/1024)+1]

    2^10 * 2^ (-1.4427* x/1024) = 2^ (10 + -1.4427*x/1024) = 2^(10 + -1.4427*x/1024 +1 + fix(x*1.4427 /1024) ) /2^[fix(x*1.4427/1024)+1]

    乘以这个数的主要目的是为了使得  -1.4427*x/1024 + 1 + fix(x*1.4427 /1024) 能是一个不大于1的一个纯小数【小学概念】

    上面那个除法表达式分子记为 Y(就是代码中的exp_value),所以有 Y = 2^(10 + -1.4427*x/1024 + 1 + fix(x*1.4427 /1024) ),另外 分母记为2^[fix(x*1.4427/1024)+1],最后分子准备右移(除法)就得结果了

    对Y除2^10,                           Y/1024 = 2^(-1.4427*x/1024 + 1 + fix(x*1.4427 /1024) )


    上面也说了,这个括号里面的数,应该为 1 + α , α是一个接近0比较小的数,我们利用二项式展开公式,分解2的幂





    Y/1024 ≈ 2 + -1.4427*x/1024 + fix(x*1.4427 /1024) 那么Y有

                           Y  = 1024 *(2 + fix(x*1.4427 /1024)-1.4427*x/1024)

                              = 1024* ( 1-x* 1.4427/1024+  fix( x * 1.4427 / 1024)+1)

                             =   1024- x * 1.4427+1024* fix( x * 1.4427 / 1024)+1024

                             =  2^16 - x * 1.4427 - 1024 *  (63) + 1024* fix( x * 1.4427 / 1024)  + 1024

                             =  2^16 - x * 1.4427 - 1024 *  (63 - fix( x * 1.4427 / 1024) ) + 1024

                          而         fix(( 2^16 - x * 1.4427) / 1024)=   63 - fix( x * 1.4427 / 1024); 【的确不是64减】

                          故  Y =     2^16 - x * 1.4427 -  1024*fix(( 2^16 - x * 1.4427) / 1024)  + 1024 = 2^16 - x * 1.4427-  1024*fix(( 2^16 - x * 1.4427) / 1024) + 1024

    2^16 - x * 1.4427  是求相反数,代码中的刚从 WEB...MUL...RSFT算出来的 tmp16 = 1.4427* x ;

    1024*fix(( 2^16 - x * 1.4427) / 1024) 为了抛掉整数,只留小数部分(我知道这个蓝色表达式求得是整数部分),所以前面要加个“-”

    1024 加上1024

    再来看代码


    分母就不用多说了:  2^[fix(x*1.4427/1024)+1],除法(Y/tmp16)相当于右移 (exp_value>>tmp16)

    22005 是这样算出来的   fix(22005*1.4427/1024)+1  = 32(最大右移数) ,那么 31 * 1024 /1.4427 =  2.2003e+004(倒算出来的,先有32-1)

    Tips: 这个整体思路是要计算 x 到 exp(-x/1024)*1024,其中tmp16的值为 tmp16(最终值) = 2^(fix(x*1.4427/1024)+1)

    我已经计算出来了 exp(-x/1024)*1024 = Y/tmp16 (令Y为分子,tmp16为分母)

    我先计算Y/1024, 为的是这个数比较能用2的幂级数展开近似求,求出来之后, 得到Y,一个除法(Y/tmp16)就是最终结果

    代码中为什么是 exp_value >> = tmp16?  它相当于 是在求一个除法,Y >>fix(x*1.4427/1024)+1

    也就是 Y / 2^[fix(x*1.4427/1024)+1]

    为什么exp的算法最后是个除法?原因是用了“换底公式”都换成2的幂去计算了


    、高斯混合模型的参数更新

    参数更新问题,很多博客已经给出了很详细的说明,比如http://blog.csdn.net/shichaog/article/details/52399354  【这里感谢博主】

    噪声均值的更新 参考代码 vad_sp.c中的  WebRtcVad_FindMinimum 函数



    从这个公式我们就可以看出来了,对于noise的mean增大,比较抠门,尽可能的保持原有的噪声水平不变

    对缩小,放的比较开,这是为了保证噪声跟进能比较准确


    对于下面的参数更新,我这里做一些啰嗦的说明,以便大家理解的更好一些,【先放成果照片,拜大神,后面我再详细说明】



    偏导公式太复杂了,我也记不住,用matlab来算吧

    代码最核心的更新部分:GmmProbability函数中



    展开全文
  • WebRTCVAD算法

    万次阅读 热门讨论 2016-09-01 14:40:04
    VAD(Voice Activity Detection)算法的作用是检测语音,在远场语音交互场景中,VAD面临着两个难题: 1. 可以成功检测到最低能量的语音(灵敏度)。 2. 如何在多噪环境下成功检测(漏检率和虚检率)。 漏检反应的是...

     

    我的书:

    购买链接:

    京东购买链接

    淘宝购买链接

    当当购买链接

    VAD(Voice Activity Detection)算法的作用是检测语音,在远场语音交互场景中,VAD面临着两个难题:

    1.    可以成功检测到最低能量的语音(灵敏度)。
    2.    如何在多噪环境下成功检测(漏检率和虚检率)。
    漏检反应的是原本是语音但是没有检测出来,而虚检率反应的是不是语音信号而被检测成语音信号的概率。相对而言漏检是不可接受的,而虚检可以通过后端的ASR和NLP算法进一步过滤,但是虚检会带来系统资源利用率上升,随之系统的功耗和发热会进一步增加,而这会上升为可移动和随声携带设备的一个难题。
    本文基于WebRTC的AEC算法,WebRTC的VAD模型采用了高斯模型,这一模型应用极其广泛。

    高斯分布

    高斯分布又称为正态分布(Normal distribution/Gaussian distribution)。
    若随机变量X服从一个数学期望为μ,标准差为σ^2的高斯分布,则:
    X~N(μ,σ^2)
    其概率密度函数为:
    f(x)=1/(√2π σ) e^(-〖(x-u)〗^2/(2σ^2 ))
    高斯在webRTC中的使用:
    f(x_k |Z,r_k)=1/√2π e^(-(x_k-u_z )^2/(2σ^2 ))
    x_k是选取的特征向量,webRTC中指x_k是六个子带的能量(子带是80~250Hz,250~500Hz,500Hz~1K, 1~2K,2~3K,3~4KHz,变量feature_vector存放的就是子带能量序列),r_k是均值u_z和方差σ的参数结合,这两个参数决定了高斯分布的概率。Z=0情况是计算噪声的概率,Z=1是计算是语音的概率。

    这里采用最高频率是4KHz的原因是,webRTC中程序将输入(48KHz,32HKz,16KHz)都下采样到8KHz,这样根据奎斯特频率定理,有用的频谱就是4KHz以下。

    当然也可以采用8KHz截止频率,这样就需要自己训练和修改高斯模型的参数了,这个算法我试过,要比基于DNN的方法好用,灵活性大些,体现在参数自适应更新上,举例来说,在夜晚安静家庭场景中,噪声的均值就比较低的,白天周边环境噪声多了时,噪声特征的均值也会随之调整,针对DNN的方法,参数一旦训练完毕,那么适用的场景的就定了,如果要增大适用场景,首先要收集目标场景的数据,标注好的数据重新训练(通常要增加参数数量),这样的过程会导致1.数据收集成本高,2.参数过多计算代价大(VAD一般是一直工作的)。

     

    Webrtc采用的是GMM模型

    等待视频链接地址。

    WebRTC算法流程

    1.设置VAD激进模式

    共四种模式,用数字0~3来区分,激进程度与数值大小正相关。
    0: Normal,1:low Bitrate, 2:Aggressive;3:Very Aggressive
    这些激进模式是和以下参数是息息相关的。

    <comman_audio/vad/vad_core.c>
    // Mode 0, Quality.
    static const int16_t kOverHangMax1Q[3] = { 8, 4, 3 };
    static const int16_t kOverHangMax2Q[3] = { 14, 7, 5 };
    static const int16_t kLocalThresholdQ[3] = { 24, 21, 24 };
    static const int16_t kGlobalThresholdQ[3] = { 57, 48, 57 };
    // Mode 1, Low bitrate.
    static const int16_t kOverHangMax1LBR[3] = { 8, 4, 3 };
    static const int16_t kOverHangMax2LBR[3] = { 14, 7, 5 };
    static const int16_t kLocalThresholdLBR[3] = { 37, 32, 37 };
    static const int16_t kGlobalThresholdLBR[3] = { 100, 80, 100 };
    // Mode 2, Aggressive.
    static const int16_t kOverHangMax1AGG[3] = { 6, 3, 2 };
    static const int16_t kOverHangMax2AGG[3] = { 9, 5, 3 };
    static const int16_t kLocalThresholdAGG[3] = { 82, 78, 82 };
    static const int16_t kGlobalThresholdAGG[3] = { 285, 260, 285 };
    // Mode 3, Very aggressive.
    static const int16_t kOverHangMax1VAG[3] = { 6, 3, 2 };
    static const int16_t kOverHangMax2VAG[3] = { 9, 5, 3 };
    static const int16_t kLocalThresholdVAG[3] = { 94, 94, 94 };
    static const int16_t kGlobalThresholdVAG[3] = { 1100, 1050, 1100 };

    它们在计算高斯模型概率时用到。

    2帧长设置

    A)    共有三种帧长可以用到,分别是80/10ms,160/20ms,240/30ms,实际上目前只支持10ms的帧长。
    B)    其它采样率的48k,32k,24k,16k会重采样到8k来计算VAD。
           之所以选择上述三种帧长度,是因为语音信号是短时平稳信号,其在10ms~30ms之间可看成平稳信号,高斯马尔科夫等信号处理方法基于的前提是信号是平稳的,在10ms~30ms,平稳信号处理方法是可以使用的。

    3 高斯模型中特征向量选取

    在WebRTC的VAD算法中用到了聚类的思想,只有两个类,一个类是语音,一个类是噪声,对每帧信号都求其是语音和噪声的概率,根据概率进行聚类,当然为了避免一帧带来的误差也有一个统计量判决在算法里,那么问题来了,选择什么样的特征作为高斯分布的输入呢?这关系到聚类结果的准确性,也即VAD性能,毋庸置疑,既然VAD目的是区分噪声和语音,那么噪声信号和语音信号这两种信号它们的什么特征相差最大呢?选择特征相差比较大自然能得到比较好的区分度。
      众所周知,信号的处理分类主要有时域,频域和空域,从空域上看,webRTC的VAD是基于单麦克的,噪声和语音没有空间区分度的概念,在多麦克风场景,确实基于多麦克风的VAD算法,从时域上看,而者都是时变信号,且短时信号变化率比较小,所以推算来推算去只有频域的区分度可能是比较好的。

    汽车噪声频谱

    粉红噪声频谱

    白噪声频谱

    语音声谱

     从以上四个图中,可以看到从频谱来看噪声和语音,它们的频谱差异还是比较大,且以一个个波峰和波谷的形式呈现。
      WebRTC正式基于这一假设,将频谱分成了6个子带。它们是:
        80Hz~250Hz,250Hz~500Hz,500Hz~1K,1K~2K,2K~3K,3K~4K。分别对应于feature[0],feature[1],feature[2],...,feature[5]。
    可以看到以1KHz为分界,向下500HZ,250Hz以及170HZ三个段,向上也有三个段,每个段是1KHz,这一频段涵盖了语音中绝大部分的信号能量,且能量越大的子带的区分度越细致。
      我国交流电标准是220V~50Hz,电源50Hz的干扰会混入麦克风采集到的数据中且物理震动也会带来影响,所以取了80Hz以上的信号。

    在webRTC计算的函数在filter_bank.c文件中,前面说的基于激活的DNN也可以是基于fbank特征。

    高通滤波器设计

    高通滤波器的作用有两点:1.滤除直流分量,2提升高频成分(人耳对3.5KHz最为敏感)

    // High pass filtering, with a cut-off frequency at 80 Hz, if the |data_in| is
    // sampled at 500 Hz.
    //
    // - data_in      [i]   : Input audio data sampled at 500 Hz.
    // - data_length  [i]   : Length of input and output data.
    // - filter_state [i/o] : State of the filter.
    // - data_out     [o]   : Output audio data in the frequency interval
    //                        80 - 250 Hz.
    static void HighPassFilter(const int16_t* data_in, size_t data_length,
                               int16_t* filter_state, int16_t* data_out) {
      size_t i;
      const int16_t* in_ptr = data_in;
      int16_t* out_ptr = data_out;
      int32_t tmp32 = 0;
    
    
      // The sum of the absolute values of the impulse response:
      // The zero/pole-filter has a max amplification of a single sample of: 1.4546
      // Impulse response: 0.4047 -0.6179 -0.0266  0.1993  0.1035  -0.0194
      // The all-zero section has a max amplification of a single sample of: 1.6189
      // Impulse response: 0.4047 -0.8094  0.4047  0       0        0
      // The all-pole section has a max amplification of a single sample of: 1.9931
      // Impulse response: 1.0000  0.4734 -0.1189 -0.2187 -0.0627   0.04532
    
      for (i = 0; i < data_length; i++) {
        // All-zero section (filter coefficients in Q14).
        tmp32 = kHpZeroCoefs[0] * *in_ptr;
        tmp32 += kHpZeroCoefs[1] * filter_state[0];
        tmp32 += kHpZeroCoefs[2] * filter_state[1];
        filter_state[1] = filter_state[0];
        filter_state[0] = *in_ptr++;
    
        // All-pole section (filter coefficients in Q14).
        tmp32 -= kHpPoleCoefs[1] * filter_state[2];
        tmp32 -= kHpPoleCoefs[2] * filter_state[3];
        filter_state[3] = filter_state[2];
        filter_state[2] = (int16_t) (tmp32 >> 14);
        *out_ptr++ = filter_state[2];
      }
    }
    

    WebRTC在设计该滤波器上还是很有技巧的,技巧有二:
    1.    定点数计算,指两个方面,一是滤波系数量化,而是计算过程的定点化,高斯模型计算也使用了这一技巧。
    2.    舍入技巧,减少运算量。
    下面就来看看,这些技巧是如何使用的,首先根据代码的注释可以看出,
    全零点和全极点脉冲响应的实际上是浮点数,它们脉冲响应分别是:
    0.4047 -0.8094  0.4047  0       0        0
    1.0000  0.4734 -0.1189 -0.2187 -0.0627   0.04532
    所以可见应该是六阶方程,但是超过3阶后,零点全零,极点数值较小,这时适当增大第三个数值,达到减少计算次数的目的。
     

    量化是按照2的十四次方进行定点化。这是因为最差情况下,零极点的放大倍数不超过两倍,所以16位数可以表示的下来。其零极点绘图如下:


    对这两个图的解释就忽略了,能够看懂上述代码和两张图的意义,就可以更改滤波器的特性了,对不要相位信息的,采用IIR比FIR达到相同的增益平坦度需要的阶数要少。关于高通滤波器的设计还有疑问的可以留言共同交流。频响如下:

    WebRtcVad_CalculateFeatures函数计算每个子带的能量。能量结果存放在features数组里,然后调用GmmProbability计算概率。

    int WebRtcVad_CalcVad8khz(VadInstT* inst, const int16_t* speech_frame,
                              size_t frame_length)
    {
        int16_t feature_vector[kNumChannels], total_power;
    
        // Get power in the bands
        total_power = WebRtcVad_CalculateFeatures(inst, speech_frame, frame_length,
                                                  feature_vector);
    
        // Make a VAD
        inst->vad = GmmProbability(inst, feature_vector, total_power, frame_length);
    
        return inst->vad;
    }
    

    计算流程

    高斯模型有两个参数H0和H1,它们分表示的是噪声和语音,判决测试使用LRT(likelihood ratio test)。分为全局和局部两种情况。

    a)高斯概率计算采用的高斯公式如下:

    这里其实采用了两个参数高斯分布,但是假设了这两个参数是相互独立的:

    这里要做个简化以减少计算量。将这两个高斯看成是不相关的,

    这里可以看到做了三个简化,第一个是把指数前的系数省掉了,这是因为在做似然比检验时,可以消掉,第二个简化是假设这两个高斯分布是不相关的,第三个简化是将乘法近似化简成加法。使用高斯分布这个在kaldi中也有例子,kaldi中基于GMM的语言模型分成三种,第一种是类似这里的独立同分布模型,第二种是互相关对角阵元素非零,第三种是全高斯互相关模型。

    用多个高斯来近似一个语音包络这种方法,在插值时也用到,即用多个sinc函数进行分数位插值。

    c)对数似然比,分为全局和局部,全局是六个子带之加权之和,而局部是指每一个子带则是局部,所以语音判决会先判断子带,子带判断没有时会判断全局,只要有一方过了,就算有语音,公式表达如下:

    后记:

    和判决准则相关的参数在vad_core.c文件,他们是:

    // Spectrum Weighting
    static const int16_t kSpectrumWeight[kNumChannels] = { 6, 8, 10, 12, 14, 16 };
    static const int16_t kNoiseUpdateConst = 655; // Q15
    static const int16_t kSpeechUpdateConst = 6554; // Q15
    static const int16_t kBackEta = 154; // Q8
    // Minimum difference between the two models, Q5
    static const int16_t kMinimumDifference[kNumChannels] = {
        544, 544, 576, 576, 576, 576 };
    // Upper limit of mean value for speech model, Q7
    static const int16_t kMaximumSpeech[kNumChannels] = {
        11392, 11392, 11520, 11520, 11520, 11520 };
    // Minimum value for mean value
    static const int16_t kMinimumMean[kNumGaussians] = { 640, 768 };
    // Upper limit of mean value for noise model, Q7
    static const int16_t kMaximumNoise[kNumChannels] = {
        9216, 9088, 8960, 8832, 8704, 8576 };
    // Start values for the Gaussian models, Q7
    // Weights for the two Gaussians for the six channels (noise)
    static const int16_t kNoiseDataWeights[kTableSize] = {
        34, 62, 72, 66, 53, 25, 94, 66, 56, 62, 75, 103 };
    // Weights for the two Gaussians for the six channels (speech)
    static const int16_t kSpeechDataWeights[kTableSize] = {
        48, 82, 45, 87, 50, 47, 80, 46, 83, 41, 78, 81 };
    // Means for the two Gaussians for the six channels (noise)
    static const int16_t kNoiseDataMeans[kTableSize] = {
        6738, 4892, 7065, 6715, 6771, 3369, 7646, 3863, 7820, 7266, 5020, 4362 };
    // Means for the two Gaussians for the six channels (speech)
    static const int16_t kSpeechDataMeans[kTableSize] = {
        8306, 10085, 10078, 11823, 11843, 6309, 9473, 9571, 10879, 7581, 8180, 7483
    };
    // Stds for the two Gaussians for the six channels (noise)
    static const int16_t kNoiseDataStds[kTableSize] = {
        378, 1064, 493, 582, 688, 593, 474, 697, 475, 688, 421, 455 };
    // Stds for the two Gaussians for the six channels (speech)
    static const int16_t kSpeechDataStds[kTableSize] = {
        555, 505, 567, 524, 585, 1231, 509, 828, 492, 1540, 1079, 850 };

    参数更新

    噪声均值更新,WebRtcVad_FindMinimum函数对每个特征,求出100个帧里头的前16个最小值。每个最小值都对应一个age,最大不超过100,超过100则失效,用这个最小值来跟新噪声。

    模型参数跟新

    跟新噪声均值,语音均值,噪声方差,语音方差,自适应也就体现在这里。

    噪声跟新:只在非语音帧进行跟新,

    另外:

    现在也有基于DNN方法的进行VAD检测的,简单的检测使用两层LSTM外交BN(batch normalization)就可以实现这个功能。

    展开全文
  • 使用ubuntu环境编译 从webrtc中抽离vad代码 编译后生成libwebrtc_vad_my.so test目录下是测试demo 将长语音中得speech片段分割保存成wav文件,在较高信噪比得测试文件中断句效果良好
  • WebRtcVAD算法解析

    千次阅读 2016-03-17 14:25:57
    摘要:本篇文章主要讲述VAD算法的原理并且列举相关公式。该VAD的算法主要用了2 个 models 来对语音建模,并且分成噪声类和语音类。通过比较似然比的方法来确定是否是语音。其中有三个模式可以选择,每个模式算法是...

    摘要:本篇文章主要讲述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)}}

    展开全文
  • webrtcvad python——语音端点检测

    万次阅读 2017-02-07 14:16:29
    py-webrtcvad 语音端点检测算法说明webrtc的vad使用GMM(Gaussian Mixture Mode)对语音和噪音建模,通过相应的概率来判断语音和噪声,这种算法的优点是它是无监督的,不需要严格的训练。GMM的噪声和语音模型如下:p...
  • WEBRTCVAD算法及思想的数学解析

    千次阅读 多人点赞 2018-11-21 21:11:48
    版权声明:本文为博主原创文章,未经博主允许不得转载。 0 概述 VAD(Voice Activity Detection), 活动...WebRtcVad_GaussianProbability 正是用于计算上述概率值的函数,该函数采用巧妙计算机数值计算,近似地求解...
  • webrtcvad-2.0.10.tar.gz

    2019-05-27 16:07:51
    图像特征检测算法-SIFT的Python实现,下载的文件为vlfeat-0.9.20-bin.tar.gz,解压缩后,将vlfeat-0.9.20/bin/win64文件夹下的sift.exe和vl.dll拷贝到当前工作目录下。
  • WebRTCVAD 过程解读

    2019-09-30 07:09:24
    摘要: 在上一篇的文档中,分析unimrcp中vad算法的诸多弊端,但是有没有一种更好的算法来取代呢。...今天笔者重点介绍WebRTC VAD算法。在后面的文章中, 我们在刨析DNN在VAD的中应用。下面的章节...
  • 附完整C代码 WebRTC提供一套音频处理引擎,包含以下算法:AGC自动增益控制(Automatic Gain Control)ANS噪音抑制(Automatic Noise Suppression)AEC是声学回声消除(Acoustic Echo Canceller for Mobile)VAD是静音检测...
  • WebRTC提供一套音频处理引擎, 包含以下算法: AGC自动增益控制(Automatic Gain Control) ANS噪音抑制(Automatic Noise Suppression) AEC是声学回声消除(Acoustic Echo Canceller for Mobile) VAD是静音检测...
  • 本系列介绍Webrtc的agc算法webrtc的agc算法对各种情况作了较为详尽的考虑,而且使用了的定点数的方法来实现,因此内容比较多。尽量在这几篇文章中描述清楚。 一、WebRtcAgc_AddFarend 该函数调用了WebRtcAgc_...
  • 关于webrtcVAD(voice activity dectctor)算法说明  webrtcvad使用GMM(Gaussian Mixture Model)对语音和噪声建模,通过相应的概率来判断语音和噪声。这种算法 的优点是它是无监督的,不需要严格的训练。GMM的...
  • 顾名思义,VAD(Voice Activity Detection)算法的作用是检测是否是人的语音,它的使用 范围极广,降噪,语音识别等领域都需要有vad检测。vad检测有很多方法,这里我们之介绍一 下webrtc里面的vad检测。  webrtc...
  • webrtc 音频VAD 检测

    千次阅读 2016-08-08 18:09:19
    摘要:本文主要讲述VAD算法的提取和一些原理 参考文章: http://billhoo.blog.51cto.com/2337751/1213801 http://blog.csdn.net/ssdzdk/article/details/42876011 1.模块提取a. 代码目录,具体工程可以到百度...
  • 这将安装.NET标准适配器(WebRtcVadSharp.dll)和包含支持WebRTC算法的非托管库(WebRtcVad.dll)。 用法 在最简单的情况下,您只需要实例化一个对象并为它提供一个byte[]音频。 bool DoesFrameContainSpeech ( ...
  • webrtc中的VAD 语音检测

    千次阅读 2019-10-16 11:41:42
    VAD(Voice Activity Detection)算法的作用是检测是否是人的语音,它的使用范围极广,降噪,语音识别等领域都需要有vad检测。vad检测有很多方法,这里我们之介绍一下webrtc里面的vad检测。  webrtcvad检测原理...
  • 基于WebRTC的AGC算法

    千次阅读 2019-07-25 10:00:38
    烟感项目中的3A算法是基于WebRTC的,AGC算法进行了简化,算法简单描述为通过VAD判断语音,并增大幅值。 TAgc_Proess调用TAgc_VirtualMic(用虚拟麦克风音量调节幅度)和TAgc_process TAgc_process调用TAgc_...
  • WebRTC之语音活动检测(VAD算法

    千次阅读 2017-08-03 20:07:08
    VAD(Voice Activity Detection)算法的作用是检测语音,在远场语音交互场景中,VAD面临着两个难题: 1. 可以成功检测到最低能量的语音(灵敏度)。 2. 如何在多噪环境下成功检测(漏检率和虚检率)。 漏检反应的是...
  • webrtc语音增强处理算法综述

    千次阅读 2018-05-15 10:44:50
    作为实时音视频通信框架的webrtc,里面有着丰富的语音处理算法,其中主要涉及到AEC(声学回声抑制),NS(噪音抑制),AGC(自增益控制),VAD(语活检测)和CNG(舒适噪声)等。语音处理数据分为近端和远端,近端...
  • webrtc开源库

    2019-02-08 08:24:24
    视频会议开源库,里面包含大多数常用音频算法,包括降噪、VAD算法的c代码实现
  • 替换unimrcp的VAD模块

    2019-09-30 07:09:26
    摘要: unimrcp vad 模块voice activity dector一直认为比较粗暴,而且unimrcp的社区也很久没有更新了。...这篇文章介绍如何使用webRtc vad模块替换原来的算法。 【题外话:昨天开了题目,因为有事,没有...
  • WebRTC中的常用术语

    2020-06-06 11:20:59
    相信大家在阅读WebRTC源码的过程中,经常会遇到一些...1. VAD(Voice Activity Detection)算法的作用是检测语音。 2. AGC(Auto Gain Control),自动增益控制。 3. ANS(Auto Noise Suppression),自动噪声抑制。
  • webrtc 源码阅读——audioprocessing

    千次阅读 2016-12-09 15:07:35
    webrtc 作为一个流媒体...同时加入了AGC(自动增益)、NS(降噪)、AEC(回声消抑)、VAD(静音检测)等一系列算法。这些算法主要在采集过后,编码之前进行处理,代码集中在audioprocessing module,简称APM。下面是audiopro
  • EM算法

    千次阅读 2017-11-01 18:52:09
    前一篇文章提到了基于统计模型的VAD决策方法,在看《WebRTCVAD算法,http://blog.csdn.net/shichaog/article/details/52399354》时,其计算概率使用的高斯参数是给定的,那么问题来了; 1.webrtc中给定的参数是...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
热门标签
关键字:

webrtcvad算法