您的位置:首页 > 其它

关于语音端点检测(Voice Activity Detection,VAD)的一些汇总

2018-06-01 16:19 323 查看

转载于:https://blog.csdn.net/c602273091/article/details/44340451 《语音识别之端点检测》

            https://blog.csdn.net/ffmpeg4976/article/details/52349007 《详解语音处理检测技术中的热点--端点检测、降噪和压缩》

            https://www.zhihu.com/question/20398418 《语音识别的技术原理是什么? --知乎》

            https://www.cnblogs.com/talkaudiodev/p/7041477.html 《音频开发基础知识介绍》

            https://blog.csdn.net/kevindgk/article/details/52924779 《音频(一)-音频基础知识》

            http://www.doc88.com/p-150262550007.html  《端点检测几种方法比较》


完整的amr编码器还包括语音激活检测(VAD)和丢帧、错帧的消除。VAD的作用是检测当前输入信号中是否有语音,它的输入是输入信号本身和AMR编码器计算出来的参数集,VAD用这个信息来决定每20ms语音帧中是否包括语音。在VAD没有检测到语音的情况下,AMR采用8种速率之外的低速率噪声编码模式,以节省移动台的功率,降低整个网络的干扰和负载。此外,当语音帧由于传输错误而丢失时,为了使接听者感觉不到丢帧,应完成丢帧和错帧的消除,并用预测的参数集进行语音合成。

在语音增强中,我们希望从带噪语音信号中剔除噪音,得到纯净的语音信号,第一步就是提取噪音信息。通常的思路是通过VAD函数得到非语音片段,而非语音片段可以认为是纯噪音片段。从而可以从纯噪音信号中提取出有用信息,例如进行傅里叶变换得到噪音频谱等,再进而做下一步处理。例如谱减法,维纳滤波。此处不作讨论。

VAD有很多种方法,此处介绍一种最简单直接的办法。 通过short timeenergy (STE)和zero cross counter (ZCC) 来测定。(实际上精确度高的VAD会提取4种或更多的特征进行判断,这里只介绍两种特征的基本方法)。

l  STE: 短时能量,即一帧语音信号的能量

l  ZCC: 过零率,即一帧语音时域信号穿过0(时间轴)的次数。

理论基础是在信噪比(SNR)不是很低的情况下,语音片段的STE相对较大,而ZCC相对较小;而非语音片段的STE相对较小,但是ZCC相对较大。因为语音信号能量绝大部分包含在低频带内,而噪音信号通常能量较小且含有较高频段的信息。

故而可以通过测量语音信号的这两个特征并且与两个门限(阈值)进行对比,从而判断语音信号与非语音信号。

通常对语音信号分帧时取一帧20ms (因为一般会进行短时傅里叶变换,时域和频域的分辨率需要一个平衡,20ms为平衡点,此处不用考虑)。此处输入信号采样率为8000HZ。因此每一帧长度为160 samples.

STE的计算方法是 , 即帧内信号的平方和。

在本文中ZCC的计算方法是,将帧内所有sample平移1,再对应点做乘积,符号为负的则说明此处过零,只需将帧内所有负数乘积数目求出则得到该帧的过零率。VAD(Voice Activity Detection)基于能量的特征常用硬件实现,谱(频谱和倒谱)在低信噪比(SNR)可以获得较好的效果。当SNR到达0dB时,基于语音谐波和长时语音特征更具有鲁棒性。 
当前的判决准则可以分为三类:基于门限,统计模型和机器学习。基于能量的准则是检测信号的强度,并且假设语音能量大于背景噪声能量,这样当能量大于某一门限时,可以认为有语音存在。然而当噪声大到和语音一样时,能量这个特征无法区分语音还是纯噪声。 
早先基于能量的方法,将宽带语音分成各个子带,在子带上求能量;因为语音在2KHz以下频带包含大量的能量,而噪声在2~4KHz或者4KHz以上频带比0~2HKz频带倾向有更高的能量。这其实就是频谱平坦度的概念,webrtc中已经用到了。在信噪比低于10dB时,语音和噪声的区分能力会加速下降。    可以将一段语音片段分为 静音段、过度段、语音段、结束。比较常用的VAD技术是基于短时能量和过零率的双门限端点检测。1. 分别对短时能量和过零率设置两个门限值energy_low, energy_high和zcr_low, zcr_highenergy_high > energy_lowzcr_high > zcr_low2. 计算一帧的短时能量enegry和过零率zcr若enegry > energy_low && zcr > zcr_low,则进入过度段3. 计算一帧的短时能量和过零率,若enegry > energy_high && zcr > zcr_high, 此时还不能断定语音开始,继续计算几帧短时能量和过零率,若enegry > energy_high && zcr > zcr_high,则可判定语音开始。 能量双门限VAD流程图:  基于短时能量和短时平均过零率的端点检测介绍:          数字“4”的短时能量与平均过零率 音频端点检测就是从连续的语音流中检测出有效的语音段。它包括两个方面,检测出有效语音的起始点即前端点,检测出有效语音的结束点即后端点。可以降低存储或传输的数据量,在有些应用场景中,使用端点检测可以简化人机交互,比如在录音的场景中,语音后端点检测可以省略结束录音的操作。语音信号是一个以时间为自变量的一维连续函数,计算机处理的语音数据是语音信号按时间排序的采样值序列,这些采样值的大小同样表示了语音信号在采样点处的能量。采样点的能量值通常使用采样值的平方,一段包含N个采样点的语音的能量值可以定义为其中各采样值的平方和。这样,一段语音的能量值既与其中的采样值大小有关,又与其中包含的采样点数量有关。为了考察语音能量值的变化,需要先将语音信号按照固定时长比如20毫秒进行分割,每个分割单元称为帧,每帧中包含数量相同的采样点,然后计算每帧语音的能量值。如果音频前面部分连续M0帧的能量值低于一个事先指定的能量值阈值E0,接下来的连续M0帧能量值大于E0,则在语音能量值增大的地方就是语音的前端点。同样的,如果连续的若干帧语音能量值较大,随后的帧能量值变小,并且持续一定的时长,可以认为在能量值减小的地方即是语音的后端点。现在的问题是,能量值阈值E0怎么取?M0又是多少?理想的静音能量值为0,故上面算法中的E0理想状态下取0。不幸的是,采集音频的场景中往往有一定强度的背景音,这种单纯的背景音当然算静音,但其能量值显然不为0,因此,实际采集到的音频其背景音通常有一定的基础能量值。我们总是假设采集到的音频在起始处有一小段静音,长度一般为几百毫秒,这一小段静音是我们估计阈值E0的基础。对,总是假设音频起始处的一小段语音是静音,这一点假设非常重要!!!!在随后的降噪介绍中也要用到这一假设。在估计E0时,选取一定数量的帧比如前100帧语音数据(这些是“静音”),计算其平均能量值,然后加上一个经验值或乘以一个大于1的系数,由此得到E0。这个E0就是我们判断一帧语音是否是静音的基准,大于这个值就是有效语音,小于这个值就是静音。至于M0,比较容易理解,其大小决定了端点检测的灵敏度,M0越小,端点检测的灵敏度越高,反之越低。语音应用的场景不同,端点检测的灵敏度也应该被设置为不同的值。例如,在声控遥控器的应用中,由于语音指令一般都是简单的控制指令,中间出现逗号或句号等较长停顿的可能性很小,所以提高端点检测的灵敏度是合理的,M0设置为较小值,对应的音频时长一般为200-400毫秒左右。在大段的语音听写应用中,由于中间会出现逗号或句号等较长时间的停顿,宜将端点检测的灵敏度降低,此时M0值设置为较大值,对应的音频时长一般为1500-3000毫秒。所以M0的值,也就是端点检测的灵敏度,在实际中应该做成可调整的,它的取值要根据语音应用的场景来选择。以上只是语音端点检测的很简单的一般原理,实际应用中的算法远比上面讲的要复杂。  要对声音进行分析,需要对声音分帧,也就是把声音切开成一小段一小段,每小段称为一帧。分帧操作一般不是简单的切开,而是使用移动窗函数来实现,这里不详述。帧与帧之间一般是有交叠的,就像下图这样:  图中,每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。 在用VAD算法确定静音和语音数据的开始和起止点之前,需要对语音数据进行处理,然后再计算语音数据的开始和起止点,这个过程称为数据的预处理,有些VAD算法是基于短时能量和过零率实现的,并不进行预处理操作,但实验表明,对数据进行预处理之后的效果要比不进行预处理的效果好。可以对数据进行去除直流加窗两个预处理。 采样频率的设置:我们人耳一般可以听到的频率最高就是16000HZ。根据采样定理,一般采样频率要是这个的两倍才不会发生混叠。所以我们在通话的时候采样频率一般是8Khz带宽就需要16Khz。这样就基本可以使得通话的体验非常到位,还原度非常高!不是说采样频率越高声音的效果就越好,这是一个此消彼长的情况。这一次我们采样就用16Khz,这样其实已经可以把基本的声音采下来。因为人耳对于低频还是更加敏感!现在的高保真就是44.1Khz的采样率。


阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: