音频工具kaldi部署及模型制作调研学习
语音识别简介
语音识别(speech recognition)技术,也被称为自动语音识别(英语:Automatic Speech Recognition, ASR)、计算机语音识别(英语:Computer Speech Recognition)或是语音转文本识别(英语:Speech To Text, STT),其目标是以计算机自动将人类的语音内容转换为相应的文字。
按照不同纬度如下分类:
- 按词汇量(vocabulary)大小分类:
- 小词汇量:几十个词;
- 中等词汇量:几百个到上千个词
- 大词汇量:几千到几万个
- 按说话的方式(style)分类:
- 孤立词(isolated words)
- 连续(continously)
- 按声学(Acoustic)环境分类:
- 录音室
- 不同程度的噪音环境
- 按说话人(Speaker)分类:
- 说话人相关(Speaker depender)
- 说话音素(Phoneme):单词的发音都是由音素构成,对于英语,常用的音素集是 CMU 的 39 个音素构成的音素集。而对于汉语,一般直接用全部声母和韵母作为音素集,另外汉语识别还要考虑音调。
The CMU Pronouncing Dictionary.
- 声学模型 :是将声学和发音学(phonetics)的知识进行整合,以特征提取部分生成的特征作为输入,并为可变长特征序列生成声学模型分数。
- 语言模型 :通过从训练语料(通常是文本形式)学习词之间的相互关系,来估计假设词序列的可能性,又叫语言模型分数。
- GMM :Gaussian Mixture Model, 高斯混合模型,描述基于傅里叶频谱语音特征的统计模型,用于传统声学模型的建模中。
- HMM :Hidden Markov Model, 隐马尔科夫模型,是一种用来描述含有隐含未知参数的马尔科夫过程,其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。
- MFCC :Mel-Frequency Cepstral Coefficients, 梅尔频率倒谱系数,是组成梅尔频率倒谱的系数。衍生自音讯片段的倒频谱(cepstrum)。倒谱与梅尔频率倒谱的区别在于,梅尔频率倒谱的频带划分是在梅尔刻度上等距划分的,它比用于正常的对数倒频谱中的线性间隔的频带更接近人类的听觉系统。广泛应用于语音识别中。
- Fbank :Mel Frequency Filter Bank, 梅尔频率滤波器组。
- WER :Word Error Rate, 词错误率,是最常见的衡量语音识别系统性能的指标。
GNN-HMM基本原理
一个语音识别系统主要包括信号处理和特征提取、声学模型训练、语言模型训练以及识别引擎等几个核心部分,下图为语音识别的原理框图:
- 特征提取 :语音识别第一步就是特征提取,去除掉语音信号中对于语音识别无用的冗余信息(如背景噪音),保留能够反映语音本质特征的信息(为后面的声学模型提取合适的特征向量),并用一定的形式表示出来;较常用的特征提取算法有 MFCC。
- 声学模型训练 :根据语音库的特征参数训练出声学模型参数,在识别的时候可以将待识别的语音的特征参数同声学模型进行匹配,从而得到识别结果。目前主流的语音识别系统多采用 HMM 进行声学模型建模。
- 语言模型训练 :就是用来计算一个句子出现的概率模型,主要用于决定哪个词序列的可能性更大。语言模型分为三个层次:字典知识、语法知识、句法知识。对训练文本库进行语法、语义分析,经过基于统计模型训练得到语言模型。
- 语音解码与搜索算法 :其中解码器就是针对输入的语音信号,根据已经训练好的声学模型、语言模型以及字典建立一个识别网络,再根据搜索算法在该网络中寻找一条最佳路径,使得能够以最大概率输出该语音信号的词串,这样就确定这个语音样本的文字。
DNN-HMM(基于神经网络)
但随着神经网络技术的发展,后面又出现了基于DNN-HMMs的语音识别模型,一句话概括就是用DNN代替之前的GMMs,有更好的建模能力。
主流的DNN模型,包括FFDNN、CDDNN、TDNN、RNN等,以及一些训练中可以使用的trick等。
https://blog.csdn.net/Magical_Bubble/article/details/90674521
本文档模型训练方式采用的是GNN-HMM
为什么调研kaldi工具
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安装
解压 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目录说明
- ./tools目录下是kaldi依赖的包
- ./src目录存放kaldi的源代码
- ./egs目录保存着一些kaldi在公共语音数据集上的训练步骤(shell脚本)以及测试的结果
- s5/run.sh包含了在这个数据集上所有的训练步骤,包括数据预处理、训练以及测试gmm/dnn/lstm/tdnn等模型、实验结果统计在内的各种脚本。理论上来说只要相关环境配置正确,运行run.sh就能完成整个训练步骤。
- s5/RESULTS里面保存着最近的实验结果
- s5/conf就是一些训练所要用到的配置文件
- s5/{local, steps, utils}里面则是run.sh所要用到的一些脚本文件
在kaldi中,目前针对深度神经网络提供三种代码库。第一个是"nnet1"(位于nnet/和nnetbin/下),最初由Karel Vesely维护;第二个"nnet2"(位于nnet2/和nnet2bin/下)最初由Daniel Povey维护;第三个"nnet3"(位于nnet3/和nnet3bin/下)由Daniel的nnet2转化而来
验证基础demo
[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
生成的音频
制作第一个训练模型thchs30
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了
Run 脚本说明
这个脚本的输入参数有三个: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在线识别方法
用的虚拟机,没有音频入口
后续补充
Kaldi封装实时语音翻译
后续补充
基于Kaldi+GStreamer搭建线上的实时语音识别器
https://www.jianshu.com/p/ef7326b27786
Kaldi结合GPU的模型训练
后续补充
Kaldi结合CNN的模型训练
https://blog.csdn.net/DuishengChen/article/details/50085707?locationNum=11&fps=1
后续补充
Kaldi 声纹识别ivector模型
后续补充
https://blog.csdn.net/u011930705/article/details/85340905
https://blog.csdn.net/monsieurliaxiamen/article/details/79638227
Kaldi中文识别开源模型CVTE
后续补充
https://www.jianshu.com/p/d64e70faaf1d
https://blog.csdn.net/snowdroptulip/article/details/78952428
Kaldi 训练唤醒词模型
后续补充
https://blog.csdn.net/cj1989111/article/details/88017908
FAQ
模型制作报错:/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
[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
音频工具kaldi部署及模型制作调研学习的更多相关文章
- NLP(十七)利用tensorflow-serving部署kashgari模型
在文章NLP(十五)让模型来告诉你文本中的时间中,我们已经学会了如何利用kashgari模块来完成序列标注模型的训练与预测,在本文中,我们将会了解如何tensorflow-serving来部署模型 ...
- 使用C++调用并部署pytorch模型
1.背景(Background) 上图显示了目前深度学习模型在生产环境中的方法,本文仅探讨如何部署pytorch模型! 至于为什么要用C++调用pytorch模型,其目的在于:使用C++及多线程可以加 ...
- 使用pmml跨平台部署机器学习模型Demo——房价预测
基于房价数据,在python中训练得到一个线性回归的模型,在JavaWeb中加载模型完成房价预测的功能. 一. 训练.保存模型 工具:PyCharm-2017.Python-39.sklearn2 ...
- CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码
CSS Animatie是一款在线制作CSS3动画的工具,可以在线直接制作CSS3动画效果,生成代码 CSS Animatie 彩蛋爆料直击现场 CSS Animatie是一款在线制作CSS3动画的工 ...
- ALSA音频工具amixer,aplay,arecord
ALSA音频工具编译安装 ========================================================================1.官网http://www. ...
- Docker 管理工具 Portainer部署
Docker 管理工具 Portainer部署 一.官网 官网:http://www.portainer.io 演示地址:http://demo.portainer.io 用户名:admin 密码:t ...
- 数字模型制作规范(转自Unity3D群)
本文提到的所有数字模型制作,全部是用3D MAX建立模型,即使是不同的驱动引擎,对模型的要求基本是相同的.当一个VR模型制作完成时,它所包含的基本内容包括场景尺寸.单位,模型归类塌陷.命名.节点编辑, ...
- Unity3D模型制作规范[转]
本文提到的所有数字模型制作,全部是用3D MAX建立的模型,即使是不同的驱动引擎,对模型的要求基本是相同的.当一个VR模型制作完成时,它所包含的基本内容包括:场景尺寸.单位,模型归类塌陷.命名.节点编 ...
- 使用Ubuntu系统管理包工具(apt)部署Zabbix企业级监控系统
使用Ubuntu系统管理包工具(apt)部署Zabbix企业级监控系统 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Ubuntu系统部署笔记:https://www.cnblo ...
随机推荐
- Java设计模式_七大原则
简介 单一职责原则.对类来说,即一个类应该只负责一项职责. 开闭原则.对扩展开放,对修改关闭.在程序需要进行扩展的时候,不能去修改原有代码,使用接口和抽象类实现一个热插拔的效果. 里氏替换原则.任何基 ...
- 一个漂亮的js表单验证页面+验证码
一个漂亮的js表单验证页面 见图知其意, 主要特性 带密码安全系数的判断 其他的就没有啥啦 嘿嘿嘿 当然,其代码也在Github上 我也准备了一套可以直接Ctrl + v; Ctrl + c 运行的代 ...
- 机器学习回顾篇(9):K-means聚类算法. slides
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 神舟+win10+ubuntu16.04+256GSSD+1THHD双系统安装加openssl踩坑之旅
上海最近搞活动调休,要搞深度学习,win上还是不方便,准备弄个ubuntu.于是有以下回忆文字. 在机器上装了个双系统.花了两天.再也不想玩了. 准备用ubuntu来做深度学习的. 本文写于2019年 ...
- iOS11 SDK 新特性 CoreML 及swift 小demo
github代码 如果本博客对您有帮助,希望可以得到您的赞赏! swift 机器学习Core ML的简单调用小demo.完整代码附上: https://github.com/Liuyubao/LYBC ...
- 零基础攻略!如何使用kubectl和HPA扩展Kubernetes应用程序
现如今,Kubernetes已经完全改变了软件开发方式.Kubernetes作为一个管理容器化工作负载及服务的开源平台,其拥有可移植.可扩展的特性,并促进了声明式配置和自动化,同时它还证明了自己是管理 ...
- Java创建线程的四种方式
Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...
- Vue学习笔记(五)——配置开发环境及初建项目
前言 在上一篇中,我们通过初步的认识,简单了解 Vue 生命周期的八个阶段,以及可以应用在之后的开发中,针对不同的阶段的钩子采取不同的操作,更好的实现我们的业务代码,处理更加复杂的业务逻辑. 而在这一 ...
- CSPS模拟 62
婚礼现场系列 T1 $gragh$ 为了方便把边的贡献下放到点,跑一个生成树作为划分依据. T2 $permutation$ 由于在本题中,构造的变换方法保证只能邻项交换 所以如果位置串字典序变小,权 ...
- 模块参数,系统调用,字符设备编程重要数据结构,设备号的申请与注册,关于cdev的API
1.模块参数 应用编程: int main(int argc, char *argv[]) { } ./a.out xxx yyy zzz ...