语音识别(speech recognition)技术,也被称为自动语音识别(英语:Automatic Speech Recognition, ASR)、计算机语音识别(英语:Computer Speech Recognition)或是语音转文本识别(英语:Speech To Text, STT),其目标是以计算机自动将人类的语音内容转换为相应的文字。html
按照不一样纬度以下分类:python
The CMU Pronouncing Dictionary.linux
一个语音识别系统主要包括信号处理和特征提取、声学模型训练、语言模型训练以及识别引擎等几个核心部分,下图为语音识别的原理框图:c++
但随着神经网络技术的发展,后面又出现了基于DNN-HMMs的语音识别模型,一句话归纳就是用DNN代替以前的GMMs,有更好的建模能力。算法
主流的DNN模型,包括FFDNN、CDDNN、TDNN、RNN等,以及一些训练中可使用的trick等。sql
http://www.javashuo.com/article/p-ufywjzhd-nd.htmlshell
本文档模型训练方式采用的是GNN-HMMvim
为何调研kaldi工具网络
Kaldi 的架构以下图:架构
Gcc 4.8及以上
Patch
Make .
automake
Autoconf
zlib zlib-devel
gdbm
bzip2
sqlite
openssl-devel
Readline
python3
这里我是编译安装,没有替换以前的2.7; /usr/bin下直接创建的python3的软连
解压 kaldi-master.zip
[root@localhost mnt]# cd kaldi-master/tools/
查看环境要求
[root@localhost tools]# cat INSTALL
依赖环境知足的状况下 运行检查脚本 会 回执 OK 以下图
查看 cup 内核数
确认内核数 开始编译
[root@localhost tools]# make -j 8
[root@localhost tools]# ./extras/install_irstlm.sh
安装语言模型
安装编译安装,时间会有些长, 可能会出现一些编译失败的错误信息,能够根据实际报错内容进行逐个排查,
[root@localhost tools]# cd ../src/
[root@localhost src]# ./configure
[root@localhost src]# make depend
[root@localhost src]# make
检查编译成功后的执行文件
[root@localhost kaldi-master]# cd src/bin
[root@localhost bin]# ls
在kaldi中,目前针对深度神经网络提供三种代码库。第一个是"nnet1"(位于nnet/和nnetbin/下),最初由Karel Vesely维护;第二个"nnet2"(位于nnet2/和nnet2bin/下)最初由Daniel Povey维护;第三个"nnet3"(位于nnet3/和nnet3bin/下)由Daniel的nnet2转化而来
[root@localhost kaldi-master]# cd egs/yesno/s5/
[root@localhost s5]# ./run.sh
开始下载学习集并开始制做
输出后的结果,运行到这里,说明kaldi 已经正确安装好。
WER(WordError Rate)是字错误率,是一个衡量语音识别系统的准确程度的度量。其计算公式是WER=(I+D+S)/N,其中I表明被插入的单词个数,D表明被删除的单词个数,S表明被替换的单词个数。也就是说把识别出来的结果中,多认的,少认的,认错的全都加起来,除以总单词数。这个数字固然是越低越好。
[root@localhost s5]# cd waves_yesno/
[root@localhost waves_yesno]# ll
生成的音频
Kaldi中文语音识别公共数据集一共有4个(据我所知),分别是:
1.aishell: AI SHELL公司开源178小时中文语音语料及基本训练脚本,见kaldi-master/egs/aishell
2.gale_mandarin: 中文新闻广播数据集(LDC2013S08, LDC2013S08)
3.hkust: 中文电话数据集(LDC2005S15, LDC2005T32)
4.thchs30: 清华大学30小时的数据集,能够在http://www.openslr.org/18/下载
这里使用thchs30数据集进行训练
已下载的数据包
数据集 |
音频时长(h) |
句子数 |
词数 |
train(训练) |
25 |
10000 |
198252 |
dev(开发) |
2:14 |
893 |
17743 |
test(测试) |
6:15 |
2495 |
49085 |
还有训练好的语言模型word.3gram.lm和phone.3gram.lm以及相应的词典lexicon.txt。
其中dev的做用是在某些步骤与train进行交叉验证的,如local/nnet/run_dnn.sh同时用到exp/tri4b_ali和exp/tri4b_ali_cv。训练和测试的目标数据也分为两类:word(词)和phone(音素)
1.local/thchs-30_data_prep.sh主要工做是从$thchs/data_thchs30(下载的数据)三部分分别生成word.txt(词序列),phone.txt(音素序列),text(与word.txt相同),wav.scp(语音),utt2pk(句子与说话人的映射),spk2utt(说话人与句子的映射)
2.#produce MFCC features是提取MFCC特征,分为两步,先经过steps/make_mfcc.sh提取MFCC特征,再经过steps/compute_cmvn_stats.sh计算倒谱均值和方差归一化。
3.#prepare language stuff是构建一个包含训练和解码用到的词的词典。而语言模型已经由王东老师处理好了,若是不打算改语言模型,这段代码也不须要修改。
a)基于词的语言模型包含48k基于三元词的词,从gigaword语料库中随机选择文本信息进行训练获得,训练文本包含772000个句子,总计1800万词,1.15亿汉字
b)基于音素的语言模型包含218个基于三元音的中文声调,从只有200万字的样本训练获得,之因此选择这么小的样本是由于在模型中尽量少地保留语言信息,可使获得的性能更直接地反映声学模型的质量。
c)这两个语言模型都是由SRILM工具训练获得。
[root@localhost ~]# mkdir -p /DATA/works/
上传学习包并解压
[root@localhost ~]# cd /mnt/kaldi-master/egs/thchs30/s5/
修改内容以下:
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"
[root@localhost s5]# vim cmd.sh
[root@localhost s5]# vim run.sh
开始制做模型
[root@localhost s5]# ./run.sh
咱们没有DNN(无GPU)来跑,因此运行起来会比较慢。//后续有资源的状况尝试大数据
模型生成后存放的路径thchs30/s5/exp/tri1
final.mdl 就是训练出来的可使用的模型,另外,在 graph_word 下面的 words.txt 和 HCLG.fst 分别为字典以及有限状态机。单独介绍这三个文件,是由于咱们下面的示例主要基于这三个文件来识别的。
将制做好的模型 复制到如下路径
/mnt/kaldi-master/egs/thchs30/online_demo/online-data/models/tri1
/mnt/kaldi-master/egs/thchs30/online_demo
[root@localhost online_demo]# vim run.sh
[root@localhost online_demo]# ./run.sh 模型识别的是
/mnt/kaldi-master/egs/thchs30/online_demo/online-data/audio路径下全部的单音频文件
识别的结果内容
大概有几个过程:数据准备,monophone单音素训练, tri1三因素训练, trib2进行lda_mllt特征变换,trib3进行sat天然语言适应,trib4作quick(这个我也不懂),后面就是dnn了
这个脚本的输入参数有三个:1.data/mfcc/train 2.exp/make_mfcc/train 3.mfcc/train
1.data/mfcc/train中有数据预处理后的一些文件:phone.txt spk2utt text utt2spk wav.scp word.txt
2.exp/make_mfcc/train中应该是要保存程序运行的日志文件的
3.mfcc/train中是提取出的特征文件
用的虚拟机,没有音频入口
后续补充
后续补充
基于Kaldi+GStreamer搭建线上的实时语音识别器
https://www.jianshu.com/p/ef7326b27786
后续补充
https://blog.csdn.net/DuishengChen/article/details/50085707?locationNum=11&fps=1
后续补充
后续补充
https://blog.csdn.net/u011930705/article/details/85340905
https://blog.csdn.net/monsieurliaxiamen/article/details/79638227
后续补充
https://www.jianshu.com/p/d64e70faaf1d
https://blog.csdn.net/snowdroptulip/article/details/78952428
后续补充
https://blog.csdn.net/cj1989111/article/details/88017908
[root@localhost ~]# find / -name libstdc++.so.6 本地看看是否有此库
这里能够看到,我本地是存在的,应该是调不到的缘由
[root@localhost ~]# vim /etc/ld.so.conf
/usr/lib64/
/usr/local/lib
/usr/local/lib64
/usr/lib
加入依赖库路径
从新加载
[root@localhost ~]# ldconfig
若是不行,就用编译的gcc里的库作个软链接
[root@localhost online_demo]# ln -s /mnt/gcc/gcc-5.4.0/gcc-build/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6 /usr/lib64/libstdc++.so.6
[root@localhost online_demo]# ll /usr/lib64/libstdc++.so.6
原文出处:https://www.cnblogs.com/relax-zw/p/11972617.html