增加。而绒毛向另一个方向弯曲时,则会引起毛细胞的超极化,即增加细胞膜电位,从而导致抑制效应。因此,内毛细胞对于流体运动速度而言,就像一个自动回零的半波整流器。在基底膜不同部位的毛细胞具有不同的电学与力学特征。在耳蜗的基部,基底膜宽而柔和,毛细胞及其绒毛也较长而柔和。正是由于这种结构上的差异,因此它们具有不同的机械谐振特性和电谐振特性。外毛细胞可在中枢神经系统的控制下调节科尔蒂器官的力学特性,内毛细胞则负责声音检测并激励传入神经发放,而内外毛细胞通过将其绒毛插入共同的耳蜗覆膜而耦合。这样,外毛细胞性质的变化可以调节内毛细胞的调谐,使整个耳蜗的动态功能处于大脑控制之下。 2.4 MATLAB中的语音信号模型
前两节均详细解释了人的发音及听觉原理。可以看出,发音过程及收听语音的过程是及其复杂的。所以对于计算机而言,是难以找到一种完全接近的算法来诠释发音及收听过程。但是,在MATLAB R2011B中,有两个函数可以用来模拟人的发音及收集语音功能,即wavplay函数跟wavreord函数。 2.4.1 wavrecord函数 wavrecord的用法: y = wavrecord(n,Fs); y = wavrecord(n,Fs,ch); y = wavrecord(n,Fs,ch,'dtype'); y = wavrecord(n,Fs,ch,'dtype');
其中n为样本数,Fs为采样频率,默认值为11025,ch为通道数,默认为1,若为2,则表示采样为双声道立体声数据,该参数可以省略,dtype为采样数据的存储格式,用字符串指定,如表2.1:
表2.1 字符串值为“dtype”以及相应的位/样品和可接受的数据范围y dtype Bits/sample y Data Range 'double' 'single' 'int16' 'uint8'
audiorecorder也可以用来录制音频,但是在操作上,因为通常采用的语音格式以wav
11
16
16 16 8 –1.0 <= y < +1.0 –1.0 <= y < +1.0 –32768 <= y <= +32767
0 <= y <= 255
格式为主,在保存语音上,wavrecord比audiorecorder能更好的与uiputfile相结合,所以用wavrecord比audiorecorder比较好。 2.4.2 wavplay函数
wavplay函数的用法: wavplay(y,Fs)
wavplay(y,Fs,mode)
其中,y为输入信号,Fs为频率,其数据类型如表2.2所示
表2.2 wavpaly的数据类型
Data Type Quantization
Double-precision(default value) Single-precision 16-bit signed integer 8-bit unsigned integer
在播放音频上,还有sound与soundsc也可以用来进行音频的回放,它们可以在任何操作系统平台上使用,而wavplay只支持Windows平台。但是因为在语音识别中,通常采用的语音格式为wav格式,而wavplay与wavrecord的配合能更好的操作运行起来,两者结合共同使用。举个例子: Fs=11025;
y=wavrecord(5*Fs,Fs,’int16’); wavplay(y,Fs);
该段代码意思为:通过Windows的录音设备以11025Hz的采样频率录制5秒的数据,采样精度为16位,存储格式为int16;随后通过Windows的音频设备进行播放 在MATLAB中处理语音信号时,可以通过wavplay回放录制好了的语音,具有快速检验数据和计算的可靠性。但是在录音时候,wavrecord有很大的局限性,在录制语音的时候必须制定语音的时间。如果时间太短或者在指定的时间内用户没有说话,就会漏掉部分或全部的语音数据,这样操作起来不方便。另外,在一个语音识别系统中,程序必须自动判断当前是静音还是用户在说话,如果用户有发出过语音,那么应该保存该段语音,然后将头部和尾部的静音部分删除掉,这一功能被称为语音信号的端点检测。
16 bits/sample
16 bits/sample 16 bits/sample 8 bits/sample
3 语音信号的端点检测
3.1 概述
在详解语音信号的端点检测之前,先来了解一下语音信号的特征,如图3.1可以看到,
12
数字“1”信号在大致4500~11000之间的采样点属于发音状态,头部跟尾部的信号幅度都很低,属于静音或噪音。
图3.1 数字“1”的时域图
图3.2是数字“1”的头部放大图,从图中可以看出,在4400之前的信号幅度很低,明显属于静音,而从4400开始,幅度开始增强,并且有明显的周期性,两个尖峰之间的距离就是所谓的基音周期,也就是人的声带振动的周期。
这样的话,我们可以用信号的幅度作为特征,区分静音和语音。只要设定一个门限,当信号幅度超过这个门限的时候,就当作语音开始,当幅度降低到门限以下的时候就认为语音结束。
图3.2 数字“1”头部放大图
13
因此,我们可以采用短时能量来描述语音信号的幅度。比如,对于一个读取到的语音信号x(n),其中n为采样点,首先进行分帧,将语音信号分为每20~30ms一段,相邻两帧起始点之间间隔为10ms,也就是说两帧之间有10~20ms的交叠。由于采样频率的差异,帧长和帧移所对应的实际采样点数都不一样。举个例子:一个8kHz的采样频率,30ms的帧长对应240点,记为N,而10ms的帧移对应为80点,记为M。 对应第i帧,第n个样本,它与原始语音信号的关系为:
xi(n)=x[(i-1)M+n]
第i帧的语音信号的短时能量就可以用下面几种算法得到:
e(i)??|xi(n)|
n?12e(i)??xn(n)
n?1NN2e(i)??logxn(n)
n?1N 分别为绝对值的累加、平方累加和平方的对数的累加,选择其中一种就可以了。
计算完每帧的短时能量,然后再设定一个门限,就可以实现一个简单的检测算法了。但是这种算法不可靠,因为人的发音有清音和浊音之分,浊音为声带振动发出,对应的幅度高,周期性明显,而清音则不会有声带的震动,只是靠空气在口腔中的摩擦、冲击或爆破而发音,其短时能量一般比较小。如声母“s”、“c”等的幅度就很低,往往会被漏掉。
图3.3 数字“3”的头部放大图
14
比如图3.3显示的数字“3”开始部分的波形,可以看到声母“s”的范围大概为6400~7100。幅度明显比后面的低很多,以至于有时用肉眼都难以区分跟静音的区别,所以基于短时能量的算法对这些语音信号几乎无能为力。
不过虽然不能用短时能量可靠的区分开,但是可以发现在静音段信号的波形变化相对比较缓慢,而在清音段,因为口腔空气摩擦的效果,造成的波形在幅度上相对变化比较剧烈,这时,可以通过用一帧信号中波形穿越零电平的次数来描述这种变化的剧烈程度,成为过零率,公式为:
ZCR(i)??|xi(n)?xi(n?1)|
n?1N?1 实际上,为了避免静音段的随机噪声产生过高的过零率,通常都会先设定一个门限,当前后两个采样的符号不同时,而且差值大于该门限的时候,就将过零率的数值加1。 3.2 MATLAB的语音端点检测算法
该算法不是实时运行的,而是读取一个wav文件获得语音采样,然后将其分帧计算短时能量和过零率参数,再进行端点检测。这种方式称为离线处理方法。 3.2.1 短时能量的计算
基于前面讲过的三种定义的短时能量分别可以用下面三条命令实现: amp1=sum(abs(y),2); amp1=sum(y.*y,2); amp1=sum(log(y.*y+eps),2);
在计算短时能量时,一般都要将语音信号通过一个一阶高通滤波器1-0.9375z-1,称为预加重滤波器,它的目的在于滤除掉低频干扰,尤其是50Hz或60Hz的工频干扰,提升更为有用的高频部分的频谱。在计算短时能量之前应用该滤波器,还可以起到消除直流漂移、抑制随机噪声和提升清音部分能量的效果。公式为:
amp = sum(abs(enframe(filter([1 -0.9375], 1, x), FrameLen, FrameInc)), 2);
在公式中用的虽是绝对值能量,实际上就是平均幅度。 3.2.2 过零率的计算
过零率的计算则没有那么简单。其计算过程如图3.4所示。
15