重点端点检测Word文档格式.docx
《重点端点检测Word文档格式.docx》由会员分享,可在线阅读,更多相关《重点端点检测Word文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
而语音信号的清音段,对于语音的质量起着非常重要的作用。
另一方面,较大的干扰信号,又有可能被当成是语音信号,造成语音激活的虚检。
如可能出现弱摩擦音和鼻韵被切除、误将爆破音的寂静段或字与字的间隔认为是语音的结束、误将冲击噪声判决为语音等情况,因而实际运用中,如果处理的不好,则效果欠佳。
为了克服传统端点检测算法的缺点,已有很多改进方法被提出来。
例如,可以考虑采用基于相关性的语音端点检测算法。
这种方法依据的理论是:
语音信号具有相关性,而背景噪声则无相关性。
因而利用相关性的不同,可以检测出语音,尤其是可以将清音从噪声中检测出来。
为此,可以定义一种有效的相关函数,并且通过实验可以找到判别门限设定方法以及防止漏检和虚检的方法[6]。
3语音信号端点检测vad算法的探讨和实现
本课题的端点检测算法,该算法采用的是非实时运行的,并且在实现端点检测时,是在MATLAB下运行实现的,在MATLAB中,声音文件是扩展名为wav文件中获取语音采样,所以在进行端点检测之前要将声音文件先处理和转换为wav文件格式的声音文件,再将其分帧并计算短时能量和过零率参数,然后进行端点检测。
这种工作方式被称为离线(off-line)处理方法,而实时的处理方法则是在线(on-line)的。
以下将对语音信号的分帧,短时能量,过零率以及端点检测进行探讨和实现。
3.1语音信号的分帧
对语音信号进行分帧,本课题采用了voicebox工具箱中的函数enframe。
其函数主要功能是将待端点检测的声音文件进行分帧,进行语音信号的采样,以便计算短时能量和过零率,为端点检测做基本的准备,在进行分帧时,根据实际的要求定义帧的属性,比如帧长和帧移。
在使用这个函数时,非常方便,只用将其加入到MATLAB的搜索路径,就可以直接使用该函数了。
Enframe函数的语法为:
f=enframe(x,len,inc);
这里x为输入语音信号,len指定了帧长,inc指定帧移。
函数返回为n*len的一个矩阵,每行都是一帧数据。
例如对大象声音的采样序列进行分帧的过程为以下所示,以下命令在MATLAB中的commandwindow里直接就可以看到变量的属性[8]。
>
y=enframe(x,240,80);
whosyx
NameSizeBytesClass
x66156x1529248doublearray
y824x2401582080doublearray
Grandtotalis263916elementsusing2111328bytes
可以看到包含语音采样的一维数组x经过enframe处理后得到二维数组y,有824行,表示总的帧数为有824帧,每行都是240个采样,为一帧,帧移是80,在进行采样时,当一帧采样完时,采样第二帧,那么就有80帧与第一次采样是一样的,这就是帧移的用法。
还可以看到属性,比如x是66156*1的矩阵,有529248bytes,y是824*240的矩阵,有1582020bytes。
如果改变帧长为120和帧移为40,输出结果如下,同样可以看到采样后变量x和y的属性如下:
y=enframe(x,120,40);
NameSizeBytesClass
y1651x1201584960doublearray
Grandtotalis264276elementsusing2114208bytes
3.2短时能量的计算
图2是数字“0”的波形图,可以看到,在7500之前的部分信号幅度很低,明显是属于静音,而在7500以后,信号幅度开始增强,并呈现比较明显的周期性。
在波形下半部分可以观察到有规律的尖峰,两个尖峰之间的距离就是所谓的基音周期,实际上也就是说话人的声带振动的周期[9]。
图2数字“0”的语音波形
由图可以很直观地想到,可以用信号的幅度作为特征,区分静音和语音。
只要设定一个门限,当信号的幅度超过该门限的时候,就认为语音开始,当幅度降低到门限以下就认为语音结束。
实际上,一般是用短时能量的概念来描述语音信号的幅度的。
对于输入的语音信号X(N),其中N为采样点,首先进行帧的操作,将语音信号分成每20—30毫秒一段,相邻两帧起始点之间的间隔为10毫秒,也就是说两帧之间有10—20毫秒的交叠。
由于采样频率的差异,帧长和帧移所对应的实际采样点数也是不同的。
对于8KHZ采样频率,30毫的帧长对应240点,记为N,而10毫秒的帧移对应80点,记为M[11]。
对于第i帧,第n个样本,它与原始语音信号的关系为:
xi(n)=x[(i-1)M+n]
第i帧语音信号的短时能量可以用下面几种算法得到:
e(i)=Σ|xi(n)|
e(i)=Σx²
n(n)
e(i)=∑logx²
三种定义的短时能量分别用下面三行MATLAB命令实现:
amp1=sum(abs(y),2);
amp2=sum(y.*y,2);
amp3=sum(log(y.*y+eps),2);
其中amp3中之所以加上小的浮点数eps,是为了防止log运算中可能出现的溢出。
以下利用语音信号分帧的帧长和帧移的不同取值,对三种短时能量的图形进行分析。
图3为当帧长len=240,帧移inc=80时,大象声音的三种短时能量的图形:
图3len=240,inc=80大象三种短时能量图
图4为当帧长len=120,帧移inc=40时,大象声音的三种短时能量的图形:
图4len=120,inc=40大象三种短时能量图
由以上两图可以看出,三种能量的输出要由语音信号的分帧函数enframe决定,当分帧的帧长和帧移比较大的时候,那么输出的短时能量值就比较大,当语音信号的分帧的帧长和帧移比较小的时候,那么输出的短时能量值就比较小。
而且由以上两图可以看出,图3相对应的值几乎是图4的两倍,这主要是图3的帧长和帧移的取值是图4的两倍,并且短时能量的主要是对矩阵y求和的过程,所以从图形中可以直观地看到,不同的帧长和帧移对短时能量输出的影响[7]。
能量之前应用该滤波器,还可以起到消除直流漂移、抑制随机噪声和提升清音部分能量的效果。
将这些写在MATLAB语句是[12]:
amp=sum(abs(enframe(filter([1-0.9375],1,x),framelen,frameinc)),2);
在这里采用的是绝对值能量,实际上就是平均幅度。
3.3过零率的计算
将语音信号分帧后计算每帧的短时能量,再设定一个门限,就可以实现一个简单的端点检测算法。
但是这样的算法是很不可靠的,因为人的语音分清音和浊音两种,浊音为声带振动发出,对应的语音信号有幅度高,周期性明显的特点,而清音则不会有声带的振动,只是靠空气在口腔中的摩擦,冲击或爆破而发声,其短时能量一般比较小,如声母“s”,“c”等的幅度很低,往往会基于能量的算法漏过去。
图5显示的是数字“7”的波形,可见声母“q”的范围约为6500-7500,其幅度明显比后面的幅度低,而比前面的静音部分高。
声母“s”和“c”的幅度往往更低,以至于有时用肉眼都难以与静音部分相辨别,因此基于能量的算法对这些清音信号几乎无能为力[9]。
图5数字“7”的波形
对于图5的静音段声母开始段,可以发现静音和声母的区分点大致在6550左右。
尽管此时不能用短时能量可靠地区分,但是可以发现在静音段信号的波形变化相对比较缓慢,而在清音段,由于口腔空气摩擦的效果,所造成的波形在幅度上的变化比较剧烈,通常可以用一帧信号中波形穿越零电平的次数来描述这种变化的剧烈程度,称为过零率。
实际应用中,为了避免静音段的随机噪声产生过高的过零率,通常都先设定一个门限,当前后两个采样的符号不同,而且差值大于该门限的时候,就将过零率的数值加1。
在MATLAB中,用以下核心代码实现过零率:
zcr=zeros(size(y,1),1);
delta=0.02;
fori=1:
size(y,1)
x=y(i,:
);
forj=1:
length(x)-1
ifx(j)*x(j+1)<
0&
abs(x(j)-x(j+1))>
delta
zcr(i)=zcr(i)+1;
end
end
其核心思想是:
判断相邻两帧的符号是否小于零,并且两帧的差值是否大于设定的一个门限值delta,如果满足以上两个条件,那么过零率加1。
其中设置了门限delta=0.02,这是个经验值,可以进行细微的调整。
在此条件下,可以得到大象的过零率波形,如图6所示:
图6大象声音的过零率
为了进一步探讨过零率对语音信号的判断作用,分别对数字“7”和“5”进行过零率输出图形进行比较,图7为数字“7”的过零率图形,图8为数字“5”的过零率图形:
图7数字“7”的过零率
图8数字“5”的过零率
从图可以看到,数字“7”语音信号部分的幅度比较低,但是其过零率的数值却很高,峰值将近50,而在后面的韵母部分过零率则比较低,在20左右。
而数字“5”语音信号部分一开始的幅度就比较高,而过零率也比较高,随着幅度的升高,过零率也升高。
由此可见,过零率能够敏感得表示清音。
在实际应用中,通常是利用过零率来检测清音,用短时能量来检测浊音,两者配合实现可靠的端点检测。
3.4端点检测的流程和算法实现
3.4.1端点检测的流程
在开始进行端点检测之前,首先为短时能量和过零率分别确定两个门限。
一个是比较低的门限,其数值比较小,对信号的变化比较敏感,很容易就会被超过。
另一个是比较高的门限,数值比较大,信号必须达到一定的强度,该门限才可能被超过。
低门限被超过未必就是语音的开始,有可能是时间很短的噪声引起的。
高门限被超过则可以基本确信是由于语音信号引起的。
整个语音信号的端点检测可以分为四段:
静音,过渡段,语音段,结束。
程序中使用一个变量status来表示当前所处的状态。
在静音段,如果能量或过零率超过了低门限,就应该开始标记起始点,进入过度段。
在过度段中,由于参数的数值比较小,不能确信是否处于真正的语音段,因此只要两个参数的数值都回落到低门限以下,就将当前状态恢复到静音状态。
而如果在过度段中两个参数中的任一个超过了高门限,就可以确信进入语音段了。
一些突发性的噪声也可以引起短时能量或过零率的数值很高,但是往往不能维持足够长的时间,如门窗的开关、物体的碰撞等引起的噪声,这些都可以通过设定最短时间门限来判别。
当前状态处于语音段时,如果两个参数的数值降低到低门限以下,而且总的记时长度小于最短时间门限,则认为这是一段噪音,继续扫描以后的语音数据。
否则就标记好结束端点,并返回。
3.4.2端点检测算法的实现
在实现端点检测的算法中,对语音信号的分帧,设帧长len=240,帧移inc=80。
在进行端点检测之前,首先将语音信号进行幅度归一化处理到[-1,1],为了避免幅度太大,不便于分析。
在MATLAB中,用以下语句实现:
x=double(x);
x=x/max(abs(x));
在端点检测时,设置最大静音长度maxsilence=3,也就是为3*10ms=30ms,并且设置一个符号标记静音,用silence表示,在实际设置时,可以根据实际情况进行微调,不同的对象发出的声音的特点不同,比如音频,音调以及发音的连续性,比如大象发出的声音一般都是连续性的吼叫,而人发出声音,一般都是字词句,所以二者有者的最大静音长度的设置有着很大的不同,大象的最大静音长度可以设置相对小一些。
在端点检测的过程中,处于语音段的时候,那么就要对语音段中出现的静音进行判断,如果出现静音(silence)的长度小于maxsilence,那么认为静音还不够长,语音段还尚未结束,语音还在进行,将继续判断语音信号。
与此同时,还要设置一个最小噪声长度minlen=15,也就是为15*10ms=150ms,并且设置一个标记语音信号的长度,用count来表示,此参数主要是用于判断一些突发性和偶然性的噪声,比如关门声和关窗声,这些突发性的声音的能量都很大,甚至于可以达到所设定的能量的高门限,但是这些声音属于噪声,并不是我们所需要的有效语音信号部分,所以必须能够判断出来并且过滤。
在实际应用时,也可以对此参数根据实际情况进行调整。
在语音段的过程中,要对已经满足短时能量和过零率的语音信号进行进一步的判断,如果语音信号长度标记count小于最小噪声长度minlen,那么认为语音长度太短,判断为噪声[13]。
在前面的过零率计算方法用到了两重循环,其速度比较慢,为了提高算法的效率,在端点检测中采用一种矢量化的计算方法在,MATLAB中是用以下核心代码实现的:
tmp1=enframe(x(1:
end-1),FrameLen,FrameInc);
tmp2=enframe(x(2:
end),FrameLen,FrameInc);
signs=(tmp1.*tmp2)<
0;
diffs=(tmp1-tmp2)>
0.02;
zcr=sum(signs.*diffs,2);
temp1和temp2都是由X得到,但是相互之间相差一个采样点,即相邻的两帧。
signs为符号数组,用于存储相邻两个采样点的符号是否相同,即是否穿越零电频,如果为负,则表明穿越零电频,反之则没有穿越。
设置了门限0.02,这是个经验值,diffs用来度量相邻两个采样点之间的距离,要为相邻两个采样点定义一个距离门限,如果信号只是简单地穿越零电频,也不能说明是语音信号,因为一些噪声也是有可能穿越零电频,但是其幅度很小,所以就为其设置一个门限,可以有效地防止噪声。
如果距离大于门限0.02,则为1,否则为0。
然后将两个矩阵点相乘就可以得到同时满足两个基本点条件的采样点矩阵。
然后将其按帧求和,就可以得到过零率。
在计算短时能量时,主要用的时取绝对值的短时能量。
计算短时能量之前,首先将语音信号通过一个一阶高通滤波器1-0.9375z-1,可以有效滤除低频干扰,尤其是50Hz或60Hz的工频干扰,将对于语音识别更为有用的高频部分的频谱进行提升。
在计算短时能量之前应用该滤波器,还可以起到消除直流漂移、抑制随机噪声和提升清音部分能量的效果。
将这些写在MATLAB语句是:
amp=sum(abs(enframe(filter([1-0.9375],1,x),framelen,frameinc)),2);
以上进行了常数设置,以及短时能量和过零率的计算,然后分别为短时能量和过零率计算和定义两个门限,一个高门限和一个低门限。
以下将对端点检测的四个阶段进行讨论。
四个阶段:
静音,过渡段,语音段,结束,分别用0123来表示。
在静音段和过渡段(0,1),如果语音信号的短时能量amp(n)大于短时能量的高门限amp1,那么可以确信进入语音段,status=2;
静音silence=0;
语音长度标识count加1。
如果短时能量amp(n)只大于短时能量的低门限amp2或者过零率zcr(n)大于低门限zcr2,那么只能判断可能处于语音段,status=1。
在语音段
(2),如果短时能量amp(n)大于短时能量低门限amp2或者过零率zcr(n)大于过零率的低门限zcr2,那么就可以判断保持在语音段,语音长度count加1。
在语音段中,还要判断静音长度silence是否小于最大静音长度,如果小于,那么认为静音还不够长,语音还没有结束,语音还在进行,语音长度count加1。
同时也要判断语音的长度count,如果count小于最小噪声长度minlen,那么认为语音长度count太短,不是语音信号,是噪声,status=0;
count=0。
最后一个阶段,结束(3)[10]。
程序在最后还将原始语音信号、短时能量和过零率绘制出来,同时在各自图形上用红线标出了开始端点和结束端点。
该函数vad返回两个变量x1和x2分别为起始端点和结束端点的帧数。
以下为数字“7”和数字“4”的端点检测图:
图9数字“7”的端点检测图
图10数字“4”的端点检测图
由图10可以看到,声母s的短时能量明显比较低,即便是用手工标注也很容易将其误认为是噪声而切除,但是该段的过零率很高,可以很准确地区分静音和声母,这就保证了端点检测的准确性[2]。
4课题过程中遇到的困难及解决
4.1遇到的主要困难
本课题主要是为语音识别系统提供一个语音信号的端点检测功能,端点检测就是要能够确定语音信号的起点和终点,使语音识别系统处理时间减到最小,排除无声段的噪声干扰,从而使识别系统具有良好的识别功能。
所以在设计端点检测算法时,就要使端点检测具有这些功能。
在实际中主要遇到以下一些困难:
⑴本课题设计的端点检测,不仅可以检测大象的声音信号的端点,也可以检测人的声音信号的端点,在信号取样时,由于大象和人的声音特征有很大的不同,所以对一些参数的设置存在困难。
⑵在发音时,人的咂嘴声或其他某些杂音会使语音波形产生一个很小的尖峰,并可能超过所设计的门限值,所以对门限值的设定也是一个困难。
⑶在取样数据中,录音的时候有时存在突发性干扰,使短时参数变得很大,持续很短的时间后又恢复为寂静特性。
应该将其计如寂静段中。
⑷弱摩擦声或终点处是鼻音时,语音的特性与噪声极为接近,有些字的鼻韵往往还拖的很长。
⑸由于是第一次接触语音识别方面的知识,刚入手做有很多困难,比如录音设备的限制,因为在端点检测主要是在MATLAB上实现的,在MATLAB里只能识别WAV格式的文件,并且第一次使用MATLAB这个软件,与其他软件存在许多不同的地方,也是一个从头开始学习的过程[1]。
4.2困难解决
基于以上的困难,在实践中解决方法如下:
⑴对于不同的对象,比如大象和人的声音,根据各自声音的特征和通过前人的经验数据,以及自己的多次实验,对端点检测里的参数进行不同的设置,以达到更准确地确定语音信号的起点和终点。
⑵对于人的咂嘴声或其他某些杂音会使语音波形产生一个很小的尖峰,在设置门限值时,根据经验值再做细微的调整。
⑶现在对语音识别方面的知识,尤其是对语音信号的端点检测有了比较深的了解,并且运用MATLAB这个软件能够对语音信号进行端点检测,MATLAB这个软件在语音信号处理方面具有很大的优势,提供了强大的计算、纺真、矩阵处理和绘图功能,很多专家因此在自己擅长的领域用它编写了许多专门的MATLAB工具包(toolbox),比如在使用分帧时,就直接采用enframe函数,不用再编写代码。
5结论与展望
5.1结论
通过对本课题的研究,了解了一个语音识别系统包括语音信号的预处理部分、语音识别系统的核心算法部分以及语音识别系统的基本数据库等几部分。
而语音信号的预处理部分是整个语音识别系统的前提条件,端点检测是语音信号的预处理部分最基本的一个功能,做好端点检测,能使语音识别系统处理时间减到最小,排除无声段的噪声干扰,从而使识别系统具有良好的识别功能。
已经可以应用MATLAB实现对语音信号三种短时能量形式图形的输出,过零率图形的输出,并且可以进行语音信号的端点检测,以图形的方式输出,可以直观地看到语音信号的起点和终点。
5.2展望
本课题实现的端点检测是比较受限制的。
仍然会发生漏检或虚检的情况,在语音激活期的开始往往是电平较低的清音,当背景噪声较大时,清音电平与噪声电平相差无几,这时就很难进行判断,为了克服传统端点检测算法的缺点,已有很多改进方法被提出来。
这种方法依据的理论是:
为此,可以定义一种有效的相关函数,并且通过实验可以找到判别门限设定方法以及防止漏检和虚检的方法[3]。