kaldi训练thchs30做在线识别

机器环境:cpu+ubuntu16.04+24g内存,8g内存训练会出错,只能训练出单音节模型。

kaldi的编译源码直接在Github上clone下来<https://github.com/kaldi-asr/kaldi>。介绍下如下的几个目录:

  1. tools/: 主要存放了 Kaldi 依赖的包已经各种工具,如:OpenFST, ATLAS, IRSTLM, sph2pipe 等等。
  2. src/: Kaldi 的源代码;
  3. egs/: 为各种示例项目和代码;

安装:

  1. 详细的安装过程和指令可以参考 ./INSTALL, src/INSTALL, 以及 tools/INSTALL。编译 tools 和 src 之前,可以先执行 tools/extras/check_dependencies.sh 来查看需要安装哪些依赖。并且安装相关依赖包。<python指定2.7版本,参考https://www.cnblogs.com/Yanfang20180701/p/10588087.html>
  2. 在./tool目录下输入make,开始编译,输入make -j 4命令可以加快速度(多核并行处理)。 
  3. 之后切换到./src目录下,输入./configure进行配置,然后输入make all进行编译。当然这个过程也可以并行处理加速,输入make -j 4。经过漫长的编译过程以后,就安装完毕了。

thchs30数据

数据下载链接:https://www.openslr.org/18/,thchs30,是清华大学提供的30个小时的中文语料库,包含以下文件

  • data_thchs30.tgz, 6.4G, sppech data and transcripts
  • test_noise.tgz, 1.9G, standard 0db noisy test data
  • resource.tgz, 24M, supplementary resources, incl. lexicon for training data, noise samples

下载之后全部解压到/home/chen/work/voice/kaldi/egs/thchs30/s5/thchs30-openslr/下(thchs30-openslr自己建的文件夹)

drwxrwxr-x 6 chen chen 4096 12月 24 09:41 ./
drwxrwxr-x 9 chen chen 4096 12月 26 18:18 ../
drwxrwxr-x 8 chen chen 4096 12月 18 17:49 data_thchs30/
drwxr-xr-x 4 chen chen 4096 1月  25  2016 resource/
drwxr-xr-x 5 chen chen 4096 1月  25  2016 test-noise/

训练

打开s5下的cmd.sh脚本,注释掉queue.pl执行方式,修改如下:export train_cmd=run.pl
export decode_cmd="run.pl --mem 4G"
export mkgraph_cmd="run.pl --mem 8G"
export cuda_cmd="run.pl --gpu 1"
#export train_cmd=queue.pl
#export decode_cmd="queue.pl --mem 4G"
#export mkgraph_cmd="queue.pl --mem 8G"
#export cuda_cmd="queue.pl --gpu 1"

 

继续打开 run.sh,修改 thchs30 语料库的路径:

#corpus and trans directory
#thchs=/nfs/public/materials/data/thchs30-openslr
thchs=/home/chen/wxingqiuork/voice/kaldi/egs/thchs30/s5/thchs30-openslr

在run.sh注释掉用DNN训练模型,因为默认 DNN 是用 GPU 来跑的,然后执行thchs30/s5/run.sh 的脚本,该脚本包含了整个训练过程中需要执行的各种命令,执行时间大概十多个小时。

从日志的输出也可以看出整个训练过程大致包括数据准备、monophone 单因素训练(steps/train_mono.sh)、tri1 三因素训练(steps/train_deltas.sh)、tri2 进行 lda_mllt 特征变换(steps/train_lda_mllt.sh)、tri3b 进行 sat 自然语言适应(step/train_sat.sh)、tri4b 进行 quick 训练(step/train_quick.sh),之后就是 DNN 训练。

模型位子

下面看下 tri1,因为下面的示例会以 tri1 模型来识别。

chen@chen:tri1[master*]$ ls -l
总用量 66176
-rw-rw-r-- 1 chen chen  3435133 12月 26 11:59 35.mdl
-rw-rw-r-- 1 chen chen     8326 12月 26 11:59 35.occs
-rw-rw-r-- 1 chen chen  1524364 12月 26 11:59 ali.1.gz
-rw-rw-r-- 1 chen chen  1495302 12月 26 11:59 ali.2.gz
-rw-rw-r-- 1 chen chen  1655834 12月 26 11:59 ali.3.gz
-rw-rw-r-- 1 chen chen  1533052 12月 26 11:59 ali.4.gz
-rw-rw-r-- 1 chen chen        1 12月 26 11:56 cmvn_opts
drwxrwxr-x 4 chen chen     4096 12月 26 13:15 decode_test_phone
drwxrwxr-x 4 chen chen     4096 12月 26 12:42 decode_test_word
lrwxrwxrwx 1 chen chen        6 12月 26 11:59 final.mdl -> 35.mdl
lrwxrwxrwx 1 chen chen        7 12月 26 11:59 final.occs -> 35.occs
-rw-rw-r-- 1 chen chen 14109331 12月 26 11:56 fsts.1.gz
-rw-rw-r-- 1 chen chen 13876553 12月 26 11:56 fsts.2.gz
-rw-rw-r-- 1 chen chen 15234357 12月 26 11:56 fsts.3.gz
-rw-rw-r-- 1 chen chen 14475131 12月 26 11:56 fsts.4.gz
drwxrwxr-x 3 chen chen     4096 12月 26 12:43 graph_phone
drwxrwxr-x 3 chen chen     4096 12月 26 12:04 graph_word
drwxrwxr-x 2 chen chen    12288 12月 26 11:59 log
-rw-rw-r-- 1 chen chen        2 12月 26 11:56 num_jobs
-rw-rw-r-- 1 chen chen     2098 12月 26 11:56 phones.txt
-rw-rw-r-- 1 chen chen     8161 12月 26 11:56 questions.int
-rw-rw-r-- 1 chen chen    35098 12月 26 11:56 questions.qst
-rw-rw-r-- 1 chen chen   305009 12月 26 11:56 tree


chen@chen:tri1[master*]$ ls -l graph_word/
总用量 842184
-rw-rw-r-- 1 chen chen       290 12月 26 12:00 disambig_tid.int
-rw-rw-r-- 1 chen chen 861725005 12月 26 12:04 HCLG.fst
-rw-rw-r-- 1 chen chen         5 12月 26 12:04 num_pdfs
drwxrwxr-x 2 chen chen      4096 12月 26 12:04 phones
-rw-rw-r-- 1 chen chen      2098 12月 26 12:04 phones.txt
-rw-rw-r-- 1 chen chen    646753 12月 26 12:04 words.txt


其中, final.mdl 就是训练出来的可以使用的模型,另外,在 graph_word 下面的 words.txt 和 HCLG.fst 分别为字典以及有限状态机。单独介绍这三个文件,是因为我们下面的示例主要基于这三个文件来识别的。

离线识别示例:

下面我们用上面训练的 tri1 模型来识别一个给定的音频文件。我们这里使用 online-wav-gmm-decode-faster 工具来回放指定的 wav 文件并进行识别。

对于当前源码,在上面的编译安装过程中,默认情况下并不会生成 online-wav-gmm-decode-faster 程序(默认会生成的是 online2 相关程序),此时需要自己手动编译此工具,如下:

chen@chen:online[master*]$ pwd
/home/chen/work/voice/kaldi/src/online
chen@chen:online[master*]$ make
 

下面为示例的步骤:

1.将 kaldi/egs/voxforge/online_demo 拷贝到 kaldi/egs/thchs30/ 下;
2.在 kaldi/egs/thchs30/online_demo/ 下新建两个文件夹 online-data/ 和 work/,以及在 online-data 下新建两个文件夹 audio/ 和 models/,audio/ 下面可以存放需要回放和识别的语音文件,路径结构如下:

chen@chen:online_demo[master*]$ tree -L 4
.
├── online-data
│   ├── audio
│   │   ├── C21_517.wav      // 需要回放和识别的语音文件,可以放多个
│   │   └── trans.txt        // 为空即可
│   └── models
│       └── tri1
│           ├── 35.mdl       // 模型训练步骤生成的模型文件
│           ├── final.mdl    // 模型训练步骤生成的模型文件
│           ├── HCLG.fst     // 拷贝 thchs30/s5/exp/graph_word/HCLG.fst
│           └── words.txt    // 拷贝 thchs30/s5/exp/graph_word/words.txt
├── README.txt
├── run.sh
└── work

3.打开 kaldi/egs/thchs30/online_demo/run.sh,更改如下:

更新模型名
# Change this to "tri2a" if you like to test using a ML-trained model
#ac_model_type=tri2b_mmi
ac_model_type=tri1
- 注释掉如下这段从 voxforge 下载现网的测试预料和模型的代码
#if [ ! -s ${data_file}.tar.bz2 ]; then
#    echo "Downloading test models and data ..."
#    wget -T 10 -t 3 $data_url;
#
#    if [ ! -s ${data_file}.tar.bz2 ]; then
#        echo "Download of $data_file has failed!"
#        exit 1
#    fi
#fi
- 修改如下执行识别的命令(将模型的部分更改为 $ac_model/final.mdl)
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:$decode_dir/input.scp $ac_model/final.mdl $ac_model/HCLG.fst \
    $ac_model/words.txt '1:2:3:4:5' ark,t:$decode_dir/trans.txt \
    ark,t:$decode_dir/ali.txt $trans_matrix;;


4.执行 kaldi/egs/thchs30/online_demo/run.sh,如下输出:

chen@chen:online_demo[master*]$ ./run.sh 

  SIMULATED ONLINE DECODING - pre-recorded audio is used

  The (bigram) language model used to build the decoding graph was
  estimated on an audio book's text. The text in question is
  "King Solomon's Mines" (http://www.gutenberg.org/ebooks/2166).
  The audio chunks to be decoded were taken from the audio book read
  by John Nicholson(http://librivox.org/king-solomons-mines-by-haggard/)

  NOTE: Using utterances from the book, on which the LM was estimated
        is considered to be "cheating" and we are doing this only for
        the purposes of the demo.

  You can type "./run.sh --test-mode live" to try it using your
  own voice!

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/tri1/final.mdl 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 online-data/models/tri1/final.mat 
File: A2_0
律师 阳春 淹 井 大 快 文章 的 底色 四月 的 李 銮 更 顺利 地 先 和 秀媚 诗意 盎然 

File: A2_1
他 仅 凭 腰部 的 力量 在 甬道 上下 翻腾 永 冻 蛇行 状 如 海豚 一直 以 一头 的 优势 领先 

File: A2_2
企业 依靠 技术 花钱 曾 向 他 负责 全 肠 产品 质量 与 技术 培训 成 了 长 米 的 大 盲人 

File: D4_750
说 北京 的 一些 爱国 将士 马 占 山 梨 杜 唐 据 吴 素 饼 爱 邓 甜美 但 也 奋起 抗战 

File: test
去年 搜寻 中国 城区 所 从事 的 资格 整个 素质 

compute-wer --mode=present ark,t:./work/ref.txt ark,t:./work/hyp.txt 
%WER -nan [ 0 / 0, 0 ins, 0 del, 0 sub ]
%SER -nan [ 0 / 0 ]
Scored 0 sentences, 0 not present in hyp.

效果不好。


在线识别识别示例:

chen@chen:online_demo[master*]$ ./run_2.sh  --test-mode live

在线识别话筒可能遇到的问题:https://blog.csdn.net/YoungLittleT/article/details/80854894

离线录音命令:arecord  -d 5 -f dat -r 16000HZ -c 1 -t wav test.wav

arecord 制作16 bit 16000HZ语音

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

arecord -Dhw:0,1 -d 10 -f cd -r 44100 -c 2 -t wav test.wav
参数解析
-D 指定了录音设备,0,1 是card 0 device 1的意思,也就是TDM_Capture
-d 指定录音的时长,单位时秒
-f 指定录音格式,通过上面的信息知道只支持 cd cdr dat 
-r 指定了采样率,单位时Hz
-c 指定channel 个数
-t 指定生成的文件格式
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《

参考:https://blog.csdn.net/xiongtiancheng/article/details/80577478

效果同样糟糕

备注

测试完tri1的模型后,一定很想试试tri2或3.但当你操作时,会遇到如下的问题:

ERROR (online-wav-gmm-decode-faster:LogLikelihoods():diag-gmm.cc:533) DiagGmm::ComponentLogLikelihood, dimension mismatch 39vs. 40

怎么解决? 

答案:

1、于是修改run.sh成如下这个样子  :

ac_model_type=tri4b

------------------------------------中间有代码------------

trans_matrix="$ac_model/final.mat"

if [ -s $ac_model/matrix ]; then
    trans_matrix=$ac_model/12.mat
fi

2、 再次修改run.sh(添加2个参数--left-context=3 --right-context=3)

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:$decode_dir/input.scp $ac_model/final.mdl $ac_model/HCLG.fst \
            $ac_model/words.txt '1:2:3:4:5' ark,t:$decode_dir/trans.txt \
            ark,t:$decode_dir/ali.txt $trans_matrix;;

3、同时把把s5下的exp下的tri4b下的拷到models的tri4b下。

4、 运行./run.sh

相关链接:https://blog.csdn.net/allyli0022/article/details/78644690

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值