HTK model转Kaldi model实录——convert_htk的使用

最近差不多一个星期的时间都在弄这个HTK model转Kaldi model的事情,其实并不复杂,但是一开始没有找到问题的出处所以走了很多弯路,不过最后终于转换成功感觉真是不容易,这里把整个过程从头到尾包括其中遇到的问题在这里记录一下,最后还会总结一下正确的操作步骤以及注意事项。


-----------------------------------------------------------------------------------------------------------------------------------------------------------

Part1  基本步骤

1.  首先在cygwin下进入到htk_convertion这个文件夹中,我这里htk_convertion的路径是

     kaldi-trunk\misc\htk_conversion

     如果你装的是kaldi-trunk那路径应该是一样的

2.  在cygwin里执行一条语句:

     ../../egs/wsj/s5/path.sh

     这里是执行了path.sh这个程序,它的作用就是把之后需要用到的一些路径都包括进来。我这里因为需要转换的本来就是wsj的HTK model,然后我的wsj目录下只有s5,所以就执行了这个路径下的path.sh文件,你可以根据自己的model类型以及现有的脚本来进行选择。最好检查一下path.sh的内容,看看包括进了哪些路径,在后期如果出现找不到指定文件的时候也可以查看一下这个地方看看是不是路径缺少的问题。

3.  接下来准备好输入文件,这里所需要的只有两个文件,一是你需要转换的HTK model,也就是MMF文件(这里注意必须是ascii形式的),二是对应的decision tree文件,也就是TREES文件。我这里是将两者放在htk_convertion文件目录下新建的一个wsj_input文件夹内。

4.  那么现在你就可以开始转换过程了。用到的也就是convert_htk.sh这个文件。它的用法是:

     ./convert_htk.sh ../.. MMF TREES convert_dir

     这里需要注意的是,要写正确文件的位置,比如我这里使用的正确语句就应该是:

     ./convert_htk.sh ../.. ./wsj_input/MMF ./wsj_input/TREES ./wsj_output


基本步骤其实就这四步,确实很简单,但是能否顺利完成转换就不好说了。像我就卡了一个星期才转换成功,那么我的总结就是出问题的绝大部分原因都是两个输入文件内容是否正确。下面详细说一下我遇到的问题。


Part2  遇到的问题及解决方案(主要是part1中的步骤4出的问题)

首先得说明的是,我这里遇到的问题是与我准备的HTK model 和 TREES文件密切相关的,所以只能说是特定问题,但是通过这些特定问题的解决也可以从中获取一些启发,知道需要注意一些什么事项。

错误1:


这个问题出现的原因是我的tree文件里面QS中triphone的表现形式不标准,对于标准的输入,QS语句中的表现形式应该是,“p-*”和“*+p”以及“*-p+*”这三种形式。所以我自己写了个小程序修改了一下原来的TREE文件改成这种形式之后,就不再出现这种错误了。

错误2:


这个问题出现的原因在我的HTKmodel也就是MMF文件中,sil的state2和state4的gmm部分直接写在了hmm定义里面,而不是以macros的形式和其他的macros放在一起用~s的形式进行绑定。我把它改成~s的绑定形式就没有这个问题了。不过这里我也不是很清楚为什么会这样,因为做成绑定形式一般都是需要share的内容,但是这里就只有唯一的state用这个内容,我也不知道HTK的标准生成是不是统一的macros形式,如果是的话为什么我这里会出现这么奇怪的乱入= =有点凌乱

错误3:


这个错误原因特别脑残,因为我在上一部修改MMF文件时候把那两个sil的状态的gmm部分删掉了忘记添上去。。。然后我在这个问题上整整耗了三天才找出原因!就是这么一个哭笑不得的原因!后来还是多亏了在kaldi群上结识的一个好心同学将他的mmf文件给我试了试,然后我才从各种乱七八糟的发散思维中找到正轨查出真相。。所以还是要对原理多熟悉一下才能更好地避免这些错误。

错误4:


dim指的是dimension,去到convert_state.pl这个文件里面会发现其中有一条语句是print “<DIMENSION>=39 \n”,也就是说这里他把dimension给固定成39了,那么你就要根据你自己的model来对这个数字进行修改了,修改成对应的dimension之后这个错误就不会出现了。


Part3  总结

最最最核心的一句话就是,保证你的输入文件的正确!那么这个转换过程就相当的简单!

我是走了不少弯路,而且一开始没有把重心放在对输入文件的检查上,还查了很久kaldi的源代码,纠结的不行。不过这个过程还是有学习到的。

查找错误的方法包括输入文件检查、中间文件检查、程序源代码检查。

接下来再接再厉!下面附上转换成功的样子以及转换成功后的输出文件夹中应该是一个什么样子:



看到这样的output文件夹就说明你转换成功啦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值