1 预加重
首先通过软件实现数字语音信号的预加重,预加重的作用是将高频提升,以弥补声音在唇部辐射时产生的高频损失。实现的方法是使用预加重数字滤波器,它一般是一阶的数字滤波器: 。μ值接近于1。(要有具体程序);
2 加窗、分帧
然后采用汉明窗对数字语音信号加窗,加窗的原因是:语音信号一般在10ms到30ms之间,我们可以把它看成是平稳的。为了处理语音信号,我们要对语音信号进行加窗,也就是一次仅处理窗中的数据。因为实际的语音信号是很长的,我们不能也不必对非常长的数据进行一次性处理。明智的解决办法就是每次取一段数据,进行分析,然后再取下一段数据,再进行分析。本文选择加汉明窗,汉明窗的窗函数是:。(这里要用C语言实现这个窗函数)本文将窗长定位20ms,即一帧的长度为20ms,帧移设为10ms;
3 语音信号的起始点和终止点检测。
本文借鉴期刊论文《一种语音端点检测方法的探究》中提出的基于经典端点检测方法——Lawrence Rabiner提出的以过零率ZCR和能量E为特征的端点检测方法改进的新算法。
以过零率ZCR和能量E为特征的起止点算法的根据是背景噪声与语音的短时段ZCR及E特征从统计看都有相当的区别。这里E特征指的是能量类特征,用到的是该类特征中得段时段平均幅度M特征。
过零率ZCR的定义为:在统计的短时段中,信号波形穿越零电平的次数。
记x(n)为离散语音信号时间序列;w(n)为时窗函数(其有效长度为N),可以为矩形窗,如汉明窗等。则ZCR和M的计算式分别为:
其中sign[x(n)]=1(当x(n)≥0)或sign[x(n)]=-1(当x(n)<0);w(n)=1/2N(0≤n≤N-1)或w(n)=0(n为其它)。
该方法的要点为:由于采集声音信号的最初的短时段为无语音段,仅有均匀分布的背景噪声信号。这样就可以用已知为“静态”的最初几帧(一般取10帧)信号计算其过零率阈值IZCT及能量阈值ITL(低能量阈)和ITU(高能量阈)。
IZCT的具体计算式为:
(1)
其中IF为固定值,一般取25;和分布为根据所取最初10帧样值算得的过零率的“均值”和“标准差”。
计算ITL和ITU时,先算出最初10帧信号每帧的平均幅值M,最大者记为IMX,最小者记为IMN。然后令:
I1=0.03×(IMX-IMN)+IMN
I2=4×IMN
最后按下式计算出ITL和ITU:
ITL=min(I1,I2) (2)
ITU=5×ITL (3)
接下来就可以用过零率阈值IZCT及能量阈值ITL(低能量阈)和ITU(高能量阈)来进行起点及止点的判别。
先根据ITL、ITU算得一初始起点N1。方法为从第11帧开始,逐次比较每帧的平均幅度,N1为平均幅度超过ITL的第一帧的帧号。但若后续帧的平均幅度在尚未超过ITU之前又降到ITL之下,则原N1不作为起始点,改记下一个平均幅度超过了ITL的帧的帧号为N1,依此类推,在找到第一个平均幅度超过ITU的帧时停止比较。
N1只是根据能量信息找到的起点,还未必是语音的精确起点。这是由于语音的起始段往往存在着能量很弱的清辅音,仅依靠能量很难把它们和无声区分开。但研究发现它们的过零率明显高于无声段,因此可以利用过零率这个参数来精确判断清辅音与无声区二者的分界点。
当N1确定后,从N1帧向N1-25帧搜索,依次比较各帧的过零率,若有3帧以上的ZCR≥IZCT,则将起点N1定位满足ZCR≥IZCT的最前帧的帧号,否则即以N1为起点。这种起点检测法也称为双门限前端检测算法。
语音结束点N2的检测方法与检测起点相同,从后向前搜素,找一第一个平均幅度低于ITL、且其前向帧的平均幅度在超出ITU前没有下降到ITL一下的帧的帧号,记为N2,随后根据过零率向N2+25帧搜索,若有3帧以上的ZCR≥IZCT,则将结束点N2定为满足ZCR≥IZCT的最后帧的帧号,否则即以N2作为结束点。
在这篇文章中,作者对上述经典的双门限端点检测法进行如下了改进。
(1)在得到IZCT后加一个处理步骤,令
IZCT=max[IZCT',15] (4)
式中IZCT'为上文中提到的IZCT。这是因为:起始噪音段的有可能为0或十分接近0的数值,这样根据式(1)计算得到的IZCT可能为0或1这样很小的数,此时如果后续噪音帧中过零率略有增大,则很容易使系统过度敏感从而导致起点识别不准。而根据我们的观察和统计,语音起始段如为能量很小的清辅音,其过零率值在连续10余帧一般都超过20,而噪音则只会在偶尔的情况下有极少数帧的过零率超过20且不连续。
(2)将高、低能量阈值的计算改为如下形式:
ITL=max[3.1×IMA,a] (5)
ITU=2.5×ITL (6)
式(5)中得IMA是前10帧的平均幅值;a是根据大量语音的能量通过统计得出的数据,在我们的系统中所用的a大致等于语音平均能量E的1/9。E的计算式为:
因为在能量阈值ITL和ITU的计算中,式(2)所用到的I1、I2均由起始各帧平均幅值中最大和最小值IMX和IMN决定。经过对实际采样数据的观察可以看到,当在正常室内环境下,前10帧背景噪音平均幅值中最小的往往十分接近于0,而某些帧的波形中有时会有毛刺存在,导致该帧的平均幅值很大,这样,IMX和IMN常常可能差距很大,甚至可以达到好几个数量级,在此情况下,由于I1很大而I2很小,用式(2)得到的ITL将完全由IMN决定。该理论的提出者的本意应该是忽略突发毛刺的影响,但它存在一个明星缺陷就是如果10帧中只要有1帧的平均幅值很小,则其余9帧数据将变得毫无意义。此时得到的低能量阈值ITL极小,从而导致系统过度敏感,十分容易将噪声误判为语音,使系统识别率因起点识别不准而大受影响。经过大量语音数据的统计分析和实验,作了以上修改。这样既利用了噪声的平均能量,又可以防止得到的ITL过低导致的问题。式(5)中的系数3.1和式(6)中的系数2.5均为通过大量统计和实验得到的经验值。
(3)在结束点的检测上,将对过零率的检测忽略掉,并将高低能量阈值合并为一个阈值,该阈值取为ITL的1.2倍。这样改动的依据是:辅音能量弱,过零率高,元音过零率低而能量高,在汉语中的字只有C-V结构或V结构,均以元音结尾,在结尾再次进行过零率检测将毫无益处,甚至适得其反。而汉语语音信息最强的部分为前面和中间的部分,在结尾部分往往只是信息弱时间长的拖尾音,将过多的拖尾音取入识别匹配所用的热证序列对识别没有很大贡献,甚至可能有害。而这些拖尾音的能量通常逐渐减弱,因此适当提高低能量阈ITL将有助于截断过多的拖尾音。
经过改进后的端点检测算法,其识别准确率由原来的80%左右上升至95%左右。
4 提取特征参数
语音信号经预处理后,接下来很重要的一环就是特征参数提取。对特征参数的要求是:
1)提取的特征参数能有效地代表语音特征,具有很好的区分性;
2)各阶参数之间有良好的独立性;
3)特征参数要计算方便,最好有高效的计算方法,以保证语音
识别的实时实现。
在训练阶段,将特征参数进行一定的处理之后,为每个词条得到一个模型,保存为模版库。在识别阶段,语音信号经过相同的通道得到语音参数,生成测试模版,与参考模版进行匹配,将匹配度最高的参考模版作为识别结果。同时还可以在很多先验知识的帮助下,提高识别的准确率。
下面要进行讨论的问题是提取何种特征参数以及如何提取特征参数。
目前常用的特征参数包括线性预测倒谱系数LPCC和梅尔倒谱系数MFCC等。LPCC参数和MFCC参数分别根据人的发声原理和听觉感知原理,从人的声音提取出能量分布谱,从中获得声纹的独特特征,这两种参数在实用中得到了较好的结果。(话者识别系统中语音特征参数的研究与仿真解放军理工大学通信工程学院,南京)
LPCC参数是基于语音的线性预测分析的,线性预测分析从人的发声机理入手,通过对声道的短管级联模型研究,认为系统的传递函数符合全极点数字滤波器的形式,从而n时刻的信号可以用前若干时刻的信号的线性组合来估计。通过使实际的采样值和线性预测值之间的均方差最小(Least Mean Square,LMS),即可得到线性预测系数。对线性预测系数的计算方法有自相关法(德宾Durbin法)、协方差法、格型法等等。计算的快速有效使得线性预测语音特征被派生的声学特征还有线谱对LSP、PARCOR系数(反射系数)、对数面积比系数等。
在获得滤波器的线性预测系数后,可以用一个递推公式得到其倒谱,公式为:,i=1,2,...,P
式中,ai为线性预测系数,Ci为所求的LPCC参数,P是参数的个数。
LPCC参数比较彻底地去掉了语音产生过程中的激励信息,主要反映声道特性,而且只需十几个倒谱系数就能较好地描述语音的共振峰特性,计算量小;其缺点是对辅音的描述能力较差,抗噪声性能也较弱。
不同于LPCC通过对人的发声机理的研究而得到的声学特征,MFCC参数是基于人的听觉特性的,它利用人听觉的临界带效应,在语音频谱范围内设置若干个带通滤波器,每个滤波器具有三角形或正弦形滤波特性,然后将语音能量谱通过该滤波器组,求各个滤波器输出,对其取对数,并作离散余弦变换(DCT),即可得到MFCC系数。
计算MFCC参数的具体步骤如下图1所示。
图1 MFCC参数的提取
① 对输入语音信号分帧、加窗,然后作快速傅里叶变换(FFT),获得频谱分布信息。
② 将频域信号通过如图2所示的按Mel频标分布排列的三角滤波器组,将线性频标变换为Mel频标。(求频谱幅度的平方得到能量谱)
③ 将各滤波器的输出取对数,作DCT变换,得到MFCC系数。
式中N为三角滤波器个数,Xk为第k个滤波器的输出,{Ci}i=1,2,...P即为所求的MFCC参数,P是其阶数。
计算MFCC参数涉及FFT、取对数和DCT等运算,运算量比LPCC参数要大,用C语言在计算机上做模拟时其运算时间是LPCC的近十倍,但MFCC参数由于充分考虑了人耳的听觉特性,因而在有信道噪声和频谱失真的情况下,仍具有较高的识别精度,它的抗噪能力也比较强。而LPCC参数以假定所处理的信号模型为全极点模型为前提,因此对动态特性较强的辅音以及含噪语音描述能力较差。(由于现在的DSP芯片对FFT提供了硬件支持,而DCT变换中得余弦运算可通过查表完成,因而在DSP芯片上计算MFCC参数仍然很快的。)
此外还有一种感知性预测参数PLP,PLP参数仍用德宾法计算LPC参数,但在计算自相关参数时用的也是对听觉激励的对数能量谱进行DCT的方法。MFCC参数和PLP参数都是建立在对人的听觉感知机理的研究基础上,其性能也接近。
5 匹配算法(DTW)
参考论文《基于DTW和HMM的语音识别算法仿真及软件设计》
说话人对同一词的两个发音不可能完全相同,这些差异不仅包括音强的大小、频谱的偏移,更重要的是发音时音节的长短不可能完全相同,而且两次发音的音节往往不存在线性对应关系。考虑到语音识别的过程中,用户进行训练或者识别时,即使每次尽量以同样的方式说同一个词汇,其持续时间的长度也会随机改变,而且每个词内部各个部分(比如元音、辅音)的相对时长也是随机改变的。因此,如果直接用特征矢量序列来进行相似性比较,其效果不是最佳的,需要对特征参数序列重新进行时间校准,采用动态时间调整(DTW)方法可以有效地解决这个问题。该算法基于动态规划(DP)的思想,解决了发音长短不一的模板匹配问题,是语音识别中出现较早,较为经典的一种算法。
模板匹配之前,需要先采用端点检测算法确定语音的起点和终点,已存入模板库的各个词条称为参考模式,一个参考模板可以表示为:{R(1),R(2),...,R(m),...,R(M)},m为训练语音帧的时序标号,m=1为起点语音帧,m=M为终点语音帧。所要识别的一个输入词条语音称为测试模式,可以表示为:{T(1),T(2),...,T(n),...,T(N)},n为测试语音帧的时序标号,n=1为起点语音帧,n=N为终点语音帧。参考模式与测试模式采用相同类型的特征矢量、帧长及帧移。
假设测试和参考模式分别用T和R表示,为了比较它们之间的相似度,可以计算它们之间的失真,失真越小相似度越高。测试模板T和参考模板R之间的失真表示为:D[T,R]。为了计算这一失真,应从T,R中每个对应帧之间的失真算起,假设n和m分别是T和R中任意选择的帧号,则这两帧特征矢量之间的失真用d[T(n),R(m)]来表示。
对于特征矢量之间的失真度,有多种度量的方法。为了简单和便于处理,通常用欧式距离(欧几里德距离)或其变形形式来进行度量,下面的公式给出了欧氏距离度量失真度的计算方法:
其中,T(n)={t1,t2,...,tp}和R(m)={r1,r2,...,rp}为帧T(n)和R(m)对应的特征矢量,p为特征矢量的维数。
计算总体失真D[T,R]时,需要考虑参考模式帧数与测试模式帧数是否相等的情况:若N=M,这时可以依次计算n=m=1,...,n=m=n,各帧之间的失真并取和,即可求得总失真。否则,则要考虑将T(n)和R(m)对齐。这时需要将其中帧数较小的序列用线性扩张的方法映射到较大的帧序列上,或者将其中帧数较大的序列用线性压缩的方法映射到较小的帧序列上,然后再分别计算各帧的失真,从而求得总失真。但是这样的计算没有考虑到语音中各个阶段在不同的情况下的持续时间会产生或长或短的变化,因而使得识别效果不佳,因而更多地采用动态规划(DP)的方法。
如果把测试模式的各个帧号n=1~N在一个二维直角坐标系中得横轴上标出,把参考模式的各个帧号m=1~M在坐标系的纵轴上标出,通过这些表示帧号的整数坐标画出一些纵横线即可形成一个网络,网络中得每个交叉点(n,m)表示测试模式中某一帧与训练模式中某一帧的交汇点。DP算法可以归结为寻找一条通过此网络中若干个点的路径,路径通过的格点即为测试和参考模式中进行失真度计算的帧号。路径不是任意选择的,首先,考虑到实际语音的发音情况,虽然语音的发音快慢会有所变化,但是各个部分的先后次序不可能颠倒,因此上述路径必然从左下角出发,在右上角结束。如下图所示。
动态时间规整算法搜索路径
其次,为了防止盲目的搜索,一般不允许与横轴或纵轴过分倾斜的路径,一般对路径斜率的最大、最小值做出规定,通常最大斜率为2,最小斜率为1/2。
DTW算法的实质就是运用动态规划的思想,利用局部最佳化的处理来自动寻找一条路径,沿着这条路径,两个特征矢量之间的累积失真量最小,即是要寻找一条通过各个交叉点的从起始点到终止点的最佳路径,是的该路径上所有交叉点的帧失真度中和达到最小。
为了描述这条路径,假设路径通过的所有格点依次为(n1,m1),...,(nN,mN),其中(n1,m1)=(1,1),(nN,mN)=(N,M)。路径可以用函数描述,其中ni=i,i=1,2,...,N,,。为了使路径不至于过分倾斜,要按照下图对搜索路径进行约束:斜率应在0.5~2的范围内,如果当前格点为(ni,mi),则前一格网格点只可能是下列三种情况之一:
DTW搜索路径约束条件
用η表示上述三个条件,求最佳路径的问题可以归结为满足约束条件η时,求最佳路径函数使得路径的积累距离达到最小值。搜索路径方法如下:搜索从(n1,n2)点出发,可以展开若干条满足η的路径,假设可计算每条路径达到(nN,mN)点时的总的积累距离,具有最小累积距离的路径即为最佳路径。易于证明,限定范围内任一格点(ni,mi)只可能由一条搜索路径通过。对于(ni,mi),其可达到该店的前一格格点只可能是(ni-1,mi)、(ni-1,mi-1)、(ni-2,mi-1),那么(ni,mi)一定选择这三个距离中最小者所对应的格点作为其前续格点,并将通过该格点的路径延伸到(ni,mi),这时此路径的累积距离为:
其中由下式决定:
这样可以从(n1,m1)=(1,1)出发搜索(n2,m2),再搜索(n3,m3)......,对每个(ni,mi)都存储相应的前一格点(ni-1,mi-1)及相应的帧匹配距离d[ni,mi],搜索到(nN,mN)时,只保留一条最佳路径。这套DP算法便是DTW算法。