查看文章
 
修改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);
我将相应的位置给注释上了,并将字符之间输出到文件中,这样在结果文件中就可以看到中文了~~

类别:语音识别,htk||添加到搜藏 |分享到i贴吧|浏览(343)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu