基于DTW算法的语音识别原理与实现第1页共17页基于DTW算法的语音识别原理与实现【摘要】以一个能识别数字0~9的语音识别系统的实现过程为例,阐述了基于DTW算法的特定人孤立词语音识别的基本原理和关键技术。其中包括对语音端点检测方法、特征参数计算方法和DTW算法实现的详细讨论,最后给出了在Matlab下的编程方法和实验结果。【关键字】语音识别;端点检测;MFCC系数;DTW算法【中图分类号】TN912.34【文献标识码】A0引言自计算机诞生以来,通过语音与计算机交互一直是人类的梦想,随着计算机软硬件和信息技术的飞速发展,人们对语音识别功能的需求也更加明显和迫切。语音识别技术就是让机器通过识别和理解过程把人类的语音信号转变为相应的文本或命令的技术,属于多维模式识别和智能计算机接口的范畴[1]。传统的键盘、鼠标等输入设备的存在大大妨碍了系统的小型化[10],而成熟的语音识别技术可以辅助甚至取代这些设备。在PDA、智能手机、智能家电、工业现场、智能机器人等方面语音识别技术都有着广阔的前景。语音识别技术起源于20世纪50年代,以贝尔实验室的Audry系统为标志[1,8]。先后取得了线性预测分析(LP)、动态时间归整(DTW)、矢量量化(VQ)、隐马尔可夫模型(HMM)等一系列关键技术的突破和以IBM的ViaVoice、Microsoft的VoiceExpress[9]为代表的一批显著成果。国内的语音识别起步较晚,1987年开始执行国家863计划后语音识别技术才得到广泛关注。具有代表性的研究单位为清华大学电子工程系与中科院自动化研究所模式识别国家重点实验室,中科院声学所等[9]。其中中科院自动化所研制的非特定人连续语音听写系统和汉语语音人机对话系统,其准确率和系统响应率均可达90%以上[1]。常见的语音识别方法有动态时间归整技术(DTW)、矢量量化技术(VQ)、隐马尔可夫模型(HMM)、基于段长分布的非齐次隐马尔可夫模型(DDBHMM)和人工神经元网络(ANN)[1,9]。DTW是较早的一种模式匹配和模型训练技术,它应用动态规划的思想成功解决了语音信号特征参数序列比较时时长不等的难题,在孤立词语音识别中获得了良好性能。虽然HMM模型和ANN在连续语音大词汇量语音识别系统优于DTW,但由于DTW算法计算量较少、无需前期的长期训练,也很容易将DTW算法移植到单片机、DSP上实现语音识别且能满足实时性[7]要求,故其在孤立词语音识别系统中仍然得到了广泛的应用。本文将通过能识别数字0~9的语音识基于DTW算法的语音识别原理与实现第2页共17页别系统的实现过程详细阐述基于DTW算法的特定人孤立词识别的相关原理和关键技术。1语音识别系统概述语音识别系统的典型原理框图[1,9-10]如图1-1所示。从图中可以看出语音识别系统的本质就是一种模式识别系统,它也包括特征提取、模式匹配、参考模式库等基本单元。由于语音信号是一种典型的非平稳信号,加之呼吸气流、外部噪音、电流干扰等使得语音信号不能直接用于提取特征,而要进行前期的预处理。预处理过程包括预滤波、采样和量化、分帧、加窗、预加重、端点检测等。经过预处理的语音数据就可以进行特征参数提取。在训练阶段,将特征参数进行一定的处理之后,为每个词条得到一个模型,保存为模板库。在识别阶段,语音信号经过相同的通道得到语音参数,生成测试模板,与参考模板进行匹配,将匹配分数最高的参考模板作为识别结果。后续的处理过程还可能包括更高层次的词法、句法和文法处理等,从而最终将输入的语音信号转变成文本或命令。图1-1语音识别系统原理框图本文所描述的语音识别系统(下称本系统)将对数字0~9共10段参考语音进行训练并建立模板库,之后将对多段测试语音进行识别测试。系统实现了上图中的语音输入、预处理、特征提取、训练建立模板库和识别等模块,最终建立了一个比较完整的语音识别系统。2语音信号预处理语音信号的预处理模块一般包括预滤波、采样和量化、分帧、加窗、预加重、端点检测等。在不同的系统中对各子模块会有不同的要求,如在嵌入式语音识别系统中一般要求有防混叠滤波电路[5]、A/D转换电路和采样滤波电路等,而在计算机上实验时则可由音频采集卡完成,无需实验者亲自动手。基于DTW算法的语音识别原理与实现第3页共17页2.1语音信号采集在Matlab环境中语音信号的采集可使用wavrecord(n,fs,ch,dtype)函数录制,也可使用Windows的“录音机”程序录制成.wav文件然后使用wavread(file)函数读入。为了进行批量的的训练和识别处理,本系统的训练语音和识别语音全部使用“录音机”程序预先录制。如图2-1所示为数字0的训练语音00.wav的信号波形图,第(I)幅图为完整的语音波形,第(II)、(III)幅图分别为语音的起始部分和结束部分的放大波形图。00.10.20.30.40.50.60.70.8-0.500.51(I)“00.wav”语音信号波形Time:sAmplitude(normalized)0.20.210.220.230.240.250.260.270.280.290.3-0.500.51(II)“00.wav”语音起始处放大波形图Time:sAmplitude(normalized)0.40.410.420.430.440.450.460.470.480.490.5-0.500.51(III)“00.wav”语音结束处放大波形图Time:sAmplitude(normalized)图2-1语音00.wav的信号波形图2.2分帧语音信号是一种典型的非平稳信号,它的均值函数u(x)和自相关函数R(xl,x2)都随时间而发生较大的变化[5,9]。但研究发现,语音信号在短时间内频谱特性保持平稳,即具有短时平稳特性。因此,在实际处理时可以将语音信号分成很小的时间段(约10~30ms[5,7]),称之为“帧”,作为语音信号处理的最小单位,帧与帧的非重叠部分称为帧移,而将语音信号分成若干帧的过程称为分帧。分帧小能清楚地描绘语音信号的时变特征但计算量大;分帧大能减少计算量但相邻帧间变化不大,容易丢失信号特征。一般取帧长20ms,帧移为帧长的1/3~1/2。在Matlab环境中的分帧最常用的方法是使用函数enframe(x,len,inc),其中x为语音信号,len为帧长,inc为帧移。在本系统中帧长取240,帧移取80。基于DTW算法的语音识别原理与实现第4页共17页2.3预加重对于语音信号的频谱,通常是频率越高幅值越小,在语音信号的频率增加两倍时,其功率谱的幅度下降6dB。因此必须对高频进行加重处理,一般是将语音信号通过一个一阶高通滤波器1-0.9375z-1,即为预加重滤波器。其目的是滤除低频干扰,特别是50Hz到60Hz的工频干扰,将对语音识别更为有用的高频部分进行频谱提升。在计算短时能量之前将语音信号通过预加重滤波器还可起到消除直流漂移、抑制随机噪声和提升清音部分能量的效果。预加重滤波器在Matlab中可由语句x=filter([1-0.9375],1,x)实现。2.4加窗为了保持语音信号的短时平稳性,利用窗函数来减少由截断处理导致的Gibbs效应。用的最多的三种为矩形窗、汉明窗(Hamming)和汉宁窗(Hanning)。其窗函数如下,式中的N为窗长,一般等于帧长。矩形窗:汉明窗(Hamming):汉宁窗(Hanning):WR=1(0≤n<N-1)0(Other)WHM=0.5-0.46cos(2πn/(N-1))(0≤n<N-1)0(Other)WHN=0.5-0.5cos(2πn/(N-1))(0≤n<N-1){{{0(Other)(2-1)(2-2)(2-3)窗口的选择非常重要,不同的窗口将使能量的平均结果不同。矩形窗的谱平滑,但波形细节丢失;而汉明窗则刚好相反,可以有效克服泄漏现象,具有平滑的低通特性[4-6]。因此,在语音的时域处理方法中,一般选择矩形窗,而在语音的频域处理方法中,一般选择汉明窗或汉宁窗[5-6]。在Matlab中要实现加窗即将分帧后的语音信号乘上窗函数,如加汉明窗即为x=x.*hamming(N)。本系统中的端点检测采用时域方法故加矩形窗,计算MFCC系数时加汉明窗。3端点检测在基于DTW算法的语音识别系统中,无论是训练和建立模板阶段还是在识别阶段,都先采用端点检测算法确定语音的起点和终点。语音端点检测是指用计算机数字处理技术从包含语音的一段信号中找出字、词的起始点及结束点,从而只存储和处理有效语音信号。对汉语基于DTW算法的语音识别原理与实现第5页共17页来说,还可进一步找出其中的声母段和韵母段所处的位置。语音端点检测是语音分析、合成和识别中的一个重要环节,其算法的优劣在某种程度上也直接决定了整个语音识别系统的优劣。进行端点检测的基本参数主要有短时能量、幅度、过零率和相关函数等。端点检测最常见的方法是短时能量短时过零率双门限端点检测,近年来在此基础上发展出的动态窗长短时双门限端点检测方法[4]也被广泛使用。3.1短时能量语音和噪声的主要区别在它们的能量上,如图3-1(III)和图3-2(III)所示。语音段的能量比噪声段的大,语音段的能量是噪声段能量叠加语音声波能量的和。对第n帧语音信号的短时能量En的定义为:102)(NmnnmxE(3-1)xn为原样本序列在窗函数所切取出的第n段短时语音,N为帧长。因为在计算时使用的是信号的平方,故将En作为一个度量语音幅度值变化的函数有一个缺陷,即对高电平非常敏感。因此在许多场合会将En用下式来代替:|)(|10NmnnmxE(3-2)这样就不会因为取平方而造成信号的小取样值的大取样值出现较大差异。本系统中窗函数为WR(见式2-1),N为240。图3-1(I)和图3-2(I)分别为数字0的训练语音00.wav和数字4的训练语音40.wav的波形,图3-1(III)和图3-2(III)分别为它们的短时能量。基于DTW算法的语音识别原理与实现第6页共17页00.10.20.30.40.50.60.70.8-0.500.51(I)“00.wav”语音信号波形Time:sAmplitude(normalized)0501001502000510(II)短时过零率FrameZcr0501001502000510(III)短时能量FrameEnergy图3-1语音00.wav的时域分析参数00.10.20.30.40.50.6-0.500.51(I)“40.wav”语音信号波形Time:sAmplitude(normalized)020406080100120140160180050100(II)短时过零率FrameZcr02040608010012014016018002040(III)短时能量FrameEnergy图3-2语音40.wav的时域分析参数3.2短时过零率短时过零表示一帧语音信号波形穿过横轴(零电平)的次数。对于连续语音信号,过零意味着时域波形通过时间轴;而对于离散信号,如果相邻的取样值的改变符号则称为过零。过零率就是样本改变符号次数,定义语音信号寿(m)的短时过零率Zn为:基于DTW算法的语音识别原理与实现第7页共17页10|)]1(sgn[)](sgn[|21NmnnnmxmxZ(3-3)1(x≥0)-1(x≤0)sgn[x]={(3-4)清音的能量多集中在较高的频率上,它的平均过零率要高于浊音,故短时过零率可以用来区分清音、浊音以及无声。图3-1(II)和图3-2(II)分别为数字0的训练语音00.wav和数字4的训练语音40.wav的短时过零率。从图中可以看到清音‘s’的过零率明显高于其后的‘i’音,有声段过零率明显高于无声段,但在鼻音阶段过零率迅速滑落到无声水平而能量值则是缓慢下滑。在实际应用时并不能通过式3-3直接计算过零率,因为在无声段噪声使语音波形在0值附近来回摆动,导致计算出的过零率和有声段的区别并不十分明显。比较简单的解决方法是设定一个差的阈值δ,使不仅xn(m)*xn(m-1)0,