修改HTK源码 HParse,HVite部分,使其支持中文
2010-03-24 12:05
利用HTK工具包进行语音识别建模时,遇到任务语法中存在中文时候,无法生成对应的底层网络,这样就需要对HTK源码的部分内容进行修改,以下是我对HTK源码HParse及HVite部分内容改动记录,希望对有需要的人有帮助!自己也做个备份! 添加下面函数 static int IsSpace(char c) { if ((c == 0x09) ||( c == 0x0D) || (c == ' ' )) return 1; return 0; } 修改下面的函数 static void PGetSym(void) { ....///////////// +++while ( !IsSpace(ch) || (ch=='/' && inlyne[curpos]=='*') ) //isspace((int) ch) { +++ if (!IsSpace(ch) || isspace((int) ch)) /* skip space */ PGetCh(); else { /* skip comment */ PGetCh(); PGetCh(); while (!(ch=='*' && inlyne[curpos]=='/')) PGetCh(); PGetCh(); PGetCh(); } } ..../////////////以下部分代码为做修改 }static void PGetIdent(void) { int i=0; Ident id;do { if (ch==ESCAPE) PGetCh(); if (i<MAXIDENT) id[i++]=ch; PGetCh(); +++ } while (!IsSpace(ch)&& ch!='{' && ch!='}' && ch!='[' && ch!=']' &&//!isspace( (int)ch) ch!='<' && ch!='>' && ch!='(' && ch!=')' && ch!='=' && ch!=';' && ch!='|' && ch!='/' && ch!='%'); id[i]='\0'; ident = GetLabId(id,TRUE); }ReturnStatus WriteOneLattice(Lattice *lat,FILE *file,LatFormat format) { .../////////////////////////////// else if (ln->word!=NULL) { fprintf(file,"W=%-19s ",ln->word->wordName->name);// // ReWriteString(ln->word->wordName->name,注释掉 // NULL,ESCAPE_CHAR)); ...//////////////////////////////// } 这样在生产的底层网络中就可以看到汉字,而不是汉字编码了。下面是我测试的一个简单例子: 这是taskgram中的内容 $word = 好 | 浩 | 尼 | 你; ( START_SIL ([sil] )(<$word>)( [sil]) END_SIL ) 没有修改HParse生产的网络 VERSION=1.0 N=11 L=22 I=0 W=END_SIL I=1 W=sil I=2 W=\304\343 I=3 W=!NULL I=4 W=\304\341 I=5 W=\272\306 I=6 W=\272\303 I=7 W=sil I=8 W=START_SIL I=9 W=!NULL I=10 W=!NULL J=0 S=1 E=0 J=1 S=3 E=0 J=2 S=3 E=1 J=3 S=3 E=2 J=4 S=7 E=2 J=5 S=8 E=2 J=6 S=2 E=3 J=7 S=4 E=3 J=8 S=5 E=3 J=9 S=6 E=3 J=10 S=3 E=4 J=11 S=7 E=4 J=12 S=8 E=4 J=13 S=3 E=5 J=14 S=7 E=5 J=15 S=8 E=5 J=16 S=3 E=6 J=17 S=7 E=6 J=18 S=8 E=6 J=19 S=8 E=7 J=20 S=10 E=8 J=21 S=0 E=9 修改后的网络 VERSION=1.0 N=11 L=22 I=0 W=END_SIL I=1 W=sil I=2 W=你 I=3 W=!NULL I=4 W=尼 I=5 W=浩 I=6 W=好 I=7 W=sil I=8 W=START_SIL I=9 W=!NULL I=10 W=!NULL J=0 S=1 E=0 J=1 S=3 E=0 J=2 S=3 E=1 J=3 S=3 E=2 J=4 S=7 E=2 J=5 S=8 E=2 J=6 S=2 E=3 J=7 S=4 E=3 J=8 S=5 E=3 J=9 S=6 E=3 J=10 S=3 E=4 J=11 S=7 E=4 J=12 S=8 E=4 J=13 S=3 E=5 J=14 S=7 E=5 J=15 S=8 E=5 J=16 S=3 E=6 J=17 S=7 E=6 J=18 S=8 E=6 J=19 S=8 E=7 J=20 S=10 E=8 J=21 S=0 E=9 至于HVite部分,我找了近一下午,总算找到改的地方了,修改HSheel.c 中WriteString函数 n=*p; fputc(n,f); // fputc(ESCAPE_CHAR,f); // fputc(((n/64)%8)+'0',f);fputc(((n/8)%8)+'0',f);fputc((n%8)+'0',f); 我将相应的位置给注释上了,并将字符之间输出到文件中,这样在结果文件中就可以看到中文了~~ |
No comments:
Post a Comment