1、利用HMM的孤立字词语音识别系统利用HMM的孤立字(词)语音识别系统 /* */* 文件名称:recog.cpp(主程序) */*/# include emhmm. hint BR_ DispMAX_ ARCS; /* Displayment to save multiplies (branch_ prob) * /int ME_ DispMAX_ ARCS; /* Displayment to save mnltiplies (mean) * /int CO_DispMAX_ ARCS; /* Displayment to save multiplies (covariance) * /in
2、t Train _ Disp MAX _ ARCS + MAX _ STATES; / * really only need max(ma,ms) * /im Num _ Dimensions;int Num_ Train_ Sets; /* Size of dimension of training data */int Total _ Frames;int Longest _ Train; /* the length of the longest training set */TRAINING TrainMAX-_ TRAIN_ SIZE;HMM Hmm MAX_ REF;main(arg
3、c,argv)int argc;char * argv; int i, num_ ref, result; int cntMAX _ REF; string hmm_ file; char * in file =NULL, *ref_list = NULL; char ch_ rMAX_REF8; FILE * fp; /*命令行参数设置*/if( argc 5 ) usage(argv 0 );for(i = 1; i argc; i+ + ) if(argvi0 ! = -) fprinff(stderr, Illegal switch %s n, argvi); usage(amv0 )
4、;switch (argvi) 1);case h: ref_ list = argv+ + i; break;case i: in_ file = argv+ + i; break;default: fprimf(stderr, Illegal switch %s n,argvi); usage(argv0); break; /*读取参考模型的数量,即词表的大小*/ if(fp = fopen(ref_ list, r) = = NULL) fprinff(stderr, %s: cant open %s to read. n, ref_list); exit(0);fscanf( fp,
5、%d, &num_ref);/*读取模型的参数*/ for(i = 0; i MAX_TRAIN_ SIZE) fprintf(stderr, %s: too many test patterns in %s. n, argv0, in_ file);exit(0);/*识别*/for(i = 0;i Num_Train_Sets; +i) result = dp(Train + i, num ref); + + cntresult; # if TRACE printf(%3d %3d: %s n, i + 1,Traini.length,ch_rresult); fflush (stdout
6、); # endif free(Train i. data);printf(# # # 识别结果# # #);for(i = 0;i num_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 -h HMM-list -i input-file n,obj); exit(0)
7、; 文件名称:(CMHMM的输入输出函数) #include cmhmm.h#include extern int BR_Disp,ME_Disp,CO_Disp,Train_Disp;extern int Total_Frames;extern int Num_Dimensions,Longest_Train;extern TRAINING Train;extern HMM Hmm;void read_hmm(char *file,int rnum) FILE *fp; int temp,i,j,k,num,mat_num,from,to,bdisp,mdisp,cdisp; float t
8、rans_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*
9、=Num_Dimensions; 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.covaria
10、nce=(float *)malloc(temp)=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;
11、for(k=0;kNum_Dimensions;k+) if(fscanf(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.nu
12、m_states)=NULL)exit(0); for(i=0;iHmmrnum.num_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,%
13、d,&num)=EOF)exit(0); Hmmrnum.statesnum.is_initial=TRUE; 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=(TR
14、ANSITION*)malloc(sizeof(TRANSITION)* Hmmrnum.num_arcs)=NULL)exit(0); for(i=0;i=Hmmrnum.num_omatrix)|(mat_numHmmrnum.num_states-1)|(fromHmmrnum.num_states-1)|(to0) fprintf(stderr,read_hmm:Illegal from(%d)-to(%d)n,from,to); exit(0); if(trans_prob100)exit(0); if(fs=fopen(f_list,r)=NULL) fprintf(stderr,
15、red_data:cant open %s to readn,f_list); exit(0); for(cnt=0;fscanf(fs,%s,f_name)!=EOF;+cnt) if(cnt=MAX_TRAIN_SIZE) printf(Warning in read_data:number of data sets(%s) is forced into %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,FL
16、OATSIZE,(Num_Dimensions+1),fp)=(Num_Dimensions+1);+length); if(Traincnt.data=(float *)malloc(FLOATSIZE * Num_Dimensions*length)=NULL) fprintf(stderr,read_data:not enough space for %sn,f_list); exit(EOF); rewind(fp); for(i=j=0;(m=fread(buff,FLOATSIZE,(Num_Dimensions+1),fp)=(Num_Dimensions+1);+i) for(
17、k=1;kmax)max=length; fclose(fs); Total_Frames=total_length; Longest_Train=max; for(i=j=0;jlength;data = train - data;/* memory allocation for work */if(pn = (double * )malloc(Longest_Train * MAX_STATES * DOUBLEESIZE) = NULL) exit(0);if(outprob_buff = (double * )malloc(Longest_Train) * MAX_ARCS * DOU
18、BLESIZE) = NULL) exit(0);for(s = i = 0;s MAX_STATES; i + = Longest_Train) Outprob_Disps + + = i;for(n = 0;n num_ref; n+) /* step1 */ s = MAX_STATES * Longest_Train;for(i = 0;is;i+) pni=INFINT; /* clear pn */for(s = 0;sHummn.num_omatrix; + + s) if(Hmmn.statess.is_initial) pnTrain_Disps =0.0;for(i = 0
19、;iMAX_ARCA * Longest_Train;outprob_buffi + + = INFINIT);for(s = 0;sHummn.num_omatrix;s + +) for(i = 0;i length; i + +) sum_prob = 0.0; for(j = 0;j Hummn.num_mixture; j + +) branch_prob = Hummn.branch_probBR_disps + j; if(branch_prob = = 0.0) continue; sum_prob + = pow(branch_prob,5.0) * cal_outprob
20、(&(Hummn),n,s,i,j); outprob_buffOutprob_Disps + i = log(sum_prob); for(i = 0;i length; i + +) /* step2 */ for(s = 0;s Hummn.num_states; s + +) /* step3 */ index = Train_Disps + i; stop = &(Hummn.statess.trans_toHummn.statess.num_to); for(cptr = &(Hummn.statess.trans_to0);cptr out_prob_index = = NULL_TRANSITION) prev_pn = pn + (Train_Disptptr - origin + i); if( * prev_pn INFINIT) px =
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1