基于kaldi的在线中文识别初体验
背景
从零开始,把kaldi中文识别环境给搭建起来。这里用的是默认的DNN模型算法。
体验
准备环境
准备数据
按参考一所示,自行下载 thchs30
数据,如下所示放置数据。
$ tree -L 2 /home/abeffect/kaldi/data/thchs30-openslr/
/home/abeffect/kaldi/data/thchs30-openslr/
├── data_thchs30
│ ├── data
│ ├── dev
│ ├── lm_phone
│ ├── lm_word
│ ├── README.TXT
│ ├── test
│ └── train
├── data_thchs30.tgz
├── resource
│ ├── dict
│ ├── noise
│ └── README
├── resource.tgz
├── test-noise
│ ├── 0db
│ ├── noise
│ ├── noise.scp
│ ├── README
│ ├── test.scp
│ └── utils
└── test-noise.tgz
修改配置
-
进入目录
/home/abeffect/kaldi/kaldi/egs/thchs30/s5
中,修改run.sh
中第11行中的thchs
的值。 -
修改
cmd.sh
中的queue.pl
为run.pl
这样就不会尝试使用qsub
提交任务到集群中。
执行训练
紧接着上一步,开始执行训练。
- 然后执行
run.sh
s5]$ sh run.sh
creating data/{train,dev,test}
cleaning data/train
preparing scps and text in data/train
run.sh
的执行中,经历了一系列的过程,如下:
[s5]$ ls -htr exp | cat
make_mfcc
mfcc_cmvn
mono_ali
tri1_ali
tri2b_ali
tri3b_ali
tri4b_ali
tri4b_ali_cv
make_fbank
fbank_cmvn
tri4b_dnn
tri2b
tri1
tri3b
tri4b
mono
每一个过程都输出在对应的目录下,如:
错误率 36.14 -> 28.03
[note@abeffect exp]$ cat tri1/decode_test_word/scoring_kaldi/best_wer
%WER 36.14 [ 29320 / 81139, 507 ins, 1064 del, 27749 sub ] exp/tri1/decode_test_word/wer_10_0.0
[note@abeffect exp]$ cat tri4b/decode_test_word/scoring_kaldi/best_wer
%WER 28.03 [ 22743 / 81139, 399 ins, 794 del, 21550 sub ] exp/tri4b/decode_test_word/wer_12_0.0
另外每个过程中有三个非常重要的文件:模型,字典和有限状态机,分别为final.mdl
, words.txt
和HCLG.fst
,如下:
[note@abeffect exp]$ ls -lh tri1/final.mdl
lrwxrwxrwx 1 note note 6 Feb 11 21:19 tri1/final.mdl -> 35.mdl
[note@abeffect exp]$ ls -lh tri1/graph_word/words.txt
-rw-rw-r-- 1 note note 632K Feb 11 21:29 tri1/graph_word/words.txt
[note@abeffect exp]$ ls -lh tri1/graph_word/HCLG.fst
-rw-rw-r-- 1 note note 818M Feb 11 21:29 tri1/graph_word/HCLG.fst
有这3个文件,就可以进行识别了。
用tri1模型来识别音频文件
准备工具
确认下面的文件存在:
./src/onlinebin/online-wav-gmm-decode-faster
: 识别wav文件./src/onlinebin/online-gmm-decode-faster
: 识别麦克风输入声音
如果没有的话,需要在src
目录下执行make ext
来编译扩展程序。
准备数据
最终目录结构如下:
online-data/
├── audio
│ └── nls-sample-16k.wav
└── models
└── tri1
├── HCLG.fst
├── model // 重要文件 final.mdl
└── words.txt
其中audio目录下为示例的音频,我这里使用的音频为https://aliyun-nls.oss-cn-hangzhou.aliyuncs.com/asr/fileASR/examples/nls-sample-16k.wav
models/tri1
目录下是上一节提到的三个重要文件。
使用 voxforge/online_demo中的脚本来跑音频,
[note@abeffect thchs30]$ cp -R ../voxforge/online_demo .
[note@abeffect thchs30]$ ls
online_demo README.txt s5
编辑run.sh,如下修改。第16-17行修改模型目录为tri1,注释掉34和38行。
15 # Change this to "tri2a" if you like to test using a ML-trained model
16 # ac_model_type=tri2b_mmi
17 ac_model_type=tri1
18
19 # Alignments and decoding results are saved in this directory(simulated decoding only)
20 decode_dir="./work"
21
22 # Change this to "live" either here or using command line switch like:
23 # --test-mode live
24 test_mode="simulated"
25
26 . parse_options.sh
27
28 ac_model=${data_file}/models/$ac_model_type
29 trans_matrix=""
30 audio=${data_file}/audio
31
32 if [ ! -s ${data_file}.tar.bz2 ]; then
33 echo "Downloading test models and data ..."
34 # wget -T 10 -t 3 $data_url;
35
36 if [ ! -s ${data_file}.tar.bz2 ]; then
37 echo "Download of $data_file has failed!"
38 # exit 1
39 fi
运行测试
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:./work/input.scp online-data/models/tri1/model online-data/models/tri1/HCLG.fst online-data/models/tri1/words.txt 1:2:3:4:5 ark,t:./work/trans.txt ark,t:./work/ali.txt
File: nls-sample-16k
朋友
我
可以我们成功的解析出了文字!!!虽然正确率不高。
用tri2模型来识别音频文件
准备数据
同上,最后结果如下:
online-data/
├── audio
│ └── nls-sample-16k.wav
└── models
├── tri1
│ ├── HCLG.fst
│ ├── model
│ └── words.txt
└── tri2b
├── HCLG.fst
├── model
└── words.txt
修改run.sh
中的模型为tri2b
,然后执行:
报错了!
ERROR (online-wav-gmm-decode-faster[5.5.634~1-7a50]:LogLikelihoods():diag-gmm.cc:533) DiagGmm::LogLikelihoods, dimension mismatch 39 vs. 40
解决方法:
online-data/
├── audio
│ ├── nls-sample-16k.wav
│ └── vad_test.wav
└── models
├── tri1
│ ├── HCLG.fst
│ ├── model
│ └── words.txt
└── tri2b
├── HCLG.fst
├── matrix // 重要文件 final.mat
├── model // 重要文件 final.mdl
└── words.txt
同时修改 run.sh,加入 91 行。
88 done
89 online-wav-gmm-decode-faster --verbose=1 --rt-min=0.8 --rt-max=0.85\
90 --max-active=4000 --beam=12.0 --acoustic-scale=0.0769 \
91 --left-context=3 --right-context=3 \
92 scp:$decode_dir/input.scp $ac_model/model $ac_model/HCLG.fst \
93 $ac_model/words.txt '1:2:3:4:5' ark,t:$decode_dir/trans.txt \
94 ark,t:$decode_dir/ali.txt $trans_matrix;;
运行测试
此时再运行,即可
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:./work/input.scp online-data/models/tri2b/model online-data/models/tri2b/HCLG.fst online-data/models/tri2b/words.txt 1:2:3:4:5 ark,t:./work/trans.txt ark,t:./work/ali.txt online-data/models/tri2b/matrix
File: nls-sample-16k
File: vad_test
时分