基于HMM模型的语音识别算法的研究 摘要 语音识别是一门涉及面很广的交叉学科,它是目前发展最为迅速的信息研究领域之一,它与语音学、语言学、数理统计学和神经生理学等学科有非常密切的关系。汉语数字语音识别(mandarin digit speech recognition)的任务是识别0到9等10个非特定人汉语数字语音。本文着眼于汉语语音识别的主要问题,研究汉语语音识别的关键技术,以提高语音的识别率和识别模型的收敛速度。本文利用MATLAB编程实现了基于HMM的汉语数字语音一识别系统,比较HMM用于孤立词和连接词系统的识别率,并与基于DTW的孤立词识别结果作了分析和比较,分别指出了=者的优点和不足,提出了本课题研究未来改进的方向。 关键词:语音识别,隐马尔可夫模型,算法 前言 通过语音传递信息是人类最重要、有效和方便的交换信息的形式。语言是人类特有的功能,声音是人类常用的工具,是相互传递信息的最主要的手段。因此,语音信号是人们构成思想疏通和感情交流最主要的途径。 现在,人类己开始进入了信息化时代,用现代手段研究语音处理技术,使人们能更加有效地产生、传输、存储、获取和应用语音信息,这对于促进社会发展具有十分重要的意义。让计算机能听懂人类的语言,是人类自计算机诞生以来梦寐以求的想法。随着计算机越来越向便捷化方向发展,人们越来越迫切要求摆脱键盘的束缚而转向语音输入这样便于使用的、自然的、人性化的输入方式。尤其是汉语,汉字输入是计算机应用普及的障碍,因此,利用汉语语音进行人机交互是一个极其重要的研究课题。 二、实验过程设计 本课题首先进行了孤立数字的识别实验,其过程可以简述为,首先对,0~9十个数字的语音样本进行预处理,然后进行训练和识别。训练中,用HMM的Baum-Welch训练算法(也叫EM算法),建立系统词汇表中每个数字对应的HMM模型M;识别时,用前向一后向算法或者Viterbi算法求出输入语音在每个模型下的概率响Mr,由于Viterbi算法不仅能求出最大概率,同时还能求出最大概率下的路径,因此本文采用Viterbi算法。最后比较选取最大P(o/Mi)值所对应的数字为识别结果。 在得到孤立数字的HMM模型的基础上,本文进一步研究了汉语连续数字的识别。连续数字识别与孤立数字识别所用的星空体育官方入口 星空体育官网HMM模型一样,在训练阶段将孤立数字识别中得到的各数字的HMM模型作为参考模式。而在识别时,不能仅仅采用Viterbi算法进行最大似然搜索得到结果,需要把连续数字先分解为单字再进行模型匹配。 本课题采用的HMM为4状态从左到右无跨越型HMM。混合数M的大小对识别有很大影响,在训练数据充分的条件下,M越大,越接近实际的语音空间。然而M的增加会使计算量随之增大,综合考虑本文选择M=3。状态观测密度采用混合高斯分布。 基于隐马尔可夫模型的汉语数字语音识别系统如图1-1所示: 图1-1基于HMM模型的汉语数字语音识别 下面分别介绍各个阶段的设计过程 (一)数据采集 利用麦克风和PC机上的录音机对语音信号进行采集。采样频率为11025Hz,采样精度为16bits。首先对“0~9”每个数字都找多个人进行多遍录制,存入语音库,进行孤立数字识别。然后再录入长度分别为2, 3, 4的随机连续数字进行识别,注意录入时语速要均匀。图1-2为显示的连续语音“567“采样后的波形。 图1-2连续语音“567的波形 (二)端点检测阶段 在端点检测之前,需要对采样后的语音进行分帧操作。Matlab语句为:y=enframe(x,len,inc), x为包含语音采样的一维数组,本文取帧长len=240,帧移inc=80。函数返回一个nXlen的矩阵,每行都是一帧数据。即一维数组x经enf星空体育官方入口 星空体育官网rame函数处理后得到=维数组Y,总的帧数为n帧,每一帧都是240个采样。 分帧后即可计算短时能量和过零率参数,然后利用本文第=章基于能量一过零率的端点检测算法进行端点检测。其中在计算短时能量之前,需先将语音信号通过一个一阶高通滤波器1一0.9375,以提升语音高频部分,然后再进行分帧操作,因此计算能量的语句为: amp=sum(abs(enframe(filter([ 1-0.9375],1,x),240,80)),2) 这里本文选用的是绝对值能量,也就是平均幅度。图5-3为端点检测图形,两条红色竖线表示检测到的语音起点和终点。 图1-3端点检测 (三)参数提取阶段 本实验特征参数采用12阶的LPCC参数和12阶MFCC参数及其一阶差分(共24维),通过MATLAB编程,、完成数据识别。其中LPCC参数是由LPC参数递推得到的,计算LPC参数的语句为a=lpc(yn)} y为分帧后的语音数据,n为LPC模型的极点个数。 利用LPC参数迭代计算LPCC参数的程序如下: %1pc21pcc.m function lpcc=1pc21pcc(lpc) n,lpc=8;n Ipcc=12; %v}xLPC阶数为8, LPCC阶数为12 lpcc=zeros(n lpcc, l );%将LPCC初始化为12行1列的零阵 lpcc(1)=lpc(1);%第1阶=者参数相等 %第2阶到第8阶的LPCC参数由LPC参数迭代得到 for n=2:n lpc Ipcc(n卜lpc(n); for 1=1:n-1 lpcc(n)=Ipcc(n)+lpc(I)*lpcc(n一1)*(n-1)/n; end end for n=n_ Ipc+l:n_ lpcc %后4阶LPCC参数通过外推得到 Ipcc(n)=0: for 1=l :n_lpc lpcc(n)=Ipcc(n)+Ipc(1)*lpcc(n一1)}(n一1)In; end end lpcc=-lpcc; 图1-4为提取的12维LPCC参数图形。 图1-4 12维LPCC参数 在求取MFCC参数时,通常是把人的发生系统视为一组滤波器的组合,而MFCC参数就是这组滤波器的参数。因此首先在语音的频谱范围内设置若干个带通滤波器,滤波器的个数M通常取24。计算M个滤波器的系数的语句为h=melbankm(m,n,fs),其中,m为滤波器个数,n为语音帧长度,fs为采样率。根据第=章所述提取MFCC参数的原理,可以得到以下提取MFCC参数的代码: %mfcc.m function ccc=mfcc(x) %归化mel滤波器组的系数,24个滤波器,帧长240, fs=11025 bank=melbankm(24,240,11025); bank=full(bank); bank=bank/max(bank(:)); %DCT系数,12*24 for k=1:12 n=0:23; dctcoef(k,:)=cos((2*n+I )*k*pi/(2*24)); end %归一化倒谱提升窗口 w=1+6*sin(pi*!1:12]./12); w=w/maxi w)= %预加重滤波器 xx=double(x); xx=filter([1 -0.9375],l,xx); %语音信号分帧 xx=enframe(xx,256,80); %计算每帧的MFCC参数 for i=1 aize(xx, l ) Y=xx(i,:); s=Y}.*hamming(256); t=abs(fft(s)); t=t.^2; c 1=dctcoef * log(bank*t(1:129)); c2=cl.*w; m(i,:卜c2} end %差分参数 dtm=zeros(size(m)); for i=3 aize(m, l )-2 dtm(i,:)=-2*m(i-2,:)一m(i-1,:)+m(i+1,:)+2*m(i+2,:); end dtm=dtm/3; %合并MFCC参数和一阶差分MFCC参数 ccc=[m dtm]; %去除首尾两帧,因为这两帧得一阶差分参数为0 ccc=ccc(3 aize(m, l )-2,:); 图1-5为提取的24维MFCC参数图形。 图1-5 24维MFCC参数 (四)训练阶段 训练阶段采用EM训练算法对对初始模型进行训练,需要经过多次迭代才能得到结果,同时还要给出结束迭代的条件。本实验首先计算所有观察序列的输出概率,对其进行累加,得到总和输出概率,当此概率的相对变化小到一定数值的时候结束迭代。另外,还要设定最大迭代次数为一常数,当迭代次数超过此常数时,也停止迭代。 实验采集了若干组)9之间的数字,首先创建一个1行10列的单元数组 samples=cell(1,10),然后调用录音程序将语音录入fs=11025;x=wavrecord(10*fs,fs,int 16),再通过循环程序将录入的语音信号’‘、导入数组samples中,samples f i} {k}=x,其中i为要训练的数字i最大为10} k为针对某一个数的训练次数。samples包含了观察序列的信息,每个samples(k)都包含两个成员samples(k).wave和samples(k).data,分别为该观察序列的原始语音和参数。 将保存在数组中的语音信号交给训练函数em train进行训练,训练结束后,得到一个结构数组,数组的每个元素为一个hmm结构,即每个数字对应一个hmm结构。图1-6显示了模型收敛后的参数。 %em train.m function [hmm, pout]=em_train(samples, M) %输入: %samples—样本结构 %M—为每个状态指定正态高斯概率密度函数(简称pdf)的个数,如:[3333] %输出: %hmm—训练完成后的hmm K=length(samples); %计算语音参数 dispf正在计算语音参数) for k=I:K if isfield(samples(k),data)}isempty(samples(k).data) continue; else samples(k).data=mfcc(samples(k).wave); end end hmm一inithmm(samples, M);%初始化HMM模nJ for loop = 1:40%最大迭代次数为40,如仍不收敛则退出 fprintf(}n第%d遍}lil练}n}n,loop) hmm=baum(hmm, samples); 印rintf}( f1MM模’(」参数’); %计算总输出概率 pout(loop)=0; for k=1:K pout(loop)=pout(loop)+viterbi(hmm, samples(k).data); end %比较两个HMM的距离 if loop 1 if abs((pout(loop)-pout(loop-1))/pout(loop))Se-6 return end end end 图1-6 HMM模型参数 (五)识别阶段 识别程序要求输入一个HMM模型的参数和一个测试用的语音观察序列,然后计算出此观察序列对该模型的输出概率,并给出最佳的状态路径。HMM的识别一般采用Viterbi算法,MATLAB语音工具箱中提供了计算Viterbi算法的程序viterbi.m。本实验采用的对数形式的Viterbi,即对起始概率和转移概率都有一个取对数的操作,为了防止出现对0取对数而造成下溢,本文对Viterbi程序作了修改,即用find函数分别找到大于0和小于0的元素的下标,然后用下标分别给trans矩阵的不同元素赋值,这样就不会出现对0取对数的警告错误了。修改后的程序如下: 0.4}Viterbi.m function [prob.q]=viterbi(hmm. O) %输入: %hmm—hmm模型 %O—输入观察序列,NXD} N为帧数,D为向量维数 %输出: %prob—输出概率 %9—状态序列t;%初始概率矩阵 trans=hmm.trans;%转移概率矩阵 mix=hmm.mix;%高斯混合矩阵 N=hmtn.N; %HMM状态数 T = size(O,1);%语音帧数 %计算log(init); indl=find(ini V0); ind0=find(init=0); init(ind0)=一inf; init(indl)=log(init(indl)); %计算log(trans); ind 1=fmd(trans0); ind0=find(trans=0); trans(ind0)=-inf; trans(indl) = log(trans(indl)); %初始化 delta=zeros(T,N); fai=zeros(T,N); Q=zeros(T,1); %t=1 x=O(1,:); for i=1:N delta( I ,i)=init(i)+log(mixture(mix(i),x)); end %t=2:T for t=2:T forj=1:N [delta(tJ)faitj)]=max(delta(t-1,:)+trans(:j)’); x=O(t,:); delta(t}j)=delta(t}j)+log(mixture(mix(j),x)); end %最终概率和最后节点 [prob q(T))=max(delta(T
2、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
3、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
4、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
口腔执业医师(口腔颌面外科学)模拟试卷18(题后含答案及解析).pdf
义务教育版(2024)五年级全一册信息科技 第21课 鸡兔同笼巧计算 教案.docx
原创力文档创建于2008年,本站为文档C2C交易模式,即用户上传的文档直接分享给其他用户(可下载、阅读),本站只是中间服务平台,本站所有文档下载所得的收益归上传人所有。原创力文档是网络服务平台方,若您的权利被侵害,请发链接和相关诉求至 电线) ,上传者