基于kaldi的在线中文识别初体验

  |   0 评论   |   33 浏览

背景

从零开始,把kaldi中文识别环境给搭建起来。这里用的是默认的DNN模型算法。

体验

准备环境

kaldi在linux下的初体验

准备数据

按参考一所示,自行下载 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

修改配置

  1. 进入目录 /home/abeffect/kaldi/kaldi/egs/thchs30/s5中,修改 run.sh 中第11行中的thchs的值。

  2. 修改 cmd.sh中的 queue.plrun.pl

这样就不会尝试使用qsub提交任务到集群中。

执行训练

紧接着上一步,开始执行训练。

  1. 然后执行 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.txtHCLG.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
时分

参考