最近一直在参考HTKbook第三章做HTK语音识别,其中有一步是根据proto和monophones0生成一个hmmdefs文件。自己的训练数据太多,没有找到合适的脚本来生成这个hmmdef文件,所以就用C语言写了一个小工具来生成这个文件。
工具名字:gethmmdefs
参数说明:一共需要三个参数
1.proto文件路径
2.monophones0文件路径
3.生成的hmmdefs文件保存路径
文件下载链接:http://pan.baidu.com/s/1eQvTshs
例子:
C源代码
#include <STDIO.H>
int main(int argc,char *argv[])
{
FILE* proto;
FILE* monophone0;
FILE* hmmdefs;
int i=0;
char ch,ch1;
char word[20];
int w=0;
if (argc < 3)
{
printf("error:请输入参数\n");
return 0;
}
proto = fopen(argv[1],"r");
if (NULL == proto)
{
printf("error:打开文件%s异常\n",argv[1]);
return 0;
}
monophone0 = fopen(argv[2],"r");
if (NULL == monophone0)
{
printf("error:打开文件%s异常\n",argv[2]);
return 0;
}
hmmdefs = fopen(argv[3],"w");
if (NULL == hmmdefs)
{
printf("error:打开文件%s异常\n",argv[3]);
return 0;
}
fprintf(hmmdefs,"~o\n");
fprintf(hmmdefs,"<STREAMINFO> 1 39\n");
fprintf(hmmdefs,"<VECSIZE> 39<NULLD><MFCC_D_A_0><DIAGC>\n");
ch = fgetc(monophone0);
while (1)
{
w = 0;
while (ch != '\n'&& ch != EOF)
{
word[w] = ch;
w++;
ch = fgetc(monophone0);
}
word[w] = '\0';
if (0 == w)
{
break;
}
fprintf(hmmdefs,"~h \"%s\"\n",word);
i = 0;
ch1 = fgetc(proto);
while (4 != i)
{
if ('\n' == ch1)
{
++i;
}
ch1 = fgetc(proto);
}
while(ch1 != EOF)
{
fprintf(hmmdefs,"%c",ch1);
ch1 = fgetc(proto);
}
rewind(proto);
ch = fgetc(monophone0);
}
fclose(proto);
fclose(monophone0);
fclose(hmmdefs);
return 0;
}
如果有不对的地方,还请多多指正。