前面的博文kaldi源码的交叉编译已经将嵌入式平台的解码器编译完成,解码器有GMM、nnet2、nnet3等等,GMM解码器又分为单音素、三音素解码,本博文介绍如何设置解码器参数,并在嵌入式平台运行解码器。
以单音素模型为例,在训练结果s5/exp/mono目录下,需要的解码模型文件为:40.mdl(或者final.mdl,两者是同一个文件) graph/HCLG.fst graph/words.txt
./online-gmm-decode-faster --rt-min=0.5 --rt-max=0.7 --max-active=4000 --beam=12.0 --acoustic-scale=0.0769 ./40.mdl ./graph/HCLG.fst ./graph/words.txt 1:2:3:4:5
测试结果:
同样以单音素模型为例,在训练结果s5/exp/mono目录下,需要的解码模型文件为:40.mdl(或者final.mdl,两者是同一个文件) graph/HCLG.fst graph/words.txt ,相比于在线解码,此处需要提供一个input.scp文件,结构是说话人和wav文件的对应,结构如下:
解码命令:
./online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85 --max-active=4000 --beam=12.0 --acoustic-scale=0.0769 scp:./input.scp ./final.mdl ./graph/HCLG.fst ./graph/words.txt 1:2:3:4:5 ark,t:./trans.txt ark,t:ali.txt
测试结果:
File: utt1
WARNING (online-wav-gmm-decode-faster[5.4.0~14-dffb]:Read():wave-reader.cc:260) Expected 28304 bytes in RIFF chunk, but after first data block there will be 36 + 28152 bytes (we do not support reading multiple data chunks).
二十七 邓
File: utt2
WARNING (online-wav-gmm-decode-faster[5.4.0~14-dffb]:Read():wave-reader.cc:260) Expected 26636 bytes in RIFF chunk, but after first data block there will be 36 + 26484 bytes (we do not support reading multiple data chunks).
二十 较多
注:如果是 tri1 tri2 tri3解码,以上两个解码器需要多一些参数,具体如下:
./online-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85 --max-active=14000 --beam=1.0 --acoustic-scale=0.1 --left-context=3 --right-context=3 tri2b/final.mdl tri2b/HCLG.fst tri2b/words.txt '1:2:3:4:5' tri2b/12.mat
./online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85 --max-active=4000 --beam=12.0 --acoustic-scale=0.0769 --left-context=3 --right-context=3 scp:./input.scp ./final.mdl ./HCLG.fst ./words.txt 1:2:3:4:5 ark,t:./trans.txt ark,t:ali.txt ./12.mat
------------------------------------------------------------------------------------------------------------------------------------------------------------
与onlinebin中解码器有所不同的是,需要先生成一些配置文件,具体命令如下(单音素为例):
steps/online/prepare_online_decoding.sh data/train/ data/lang exp/mono exp/mono/final.mdl exp/mono_online
配置文件生成在mono_online文件夹中,然后执行下面命令运行解码器:
./online2-wav-gmm-latgen-faster --do-endpointing=false --config=./mono_online/conf/online_decoding.conf --add-pitch=false --max-active=7000 --beam=13 --lattice-beam=6.0 --acoustic-scale=0.083333 --word-symbol-table=./mono/words.txt ./mono/HCLG.fst 'ark:echo utterance-id1 utterance-id1|' "scp:echo utterance-id1 1.wav|" 'ark:/dev/null'
其中--add-pitch=false,具体需要看训练时是否有添加pitch选项,如果有就需要设置成true,并且设置--online-pitch-config= ,该参数为pitch.conf的路径。
同3中的解码器需要生成配置文件,由于训练时未加入ivector,所以生成配置文件时也没有添加ivector的参数
./steps/online/nnet3/prepare_online_decoding.sh data/lang_chain exp/chain/tdnn_1b_all_sp ./chain_conf
./online2-wav-nnet3-latgen-faster --do-endpointing=false --online=false --frame-subsampling-factor=3 --config=./model/chain_conf/conf/online.conf --add-pitch=false --max-active=7000 --beam=15.0 --lattice-beam=6.0 --acoustic-scale=1.0 --word-symbol-table=./model/graph/words.txt ./model/chain_conf/final.mdl ./model/graph/HCLG.fst 'ark:echo utterance-id1 utterance-id1|' "scp:echo utterance-id1 test.wav|" 'ark:/dev/null'
测试结果:
参考 基于kaldi训练唤醒词模型的一种方法 2. 解码