转载:https://blog.csdn.net/zjm750617105/article/details/52540823
目录
L.fst
MFCC&FBANK
monophone, triphone
tree
ali.1.gz
show-transitions
样例是用自己的数据跑的,改编自wsj,文件名称不是很标准,但重点是工具的使用,加路径是为了好理解,内容暂时不解释,以后有时间来补充。
这个文档太棒了,理解每一个步骤,语音识别的整个流程也就懂了,太赞
1. 查看生成的后缀为fst的状态机文件,比如用基于lexicon生成的L.fst文件
kaldi/tools/openfst-1.3.4/bin/fstprint L.fst | head -n 10
0 1 0 0 0.693147182
0 1 1 0 0.693147182
1 1 1 1
1 3 41 2
1 4 9 3
1 5 9 3
1 6 50 4
1 1 3 5 0.693147182
1 2 3 5 0.693147182
1 1 2 6 0.693147182
这里全是状态编号,音素编号,我们加上in out的symbol, 再来看一下:
kaldi/tools/openfst-1.3.4/bin/fstprint --isymbols=phones.txt --osymbols=words.txt L.fst | head -n 15
0 1 0.693147182
0 1 SIL 0.693147182
1 1 SIL !SIL
1 3 l 0
1 4 y 1
1 5 y 1
1 6 b 8
1 1 NSN 0.693147182
1 2 NSN 0.693147182
1 1 SPN 0.693147182
1 2 SPN 0.693147182
1 1 SPN 0.693147182
1 2 SPN 0.693147182
1 7 y 一
1 9 zh 丁
2.查看生成的特征文件是最常用的,比如 MFCC FBANK , 我们可以把特征提取出来用到其他的地方。 后缀是ark.
~/kaldi/src/featbin/copy-feats ark:raw_mfcc_test_hires.1.ark ark,t:- | head
10004_20131215_1500 [
119.0376 -20.32184 -5.752641 -4.167009 -11.58426 -1.337468 -7.541201 12.98721 -1.089335 14.15153 -12.38381 11.27721 12.04524 7.761714 3.874496 3.799245 3.997328 9.124523 10.90271 4.434446 -1.662033 2.691407 0.189684 -0.5175514 -0.6428261 2.352945 3.224356 -1.128094 -0.3864679 -3.433785 -1.603787 2.32985 1.756699 -5.722286 -0.9243896 -3.551574 -1.636747 3.108243 -3.937289 2.92369
119.1508 -19.12406 -2.126905 -4.897838 1.783538 6.32558 1.863739 15.13863 0.264082 10.16311 -3.020157 10.0787 9.172827 10.3625 -0.9937901 -9.649223 -6.279063 2.917279 0.9189801 -8.659749 -7.546872 0.6900706 1.389359 -0.2164259 -0.3871719 1.281542 -0.9054519 -1.893233 -6.873401 -10.39719 -6.552455 3.396601 4.599606 -4.050654 8.241162 1.120707 -3.35814 -3.003432 -0.601518 2.619267
118.9244 -15.58515 2.636317 -7.382653 -5.063384 17.41087 10.11115 16.57291 1.31674 -3.213301 -14.29911 -1.906423 -0.3702135 -2.695652 0.3693304 -2.483643 -2.623828 1.305008 -1.192529 1.51228 0.9064405 2.555791 0.2533633 -0.2349472 -1.139931 0.2506592 -2.818117 0.4369624 0.7818432 -4.507071 -8.351133 2.152058 3.476663 -1.346211 -5.356442 -5.161659 -0.3225842 -2.24053 0.79828 -0.3354585
119.1508 -16.02071 2.351946 -2.559187 -14.40779 -0.9725609 -0.7762442 8.337196 -2.141994 -0.4936666 -5.573881 1.689113 18.33244 -3.188126 -4.012128 3.697093 4.18384 1.627462 -3.17522 -3.447 -2.169386 -0.1549793 -0.3595492 0.08454537 0.1667457 0.3449295 1.864596 0.3326254 3.628092 3.554996 0.9853668 -5.319868 -2.710215 -9.217516 -4.620385 2.959465 -3.915854 -8.763802 0.5119576 2.01042
这里需要注意的是在文件前边加ark关键字,告诉copy-feats是什么格式的,还有后面加一个ark,t:- 表示输出格式为t文本,否则默认是二进制。
此时的ark是40维的,如果我们需要加差分该怎么做呢:
~/kaldi/src/featbin/copy-feats ark:raw_mfcc_test_hires.1.ark ark:- |~/kaldi/src/featbin/add-deltas ark:- ark,t:- | head
10004_20131215_1500 [
119.0376 -20.32184 -5.752641 -4.167009 -11.58426 -1.337468 -7.541201 12.98721 -1.089335 14.15153 -12.38381 11.27721 12.04524 7.761714 3.874496 3.799245 3.997328 9.124523 10.90271 4.434446 -1.662033 2.691407 0.189684 -0.5175514 -0.6428261 2.352945 3.224356 -1.128094 -0.3864679 -3.433785 -1.603787 2.32985 1.756699 -5.722286 -0.9243896 -3.551574 -1.636747 3.108243 -3.937289 2.92369 -0.01132202 1.067116 2.040365 -0.7162117 2.640955 4.515973 4.470964 0.932281 0.6165569 -3.871809 0.5533068 -2.756577 -2.770333 -1.831395 -1.187862 -2.601424 -2.351871 -2.184628 -3.41742 -1.893853 -0.07478918 -0.2272571 0.1327033 0.08663338 -0.07385565 -0.5275974 -1.621475 0.2364974 -0.4150311 -0.9109982 -1.844336 0.07111672 0.6282836 1.042378 0.03014457 0.145211 0.09069339 -1.680922 1.280691 -0.6822721 -0.07623863 0.1410118 0.5019157 0.2543283 -0.1998862 -0.2017508 0.3745222 -0.4321236 -0.6195646 -0.8956326 0.5959293 -0.2049536 0.9841186 -0.6311864 -0.3933576 0.4015603 0.4194488 -0.3587303 -0.7412351 -0.03453226 0.236979 -0.1024217 -0.07473225 0.02339086 0.002982635 -0.167089 0.005051896 0.209022 0.3103455 0.588097 0.04637083 -0.7635834 -0.4218428 -0.0124809 -0.5255278 0.1946553 -0.1449483 -0.5323422 0.2126002 -0.06912227
将ark文件以二进制读出来给add-deltas然后再输出文本格式, 这时候发现每一行是120维。
如果要想在mfcc.sh中直接输出只带一阶差分的特征:
$cmd JOB=1:$nj $logdir/make_mfcc_${name}.JOB.log \
compute-mfcc-feats $vtln_opts --verbose=2 --config=$mfcc_config \
scp,p:$logdir/wav_${name}.JOB.scp ark:- \| \
copy-feats --compress=$compress ark:- ark:- \| \
add-deltas --delta-order=1 ark:- ark,scp:$mfccdir/raw_mfcc_$name.JOB.ark,$mfccdir/raw_mfcc_$name.JOB.scp \
|| exit 1;
3. 查看生成的GMM的模型,比如monophone, triphone的model
kaldi/src/gmmbin/gmm-copy --binary=false 0.mdl -
关于这个文件的解读还是很重要的,大家先看参考链接中的demo,那个没发直接copy,下面这个link是后来写的文件解读:
http://blog.csdn.net/zjm750617105/article/details/52548798
4. kaldi/src/bin/copy-tree --binary=false tree - | head
tree文件也是和上面的mdl文件相关联的,可以看到phone pdf-id之间的关系,上面那个写完了再来补充
5.kaldi/src/bin/copy-int-vector "ark:gunzip -c ali.1.gz|" ark,t:- | head -n 2
这个是forced alignment 阶段的维特比对齐,这个算法也很重要。
6.kaldi/src/bin/show-transitions ../../data/lang_nosp/phones.txt 0.mdl | head -n 10
transtion-id 是PDF-id更细分的id, 这个跟前几步都有联系,0.mdl是初始状态,40.mdl是训练完的model
7. /home/zjm/kaldi/src/bin/show-transitions ../../data/lang_nosp/phones.txt 40.mdl 40.occs | head -n 10
.occs 文件是指 occupation counts
这里显示的概率都是训练之后的最后的转移概率
8.查看每次迭代的声学似然概率
在mono0a/log/ 目录下, grep Overall acc.{?.?,?.??,??.?,??.??}.log