机器环境:cpu+ubuntu16.04+24g内存,8g内存训练会出错,只能训练出单音节模型。
kaldi的编译源码直接在Github上clone下来<
https://github.com/kaldi-asr/kaldi
>。介绍下如下的几个目录:
- tools/: 主要存放了 Kaldi 依赖的包已经各种工具,如:OpenFST, ATLAS, IRSTLM, sph2pipe 等等。
- src/: Kaldi 的源代码;
- egs/: 为各种示例项目和代码;
安装:
-
详细的安装过程和指令可以参考 ./INSTALL, src/INSTALL, 以及 tools/INSTALL。编译 tools 和 src 之前,可以先执行 tools/extras/check_dependencies.sh 来查看需要安装哪些依赖。并且安装相关依赖包。<python指定2.7版本,参考
https://www.cnblogs.com/Yanfang20180701/p/10588087.html
> - 在./tool目录下输入make,开始编译,输入make -j 4命令可以加快速度(多核并行处理)。
- 之后切换到./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