算法原理分析与源码_第1页
算法原理分析与源码_第2页
算法原理分析与源码_第3页
算法原理分析与源码_第4页
算法原理分析与源码_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、引言 随着时代的发展,人们越来越注重生活的品质。便捷时尚成为当代人们的追求目标。现在,语音信号处理的技术趋于完善,语音识别技术的应用有两个发展方向:一个是大词汇量连续语音识别系统,主要应用于计算机的听写输入等;另一个是小型化便携式语音模块的应用,如手机的拨号汽车设备的语音控制等方面的应用,这些应用大多都需要使用硬件实现。 在此次课程设计中,我们引用现今较为成熟的语音信号处理技术,设计一个简单的非实时语音信号识别系统。其主要技术指标是识别率和计算量,其关键是特征参数的提取和模式识别方法。测试模板将预先录制好的09的语音文件用按键方式输入,经过A/D转换芯片0809后转化为数字信号,在单片机AT8

2、9C52中,先用端点检测将语音中有用的语音部分提取出来(即将头部和尾部的静音部分除掉),然后用LPC算法提取语音信号的特征参数,进行动态归整(DTW算法)后与模板库里面的标准语音作比较,最后将识别结果进行D/A转化后播放出来。在本部分的设计中,则主要完成语音识别的模式匹配算法部分的软件实现。 1 为什么要用DTW算法 孤立词识别方案主要有: (1)采用动态规划(Dynamic Programming)的方法。这是一种运算量较大,但技术上较简单,正识率也较高的方法。其中的失真测度可以用欧氏距离(适于短时谱或倒谱参数),也可以用对数似然比距离(适于参数)决策方法可用最近邻域准则 (2)采用矢量量化

3、(ectoruantization)的方法它既可用于语音通信中的波形或参数的压缩,也可用于语音识别尤其有限状态矢量量化(FSVQJ)方法,对于语音识别更为有效。决策方法一般用最小平均失真准则。 (3)采田隐马尔柯夫横型(HMM)的方法,该模型的参数既可以用离散概率分布函数,也可以用最新的连续概率密度函数(如:正态高斯密度,高斯自回归密度等)。决策方法则用最大后验概率准则 (4)采用混合技术的方法。例如:用矢量量化作为第一级识别(作为预处理,从而得出若干候选的识别结果),然后,再用DTW或HMM方法做最后的识别,因此,可有QDTW和HMM等识别方法 目前,语音识别的匹配主要应用HMM和DTW两种

4、算法。DTW算法由于没有一个有效地用统计方法进行训练的框架,也不容易将低层和顶层的各种知识用到语音识别算法中,因此在解决大词汇量、连续语音、非特定人语音识别问题时较之HMM算法相形见绌。HMM是一种用参数表示的,用于描述随机过程统计特性的概率模型。而对于孤立词识别,HMM算法和DTW算法在相同条件下,识别效果相差不大, 又由于DTW算法本身既简单又有效,但HMM算法要复杂得多。它需要在训练阶段提供大量的语音数据,通过反复计算才能得到参数模型,而DTW算法的训练中几乎不需要额外的计算。鉴于此,DTW更适合本系统的要求。 2 DTW算法原理 在孤立词语音识别中,最为简单有效的方法是采用DTW(Dy

5、namic Time Warping,动态时间归整)算法,该算法基于动态规划(DP)的思想,解决了发音长短不一的模板匹配问题,是语音识别中出现较早、较为经典的一种算法。用于孤立词识别,DTW算法与HMM算法在训练阶段需要提供大量的语音数据,通过反复计算才能得到模型参数,而DTW算法的训练中几乎不需要额外的计算。所以在孤立词语音识别中,DTW算法仍然得到广泛的应用。 无论在训练和建立模板阶段还是在识别阶段,都先采用端点算法确定语音的起点和终点。已存入模板库的各个词条称为参考模板,一个参考模板可表示为R=R(1),R(2),R(m),R(M),m为训练语音帧的时序标号,m=1为起点语音帧,m=M为

6、终点语音帧,因此M为该模板所包含的语音帧总数,R(m)为第m帧的语音特征矢量。所要识别的一个输入词条语音称为测试模板,可表示为T=T(1),T(2),T(n),T(N),n为测试语音帧的时序标号,n=1为起点语音帧,n=N为终点语音帧,因此N为该模板所包含的语音帧总数,T(n)为第n帧的语音特征矢量。参考模板与测试模板一般采用相同类型的特征矢量(如MFCC,LPC系数)、相同的帧长、相同的窗函数和相同的帧移。 假设测试和参考模板分别用T和R表示,为了比较它们之间的相似度,可以计算它们之间的距离 DT,R,距离越小则相似度越高。为了计算这一失真距离,应从T和R中各个对应帧之间的距离算起

7、。设n和m分别是T和R中任意选择的帧号,dT(n),R(m)表示这两帧特征矢量之间的距离。距离函数取决于实际采用的距离度量,在DTW算法中通常采用欧氏距离。 若N=M则可以直接计算,否则要考虑将T(n)和R(m)对齐。对齐可以采用线性扩张的方法,如果N<M可以将T线性映射为一个M帧的序列,再计算它与R(1),R(2),R(M)之间的距离。但是这样的计算没有考虑到语音中各个段在不同情况下的持续时间会产生或长或短的变化,因此识别效果不可能最佳。因此更多的是采用动态规划(DP)的方法。 如果把测试模板的各个帧号n=1N在一个二维直角坐标系中的横轴上标出,把参考模板的各帧号m=1M在纵轴上标出,

8、通过这些表示帧号的整数坐标画出一些纵横线即可形成一个网络,网络中的每一个交叉点(n,m)表示测试模式中某一帧的交汇点。DP算法可以归结为寻找一条通过此网络中若干格点的路径,路径通过的格点即为测试和参考模板中进行计算的帧号。路径不是随意选择的,首先任何一种语音的发音快慢都有可能变化,但是其各部分的先后次序不可能改变,因此所选的路径必定是从左下角出发,在右上角结束,如图2-1所示。 图2-1 DTW算法搜索路径 为了描述这条路径,假设路径通过的所有格点依次为(n ,m ),(n ,m ),(n ,m ),其中(n ,m )=(1,1),(n ,m )=(N,M)。路径可以用函数m =Ø(

9、n )描述,其中n =i,i=1,2,N,Ø(1)=1,Ø(N)=M。为了使路径不至于过倾斜,可以约束斜率在0.52的范围内,如果路径已经通过了格点(n ,m ),那么下一个通过的格点(n ,m )只可能是下列三种情况之一: (n ,m )=(n +1,m +2) (n ,m )=(n +1,m +1) (n ,m )=(n +1,m ) 用r表示上述三个约束条件。求最佳路径的问题可以归结为满足约束条件r时,求最佳路径函数m =Ø(n ),使得沿路径的积累距离达到最小值,即: 搜索该路径的方法如下:搜索从(n ,m )点出发,可以展开若干条满足的路径,假设可计算每

10、条路径达到(n ,m )点时的总的积累距离,具有最小累积距离者即为最佳路径。易于证明,限定范围的任一格点(n ,m )只可能有一条搜索路径通过。对于(ni,mi),其可达到该格点的前一个格点只可能是(n ,m )、(n ,m -1)和(n ,m -2),那么(n ,m )一定选择这3个距离之路径延伸而通过(n ,m ),这时此路径的积累距离为: D(n ,m )=dT(n ),R(m )+D(n , m ) 其中的n = n -1 ,m -1由下式决定: D(n ,m )=minD(n , m ),D(n , m -1),D(n , m -2) 这样可以从(n ,m )=(1,1)出发搜索(n

11、 ,m ),再搜索(n ,m ),对每一个(n ,m )都存储相应的前一格点(n ,m )及相应的帧匹配距离dn ,m 。搜索到(n ,m )时,只保留一条最佳路径。如果有必要的话,通过逐点向前寻找就可以求得整条路径。这套DP算法便是DTW算法。 DTW算法可以直接按上面的描述来实现,即分配两个N×M的矩阵,分别为积累距离矩阵D和帧匹配距离矩阵d,其中帧匹配距离矩阵d(i,j)的值为测试模板的第i帧与参考模板的第j帧间的距离。D(N,M)即为最佳匹配路径所对应的匹配距离。 3 Matlab程序的实现 3.1 DTW的一般算法 实现DTW算法的函数Dtw.m function dist

12、 = dtw(t,r) n = size(t,1); m = size(r,1); % 帧匹配距离矩阵 d = zeros(n,m); for i = 1:n for j = 1:m  d(i,j) = sum(t(i,:)-r(j,:).2); end end % 累积距离矩阵 D = ones(n,m) * realmax; D(1,1) = d(1,1); % 动态规划 for i = 2:n for j = 1:m  D1 = D(i-1,j);  if j>1   D2 = D(i-1,j-1); else D2 = realm

13、ax;  end  if j>2   D3 = D(i-1,j-2); else D3 = realmax;  end  D(i,j) = d(i,j) + min(D1,D2,D3); end end dist = D(n,m); 程序中,首先申请两个n×m的距阵D和d,分别为累积距离和帧匹配距离。这里n和m为测试模板与参考模板的帧数。然后通过一个循环计算两个模板的帧匹配距离距阵d。接下来进行动态规划,为每个格点(i,j)都计算其三个可能的前续格点的累积距离D1、D2和D3。考虑到边界问题,有些前续格点可能不存在,因

14、此要加入一些判断条件。 最后利用最小值函数min,找到三个前续格点的累积距离的最小值作为累积距离,与当前帧的匹配距离d(i,j)相加,作为当前格点的累积距离。该计算过程一直达到格点(n,m),并将D(n,m)输出,作为模板匹配的结果。 3.2 DTW的高效算法 由于匹配过程中限定了弯折的斜率,因此许多格点实际上是到达不了的,如图3-1所示。因此菱形之外的格点对应的帧匹配距离是不需要计算的。另外也没有必要、保存所有的帧匹配距离距阵和累积距阵,因为每一列各格点上的匹配计算只用到了前一列的三个网格。充分利用这两个特点可以减少计算量和储存空间的需要。 如图3-1所示,把实际的动态弯折分为三段,(1,X

15、a),(Xa+1,Xb)和(Xb+1,N),其中: 图3-1 匹配路径约束示意图 Xa和Xb都取相近的整数。由此也得出对M和N长度的限制条件: 当不满足以上条件时,认为两者差别实在太大,无法进行动态弯折匹配。 在X轴上的每一帧不再需要与Y轴上的每一帧进行比较,而只是与Y轴上y ,y 间的帧进行比较,y 和y 的计算如下式: 也可能会出现Xa>Xb的情况,此时弯折匹配的三段为(1,Xb),(Xb+1,Xa)和(Xa+1,N)。 对于X轴上每前进一帧,虽然所要比较Y轴上的帧数不同,但弯折特性是一样的,累积距离的更新都是用下式实现的: 由于X轴上每前进一帧,只需要用到前一列的累积距离距阵。每前

16、进一帧都进行更新,即按上式利用前一列的累积距离D和当前列的所有帧匹配的距离d(x,y),求出当前帧的累积距离,保存于矢量d中,再把更新的距离d赋值给D,作为新的累积距离,供下一列使用。如图3-2所示。这样一直前进到X轴上最后一列,矢量D的第M个元素即为两个模板动态弯折的匹配距离。 图3-2 累积距离矢量的动态更新 用这种方法实现的另一种DTW算法的代码如下: function dist = dtw(test, ref) global x y_min y_max global t r global D d global m n t = test; r = ref; n = size(t,1);

17、m = size(r,1); d = zeros(m,1); D = ones(m,1) * realmax; D(1) = 0; % 如果两个模板长度相差过多,匹配失败 if (2*m-n<3) | (2*n-m<2)  dist = realmax;  return end % 计算匹配区域 xa = round(2*m-n)/3); xb = round(2*n-m)*2/3); if xb>xa  %xb>xa, 按下面三个区域匹配  % 1 :xa  % xa+1:xb  % xb+1:N  

18、;for x = 1:xa   y_max = 2*x;   y_min = round(0.5*x);   warp  end  for x = (xa+1):xb   y_max = round(0.5*(x-n)+m);   y_min = round(0.5*x);   warp  end  for x = (xb+1):n   y_max = round(0.5*(x-n)+m);   

19、y_min = round(2*(x-n)+m);   warp  end elseif xa>xb  %xa>xb, 按下面三个区域匹配  % 0 :xb  % xb+1:xa  % xa+1:N  for x = 1:xb   y_max = 2*x;   y_min = round(0.5*x);   warp  end  for x = (xb+1):xa   y_max = 2*x;  

20、; y_min = round(2*(x-n)+m);   warp  end  for x = (xa+1):n   y_max = round(0.5*(x-n)+m);   y_min = round(2*(x-n)+m);   warp  end elseif xa=xb  %xa=xb, 按下面两个区域匹配  % 0 :xa  % xa+1:N  for x = 1:xa   y_max = 2*x; &#

21、160; y_min = round(0.5*x);   warp  end  for x = (xa+1):n   y_max = round(0.5*(x-n)+m);   y_min = round(2*(x-n)+m);   warp  end end %返回匹配分数 dist = D(m); function warp global x y_min y_max global t r global D d global m n d = D; for y = y_min

22、:y_max  D1 = D(y);  if y>1   D2 = D(y-1);  else D2 = realmax;  end  if y>2   D3 = D(y-2);  else D3 = realmax;  end d(y) = sum(t(x,:)-r(y,:).2) + min(D1,D2,D3); end D = d; 程序中首先进行两个模板长度的比较,如果长度差别太大,将返回一个很大的数realmax,表示匹配失败。按下来计算Xa和Xb,根据两者大小的

23、比较,将匹配区域划分为二段或三段。对每一帧分别计算出y_min和y_max,调用函数warp进行匹配。最后的结果保存在D中,而D(m)就是整个模板匹配的总累积距离。 3.3 测试程序Testdtw.m 用测试程序Testdtw.m测试Dtw.m,其代码在下面。 disp('正在计算参考模板的参数.') for i=1:10   fname = sprintf('d:matlab6p5work%da.wav',i-1);   x = wavread(fname);   x1 x2 = vad(x);   m = lpc(x)

24、;   m = m(x1-2:x2-2,:);   ref(i).lpc = m; end disp('正在计算测试模板的参数.') for i=1:10   fname = sprintf(' d:matlab6p5work%db.wav',i-1);   x = wavread(fname);   x1 x2 = vad(x);   m = lpc(x);   m = m(x1-2:x2-2,:);   test(i).lpc = m; end disp('正在进行模板匹

25、配.') dist = zeros(10,10); for i=1:10 for j=1:10   dist(i,j) = dtw(test(i).lpc, ref(j).lpc); end end disp('正在计算匹配结果.') for i=1:10   d,j = min(dist(i,:);   fprintf('测试模板 %d 的识别结果为:%dn', i, j); end 程序中用到了20个wav文件,分别是0a.wav、1a.wav、9a.wav以及0b.wav、1b.wav、9b.wav,分别保存数码0到9

26、的发音。其中a结尾的10个文件作为参考模板,b结尾的0个文件作为测试模板。 首先用wavread函数读入wav文件,用lpc函数获得其lpc参数,用vad函数对其进行端点检测,并保存语音部分的lpc参数到参考模板的结构数组ref(i).lpc中或测试模板的结构数组test(i).lpc中。 模板匹配阶段,计算所有测试模板和参考模板之间的距离,保存到距阵dist中,将最后的匹配分数用min 函数找到最小值对应的模板。 在Matlab上运行后,输出的结果为: >> Testdtw 正在计算参考模板的参数. 正在计算测试模板的参数. 正在进行模板匹配. 正在计算匹配结果. 测试模板 1

27、的识别结果为:1 测试模板 2 的识别结果为:2 测试模板 3 的识别结果为:3 测试模板 4 的识别结果为:4 测试模板 5 的识别结果为:5 测试模板 6 的识别结果为:6 测试模板 7 的识别结果为:7 测试模板 8 的识别结果为:8 测试模板 9 的识别结果为:9 测试模板 10 的识别结果为:10 >> 从输出的结果看,识别得到了正确的结果,为了进一步验证识别的正确性,看一下匹配距离距阵dist的数据: >> dist dist = 1.0e+004 * 0.5741 1.8575 3.7164 2.7567 3.2732 2.4946 2.1208 1.85

28、65 3.4530 1.7783 1.6183 0.6201 5.4711 4.0024 4.5169 3.8422 3.0256 1.4398 5.5660 3.4090 3.5879 5.2763 0.4147 1.4435 2.4924 3.1520 2.5371 3.5035 1.0029 2.9692 2.2657 3.6250 1.0511 0.5487 2.1223 2.2573 1.8405 2.5638 1.0303 2.0788 2.4052 3.9130 2.1418 1.8048 0.4234 2.9629 2.6261 2.5600 2.1139 2.2589 2.2

29、896 3.2425 3.0996 2.7853 3.0529 0.5002 2.2229 3.2317 2.7873 1.9719 2.1692 3.8311 3.1997 2.6173 2.9306 2.4412 0.6207 2.9675 2.6489 1.5591 1.9428 2.2470 4.0326 2.6934 3.1362 3.6682 3.4982 0.7567 4.3060 2.6786 3.2084 4.7374 1.0319 1.4739 2.2992 2.9104 2.2509 3.8464 0.4946 2.5945 2.2231 4.4386 2.9113 2.

30、5731 2.7994 2.2883 1.3779 3.6557 2.2412 0.3803 >> 距离距阵的对角线上是正确匹配模板的对应分数,可见对角线上的10个数值都是在本行中最小的,由此验证了识别结果的正确性。 4 DTW算法的研究和改进 4.1 动态规划存在下列问题 (1)运算量大。由于要找出最佳匹配点,因此要考虑多种可能的情况虽然路径限制减少了运算晕,但运算量仍然很大,因而使识别速度减慢这在大词汇量的识别中是一个严重缺点。 (2)识别性能过分依赖于端点检测端点检测的精度随着不同音素而有所不同,有些音素的瑞点检测精度较低由此影响识别率的提高 (3)没有充分利用语音信号的时序

31、动态信息。观已提出多种方法来克服这一缺点 4.2 对端点检测算法的改进 对端点检测精度的敏感性是DTW 算法主要缺陷之一。解决的办法无非是两个,一个是从DTW算法本身出发,例如采用对前后端点的放松来降低其对端点的敏感性;另一个是从DTW算法的外界出发,能够尽量精确地检测语音的端点。笔者通过对短时窗函数和窗长的研究,提出一种能够比较精确检测端点的方法。 在检测语音信号的端点时,一般采用平均能量或平均幅度值与过零率相乘的方法来判断。如果所取窗长度较小,显然能够比较精确地检测到语音的端点,但会使运算量加大识别速度减慢,同时会把一些短时的脉冲噪音误认为语音,从而产生错误的识别。如果所取窗长较大,可以加

32、快语音处理的速度,会跳过一些短时噪音,但是端点的检测误差增加,对DTW这种端点非常敏感的算法几乎是致命的。窗长取一合适的中间值固然可以减少窗长过短和过长的消极影响,但毋庸置疑也减弱了其积极的一面。笔者提出一种策略能够比较精确地检测端点,同时能避免窗长过短引起的弊端,并在实现的系统中采用了这一策略,取得了良好的效果。 窗长可变的语音策略及算法如图4-1所示 图4-1 变窗长端点检测程序框图 4.3 端点检测的抗噪性 考虑到计算机的工作环境在室外,因此在程序调试时特别增加了白噪声,结果发现加噪之后对端点检测影响比较大。例如:在一定强度的白噪声下,调好了作为端点检测的过零率和能量值,端点检测准确率达

33、90%&以上(与人直接观察语音波形检测端点相比),但当改变环境噪声后,端点的检测准确率则只有82%这样就提出了如何能适应环境的变化,改变因环境不同造成端点检测误差的问题。 经过研究,采用了如下方法,比较好地解决了这一问题。单纯用过零率和能量值作为检测端点的手段,由于没有考虑到背景噪声,有不可避免的缺点。采用当前帧与前一帧的过零率和能量值的差作为检验端点的标准就能很好地解决了背景噪声的问题。 4.4 对孤立词算法的改进 传统的DTW算法虽然解决了语音识别中说话不均匀造成的语音信号非平稳特性,但还存在着许多问题,可以从以下几个方面加以改进。 改进局部路径限制 局部路径的限制主要是解决畸形匹

34、配的问题,传统DTW算法对路径限制较严格。这样实现的系统对训练与测试时语音均匀度变化比较剧烈情况的处理不大合理。笔者提出了一种局部路径限制的方法,对处理均匀度变化较剧烈的情况有比较明显的优势。如图4-2所示,将匹配的跳变间隔增大为3。 图4-2 改进的局部路径限制 改进DTW算法的效率 DTW虽然算法简洁,对硬件资源的要求也较小,但运算量仍然很大,能否减少运算量而又不降低识别率,对DTW 通常的实际应用,特别是应用于廉价低档的系统中则是非常关键的。 对DTW算法全局路径限制不但可以减少语音的畸形匹配,而且可以减少大约2/3(的运算量。即使这样,运算量仍然非常大,而且由于是用待识别语音序列与模板

35、库中的每一个模板依次匹配,所以运算量会随着模板库中词汇的增加成比例的增大。 假设某个待识别语音序列实际表达的词汇是X,则与训练阶段放入模板中的其它词汇相比,该语音序列和模板库中词汇X的模板之间的失真度应为最小。这样就可以设想,如果设立一个合理的阈值,如果在待识别语音序列与模板库中某个模板匹配过程中,一旦计算出的部分失真度超过阈值,表示最终识别结果肯定不是该模板所代表的词汇,则可立即终止对该模板的继续计算,转入对下一个模板的匹配。由于是中途停止对某一模板的匹配运算,因此可以节约大量的计算开销。 5 Matlabe程序的C语言实现 5.1 流程图 5.2 算法的实现 参见附录。 6 C程序功能调试

36、与检测 虽然Matlab程序与C程序比较类似,但为了使C程序更简化,高效率,C程序的编写过程中在某些地方采用了和Matlab程序不同的编写思想。 由于C语言中的数组的容量的原因,在进行调试Dtw的过程中采用了6×6的数组,采用了一个t64的测试值,一个r64的参考值,经调试后实现的功能与matlab的一样。在对testdtw进行调试的时候,用了一个100×100的数组,采用了2个测试模板,10个参考模板。对其调试后,正确地实现了其功能。 对Dtw测试后输出的结果为: This is . D111=0.000000 D112=62.000000 D113=53.000000

37、D114=72.000000 D115=22.000000 D116=84.000000 D121=4.000000 D122=50.000000 D123=39.000000 D124=60.000000 D125=14.000000 D126=56.000000 D131=16.000000 D132=46.000000 D133=33.000000 D134=56.000000 D135=14.000000 D136=36.000000 D141=36.000000 D142=50.000000 D143=35.000000 D144=60.000000 D145=22.000000 D

38、146=24.000000 D151=64.000000 D152=62.000000 D153=45.000000 D154=72.000000 D155=38.000000 D156=20.000000 D161=256.000000 D162=190.000000 D163=165.000000 D164=200.000000 D165=182.000000 D166=84.000000 dist=211.000000 经验证,结果正确。 对Testdtw调试后输出的结果如下: The min diference of eath files and c:ww.txt is . dist

39、1 = 9.000000e-04 dist 2 = 4.000000e-04 dist 3 = 9.999996e-05 dist 4 = 0.000000e+00 dist 5 = 5.654213e-03 dist 6 = 3.999998e-04 dist 7 = 9.000000e-04 dist 8 = 1.600000e-03 dist 9 = 9.573492e-03 dist10 = 4.633213e-02 The result is The c:ww.txt and c:q4.txt is min and its value dist4 is 0.000000e+00 Th

40、e min diference of eath files and c:ee.txt is . dist 1 = 4.878967e+01 dist 2 = 4.878877e+01 dist 3 = 4.878727e+01 dist 4 = 4.878757e+01 dist 5 = 4.878936e+01 dist 6 = 4.878717e+01 dist 7 = 4.878727e+01 dist 8 = 4.878757e+01 dist 9 = 4.901000e-03 dist10 = 4.905051e+01 The result is The c:ee.txt and c

41、:q9.txt is min and its value dist9 is 4.901000e-03 经验证,结果正确。 7 误差分析 由上一步调试结果可看出,对数组类型的定义会使它的计算结果的精确度产生影响,由于C语言本身对数组的容量的限制,使得我所选的数组不能超过130×130,所以我用了10×10,即每组有100个数据来验证程序的准确性,在调试的过程中尽量优化程序。 语音信号的特征参数求出之后,可根据该参数的特点,选取或设计合适的距离测度,同时选取合适的语音识别算法,最终形成识别系统. 该识别系统所采用的语音训练集为汉语数字09。如果发音为较标准的普通话,则该语音识别

42、系统的正确识别率可达到98%以上.实验结果表明,在小词汇量情况下(即词汇量不大于300),系统的最大识别延迟为23s. 8 总结 (1)这次课程设计,我所做的工作主要侧重于软件使用的方面。虽然在学习课程中已经对C语言有过一定的理论学习,但是要读懂MATLAB的程序还需要找相关的书来看,所以花了很长的时间在学MATLAB,并且我还从未真正的将C语言运用到工程设计实践中去,不过通过这次实践,我更深刻的理解了C语言在编程上的思想。 (2)要实现这个Dtw与Testdtw的算法,主要是弄懂它的帧匹配距离的由来和累积距离的计算公式。经过不断的调试修改,最终实现了算法的要求。 (3)由于此课题难度较大,由

43、六人组成小组一同完成,期间团队合作精神和交涉力都有了进一步的提高,相信在将来的工作和学习中受益匪浅。 谢 辞 在这次课程设计的过程中,虽然题目难度较大,但经过我们六个人的努力最终实现了课程要求,这次课程设计,培养了我们独立分析问题和解决问题的能力。 最后感谢晋良念老师辛勤的指导和帮助以及学院、系给提供和创造了的优越的条件,使自己的课设得以很好的完成。 参考文献 1 陈尚勒等近代语音识别成都:电子科技大学出版社,1991 2 陈水彬等语言信号处理合肥;中国科技大学出版社1990 3 胡征等矢量量化原理及应用西安:西安电子科技大学出版社,1988 4 古井贞熙著.数字声音处理朱家新等译北京:人民邮

44、电出版社1993 5 杨行畦等语音信号数字处理北京:电子工业出版社,1995 6 万旺根,余小清.一种二阶差分耳蜗模型.电子学报,1995,23(7):69 7 余小清,万旺根等.基于听觉谱特征的语音识别新方法.中国学术期刊文摘,1998,4(3):374375 8 谭浩强.C语言程序设计M.北京:清华大学出版社,1998. 9 数据结构用C语言描述M. 北京:高等教育业出版社,2002. 附 录 附 录1 DTW算法C语言程序 /* function dist=dtw(t,r) */ #include "stdio.h" #include <conio.h>

45、#define m 4 #define n 6 #define realmax 9.9e38 void main() float zmin(float,float,float); float t64=      1.0,2.0,3.0,4.0,2.0,3.0,4.0,5.0,3.0,4.0,5.0,6.0, 4,5.0,6.0,7.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0 ; /*测试值*/ float r64= 1.0,2.0,3.0,4.0,8.0,2.0,6.0,2.0,7.0,2.0,7.0,3.0, &

46、#160;   9.0,2.0,1.0,6.0,2.0,6.0,5.0,3.0,8.0,3.0,6.0,9.0   ; /*参考值*/ int i,j,g,k; float sum1,D3,D4,D5,dist; float D1nm,sum=0.0; float D2nm; clrscr(); printf("nThis is . nn"); for (i=0;i<n;i+) for (j=0;j<m;j+)   D1ij=0; for (i=0;i<n;i+)  for (j=0;j<n;j+)

47、    float x,y;   sum1=0.0;   for(g=0;g<m;g+)   x=tig;   y=rjg;   sum1+=(x-y)*(x-y);     D1ij=sum1; /*帧匹配距离*/   printf("D1%d%d=%fttt",i+1,j+1,D1ij);   putchar('n'); for (i=0;i<n;i+) for (j=0;j<m;j+)   D2ij=realmax;

48、   D200=D100;   putchar('n'); for(i=1;i<n;i+) for(j=0;j<n;j+)  D3=D2i-1j; if(j>0)   D4=D2i-1j-1; else   D4=realmax;   if(j>1)    D5=D2i-1j-2;   else    D5=realmax; D2ij=D1ij+zmin(D3,D4,D5);   dist=D2i

49、-1j-1; /*累积距离*/   printf("nndist=%fn",dist); float zmin(float a,float b, float c) /*求D3,D4,D5的最小值*/ float w,aa; aa=realmax; if(aa=b&&aa=c&&aa=a) return w=8.8e38; if(a>b)   if(b>=c)   w=c;   else   w=b; else   if(a>=c)   w=c;  

50、; else   w=a;   if(a=b) if(a<=c)   w=a;   else w=c; return w; 附 录2 TESTDTW算法C语言程序实现 #include "stdio.h" #include <string.h> #include <conio.h> #define M 10 #define n 10 #define REALMAX 9.9e37 void wave_read(float xnM,char *filename,int d) int i,j; FILE *fp

51、; if(fp=fopen(filename,"rb")=0) printf("nSorry filename %d.n",d); for(i=0;i<n;i+) for(j=0;j<M;j+)  fscanf(fp,"%e",&xij); fclose(fp); float zmin(float a,float b, float c) /*求D3,D4,D5的最小值*/ float aa;   aa=REALMAX; if(aa=b&&aa=c&&aa=a) r

52、eturn 8.8e37; if(a>b) return b>c?c:b; else return a>=c?c:a; if(a=b) return a<=c?a:c; void main() struct datafilename     float data;     char chstrM20;    ; float tnM; float rnM; static struct datafilename strdataM+1; int d,i,j,k,f,g; float distM+1

53、; float sum1,aa,D3,D4,D5; float D1nn; float D2nn; char filename_test220=      "c:ww.txt","c:ee.txt"     ; /*2个测试模板*/ char filename_ref1120= 0,      "c:q1.txt","c:q2.txt" ,      "c:

54、q5.txt","c:q4.txt" ,      "c:q3.txt","c:q6.txt" ,      "c:q7.txt","c:q8.txt" ,      "c:q9.txt","c:q10.txt"     ; /*10个参考模板*/ clrscr(); putchar('n&

55、#39;); for(i=0;i<M;i+)  strdatai.data=0.0;  strcpy(strdatai.chstri,filename_refi+1); putchar('n'); for(k=0;k<=M;k+) /*定义数组distM使其都为0*/ distk=0.0; for(i=0;i<n;i+)   for(k=0;k<M;k+)     tik=0.0;   rik=0.0;   for(i=0;i<n;i+) for(k=0;k<n;k+)     D1ik=0.0;   D2ik=R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论