利用HMM的孤立字词语音识别系统

上传人:飞*** 文档编号:53900388 上传时间:2022-02-11 格式:DOCX 页数:12 大小:51.20KB
收藏 版权申诉 举报 下载
利用HMM的孤立字词语音识别系统_第1页
第1页 / 共12页
利用HMM的孤立字词语音识别系统_第2页
第2页 / 共12页
利用HMM的孤立字词语音识别系统_第3页
第3页 / 共12页
资源描述:

《利用HMM的孤立字词语音识别系统》由会员分享,可在线阅读,更多相关《利用HMM的孤立字词语音识别系统(12页珍藏版)》请在装配图网上搜索。

1、文档来源为 :从网络收集整理.word 版本可编辑.欢迎下载支持利用HMM的孤立字(词)语音识别系统/*/*/文件名称:recog.cpp(主程序)*/12/*/#includeemhmm.hintBR_DispMAX_ARCS;/*Displaymenttosavemultiplies(branch_prob)*/intME_DispMAX_ARCS;/*Displaymenttosavemnltiplies(mean)*/intCO_DispMAX_ARCS;/*Displaymenttosavemultiplies(covariance)*/intTrain_DispMAX_ARCS+M

2、AX_STATES;/*reallyonlyneedmax(ma,ms)*/imNum_Dimensions;intNum_Train_Sets;/*Sizeofdimensionoftrainingdata*/intTotal_Frames;intLongest_Train;/*thelengthofthelongesttrainingset*/TRAININGTrainMAX-_TRAIN_SIZE;HMMHmmMAX_REF;main(argc,argv)intargc;char*argv;inti,num_ref,result;intcntMAX_REF;stringhmm_file;

3、char*infile=NULL,*ref_list=NULL;charch_rMAX_REF8;FILE*fp;/*命令行参数设置*/if(argc5)usage(argv0);for(i=1;iargc;i+)if(argvi0!=-)fprinff(stderr,Illegalswitch%sn,argvi);usage(amv0);switch(argvi)1);caseh:ref_list=argv+i;break;casei:in_file=argv+i;break;default:fprimf(stderr,Illegalswitch%sn,argvi);usage(argv0)

4、;break;/*读取参考模型的数量,即词表的大小*/if(fp=fopen(ref_list,r)=NULL)fprinff(stderr,%s:cantopen%storead.n,ref_list);exit(0);fscanf(fp,%d,&num_ref);/*读取模型的参数*/for(i=0;iMAX_TRAIN_SIZE)fprintf(stderr,%s:toomanytestpatternsin%s.n,argv0,in_file);exit(0);/*识别*/for(i=0;iNum_Train_Sets;+i)result=dp(Train+i,numref);+cntr

5、esult;#ifTRACEprintf(%3d%3d:%sn,i+1,Traini.length,ch_rresult);fflush(stdout);#endiffree(Traini.data);printf(#识别结果#);for(i=0;inum_ref;i+)printf(#/%4s/=%6.2f%n,ch_ri,cnti*100.0/Num_Train_Sets);/*/*函数名称:usage*/*/*函数功能:提示信息,并退出程序/*输入函数:obj-指向提示信息的指针/*/usage(obj)char*obj;fprintf(stderr,Useage:%s-hHMM-lis

6、t-iinput-filen,obj);exit(0);文件名称:(CMHMM的输入输出函数)#includecmhmm.h#includeexternintBR_Disp,ME_Disp,CO_Disp,Train_Disp;externintTotal_Frames;externintNum_Dimensions,Longest_Train;externTRAININGTrain;externHMMHmm;voidread_hmm(char*file,intrnum)FILE*fp;inttemp,i,j,k,num,mat_num,from,to,bdisp,mdisp,cdisp;fl

7、oattrans_prob;if(fp=fopen(file,r)=NULL)exit(0);if(fscanf(fp,%d,&Num_Dimensions)=EOF)exit(0);if(fscanf(fp,%d,&temp)=EOF)exit(0);Hmmrnum.num_omatrix=temp;if(fscanf(fp,%d,&temp)=EOF)exit(0);Hmmrnum.num_mixture=temp;for(i=0;iHmmrnum.num_omatrix;+i)temp=i*Hmmrnum.num_mixture;BR_Dispi=temp;temp*=Num_Dimen

8、sions;ME_Dispi=temp;temp*=Num_Dimensions;CO_Dispi=temp;temp=FLOATSIZE*Hmmrnum.num_omatrix*Hmmrnum.num_mixture;if(Hmmrnum.branch_prob=(float*)malloc(temp)=NULL)exit(0);temp*=Num_Dimensions;if(Hmmrnum.mean=(float*)malloc(temp)=NULL)exit(0);temp*=Num_Dimensions;if(Hmmrnum.covariance=(float*)malloc(temp

9、)=NULL)exit(0);for(i=0;iHmmrnum.num_omatrix;i+)bdisp=BR_Dispi;for(j=0;jHmmrnum.num_mixture;j+)if(fscanf(fp,%f,Hmmrnum.branch_prob+bdisp+j)=EOF)exit(0);for(temp=0,j=0;jHmmrnum.num_mixture;+j,temp+=Num_Dimensions)mdisp=ME_Dispi+temp;cdisp=CO_Dispi+temp*Num_Dimensions;for(k=0;kNum_Dimensions;k+)if(fsca

10、nf(fp,%f,Hmmrnum.mean+mdisp+k)=EOF)exit(0);for(k=0;kNum_Dimensions*Num_Dimensions;k+)if(fscanf(fp,%f,Hmmrnum.covariance+cdisp+k)=EOF)exit(0);if(fscanf(fp,%d,&temp)=EOF)exit(0);Hmmrnum.num_states=temp;if(Hmmrnum.states=(STATE*)malloc(sizeof(STATE)*Hmmrnum.num_states)=NULL)exit(0);for(i=0;iHmmrnum.num

11、_states;i+)Hmmrnum.statesi.label=i;Hmmrnum.statesi.num_from=Hmmrnum.statesi.num_to=0;Hmmrnum.statesi.is_initial=Hmmrnum.statesi.is_final=FALSE;if(fscanf(fp,%d,&temp)=EOF)exit(0);Hmmrnum.num_initial=temp;for(i=0;iHmmrnum.num_initial;i+)if(fscanf(fp,%d,&num)=EOF)exit(0);Hmmrnum.statesnum.is_initial=TR

12、UE;if(fscanf(fp,%d,&temp)=EOF)exit(0);Hmmrnum.num_final=temp;for(i=0;iHmmrnum.num_final;i+)if(fscanf(fp,%d,&num)=EOF)exit(0);Hmmrnum.statesnum.is_final=TRUE;if(fscanf(fp,%d,&temp)=EOF)exit(0);Hmmrnum.num_arcs=temp;if(Hmmrnum.transitions=(TRANSITION*)malloc(sizeof(TRANSITION)*Hmmrnum.num_arcs)=NULL)e

13、xit(0);for(i=0;i=Hmmrnum.num_omatrix)|(mat_numHmmrnum.num_states-1)|(fromHmmrnum.num_states-1)|(to0)fprintf(stderr,read_hmm:Illegalfrom(%d)-to(%d)n,from,to);exit(0);if(trans_prob100)exit(0);if(fs=fopen(f_list,r)=NULL)fprintf(stderr,red_data:cantopen%storeadn,f_list);exit(0);for(cnt=0;fscanf(fs,%s,f_

14、name)!=EOF;+cnt)if(cnt=MAX_TRAIN_SIZE)printf(Warninginread_data:numberofdatasets(%s)isforcedinto%d.n,f_list,MAX_TRAIN_SIZE);fflush(stdout);break;if(fp=fopen(f_name,rb)=NULL)exit(0);for(length=0;(m=fread(buff,FLOATSIZE,(Num_Dimensions+1),fp)=(Num_Dimensions+1);+length);if(Traincnt.data=(float*)malloc

15、(FLOATSIZE*Num_Dimensions*length)=NULL)fprintf(stderr,read_data:notenoughspacefor%sn,f_list);exit(EOF);rewind(fp);for(i=j=0;(m=fread(buff,FLOATSIZE,(Num_Dimensions+1),fp)=(Num_Dimensions+1);+i)for(k=1;kmax)max=length;fclose(fs);Total_Frames=total_length;Longest_Train=max;for(i=j=0;jlength;data=train

16、-data;/*memoryallocationforwork*/if(pn=(double*)malloc(Longest_Train*MAX_STATES*DOUBLEESIZE)=NULL)exit(0);if(outprob_buff=(double*)malloc(Longest_Train)*MAX_ARCS*DOUBLESIZE)=NULL)exit(0);for(s=i=0;sMAX_STATES;i+=Longest_Train)Outprob_Disps+=i;for(n=0;nnum_ref;n+)/*step1*/s=MAX_STATES*Longest_Train;f

17、or(i=0;is;i+)pni=INFINT;/*clearpn*/for(s=0;sHummn.num_omatrix;+s)if(Hmmn.statess.is_initial)pnTrain_Disps=0.0;for(i=0;iMAX_ARCA*Longest_Train;outprob_buffi+=INFINIT);for(s=0;sHummn.num_omatrix;s+)for(i=0;ilength;i+)sum_prob=0.0;for(j=0;jHummn.num_mixture;j+)branch_prob=Hummn.branch_probBR_disps+j;if

18、(branch_prob=0.0)continue;sum_prob+=pow(branch_prob,5.0)*cal_outprob(&(Hummn),n,s,i,j);outprob_buffOutprob_Disps+i=log(sum_prob);for(i=0;ilength;i+)/*step2*/for(s=0;sHummn.num_states;s+)/*step3*/index=Train_Disps+i;stop=&(Hummn.statess.trans_toHummn.statess.num_to);for(cptr=&(Hummn.statess.trans_to0

19、);cptrout_prob_index=NULL_TRANSITION)prev_pn=pn+(Train_Disptptr-origin+i);if(*prev_pnINFINIT)px=*prev_pn+tptr-trans_prob;if(pxpnindex)pnindex=px;elseif(i0)prev_pn=pn+(Train_Disaptptr-origin+i-1);if(*prev_pnINFINIE)out_prob=*(outprob_buff+Outprob_Disptptr-out_prob_index+i);if(out_probINFINIT)px=*prev

20、_pn+(tptr-trans_prob)+out_prob;if(pxpnindex)pnindex=px;pn=pnTrain_Disp(Hummn.num_states)-1+length-1;free(pn);free(outprob_buff);nhat=0;for(n=1;npnhat)nhat=n;returnnhat;/*/*函数名称:cal-outprob*/*/*/*函数功能:计算特征向量序列输入到HUMM室的输出概率的大小/*输入参数:humm-HUMM的参数;ref-num-HUMM的序号;onum-具有输出字符的/*的状态的序号;inum-输入特征向量的个数;mnum

21、-混合概率密度的序号*/*返回值:HMM的输出概率*/*/doublecal_outprob(HUMM*hmm,intref_num,intonum,intinum,intmnum)doublea100,b,out_prob;inti,j,mdisp,cdsp,ddisp;if(Num_Dismensions100)exit(0);i=mnum;ddisp=BR_Disaponum+i;i*=Num_Dimensions;mdisp=ME_Disponum+i;i*=Num_Dimensions;cdisp=CO_Disponum+i;out_prob=0.0;for(i=0;imeanmdi

22、sp+i;for(i=0;i=Num_Dimensions;i+)b=0.0;for(i=0;jMIN_OUTPROB)?out_prob;MIN_OUTPROB;文件名称:cmhmm.h#includecmhmm.h#defineM_PI3.846externintNum_Dimensions;externHMMHmm;externintCO_Disp,BR_Disp;double*Inv_CovarianceMAX_REF;double*Det_CovarianceMAX_REF;voidcal_invdet(intrnum)inti,j,k,l,m;intwork100;intlr,iw

23、,cdisp,ddisp;doubleeps=1.0e-20,w,wmax,pivot,api;if(Num_Dimensions100)exit(0);/*memoryallocation*/i=Hmmrnum.num_omatrix*Hmmrnum.num_mixture;if(Det_Covariancernum=(double*)malloc(i*DOUBLESIZE)=NULL)exit(0);for(m=0;mHmmrnum.num_omatrix;m+)for(l=0;lHmmrnum.num_mixture;l+)cdisp=CO_Dispm+Num_Dimensions*Nu

24、m_Dimensions*l;ddisp=BR_Dispm+1;for(i=0;iNum_Dimensions;i+)for(j=0;jNum_Dimensions;j+)Inv_Covariancernumcdisp+i*Num_Dimensions+j=Hmmrnum.covariancecdisp+i*Num_Dimensions+j;Det_Covariancernumddisp=1.0;for(i=0;iNum_Dimensions;i+)worki=i;for(k=0;kNum_Dimensions;k+)wmax=0.0;for(i=k;iNum_Dimensions;i+)w=

25、fabs(Inv_Covariancernumcdisp+k*Num_Dimensions+i);if(wwmax)continue;wmax=w;lr=i;pivot=Inv_Covariancernumcdisp+k*Num_Dimensions+i;api=fabs(pivot);if(api=eps)exit(0);Det_Covariancernumddisp*=pivot;if(Det_Covariancernumddisp=0.0)printf(cal_invdet:Det_Covariance%d%disunderflow.n,rnum,ddisp);exit(0);if(lr

26、!=k)Det_Covariancernumddisp*=-1.0;iw=workk;workk=workk;workk=iw;for(j=0;jNum_Dimensions;j+)w=Inv_Covariancernumcdisp+j*Num_Dimensions+k;Inv_Covariancernumcdisp+j*Num_Dimensions+k=Inv_Covariancernumcdisp+j*Num_Dimensions+lr;w=Inv_Covariancernumcdisp+j*Num_Dimensions+lr=w;for(i=0;iNum_Dimensions;i+)In

27、v_Covariancernumcdisp+i*Num_Dimensions+k/=pivot;for(i=0;iNum_Dimensions;i+)if(i=k)continue;w=Inv_Covariancernumcdisp+k*Num_Dimensions+i;if(w=0.0)continue;for(j=0;jNum_Dimensions;j+)if(j=k)continue;Inv_Covariancernumcdisp+j*Num_Dimensions+i-=w*Inv_Covariancernumcdisp+j*Num_Dimensions+k;Inv_Covariance

28、rnumcdisp+k*Num_Dimensions+i=-w/pivot;Inv_Covariancernumcdisp+k*Num_Dimensions+k=1.0/pivot;for(i=0;iNum_Dimensions;i+)while(1)k=worki;if(k=i)break;iw=workk;workk=worki;worki=iw;for(j=0;jNum_Dimensions;j+)w=Inv_Covariancernumcdisp+i*Num_Dimensions+j;Inv_Covariancernumcdisp+i*Num_Dimensions+j=Inv_Covariancernumcdisp+k*Num_Dimensions+j;Inv_Covariancernumcdisp+k*Num_Dimensions+j=w;if(w=Det_Covariancernumddisp)0.0)fprintf(stderr,ERROR:Det_Covariance%d%d1)*sqrt(w);

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!