Kaldi是目前语音识别领域,广受欢迎并流行的开源工具包。Kaldi设计之初对通用性,可拓展性等一系列源代码层次的考量,大大降低了Kaldi作为语音识别工具包的门槛, 同时拥有非常完整的语音识别系统训练脚本。本书通过对Kaldi已有训练脚本的梳理和引导,帮助读者快速搭建可用的语音识别系统。
陈果果清华大学本科学位,约翰霍普金斯大学博士学位,主要研究方向是语音识别及关键词检索,师从语音识别开源工具Kaldi主要开发者Daniel Povey,以及约翰霍普金斯大学语言语音处理中心教授Sanjeev Khudanpur。博士期间为Google开发了Google的唤醒词Okay Google的原型,现在已经用到数以亿计的安卓设备及Google智能语音交互设备上。博士期间同时参与开发语音识别开源工具Kaldi,以及神经网络开源工具CNTK。博士毕业以后联合创办KITT.AI,专注于语音识别及自然语言处理,公司于2017年被百度收购,目前担任百度智能生活事业群组(SLG)主任架构师。都家宇本科毕业于大连理工大学,后于澳大利亚新南威尔士大学电子信息工程学院学习,取得信号处理专业硕士学位。研究生期间在导师 Julien Epps 指导下开始进行语音处理、情绪识别方向的研究。毕业后先后任职于清华大学语音技术实验室、百度语音技术部,以及阿里巴巴iDST、达摩院语音组,从事声学模型、解码器、语音唤醒等方面的研发工作。参与过与 Kaldi 相关的工作有:Kaldi nnet1神经网络框架中 lstm 作者;发起并推动全球最大规模的中文开源数据集语音项目AISHELL-1、AISHELL-2,已服务于清华大学、北京大学、南洋理工大学、哥伦比亚大学等近200所国内外高校的科研项目。那兴宇本科和博士均毕业于北京理工大学,主要研究方向是语音识别和语音合成。先后任职于中国科学院声学研究所和阿里巴巴机器人,从事语音识别模型训练系统和语音交互系统的开发。目前就职于微软,担任资深应用科学家,从事语音识别算法和技术架构的开发及业务支持工作。2015年开始在Kaldi开源项目中贡献代码,参与了nnet3和chain模型的开发工作,并维护其中若干示例及OpenSLR的中文语音识别模型。张俊博博士毕业于中国科学院声学研究所,师从颜永红研究员。在小米公司从零起主导构建了整套语音算法研究框架,包括语音识别、智能设备语音唤醒、声纹识别、语音增强、用于语音应用的神经网络部署,均达到了当时的先进水平,并发表顶会论文若干篇,为后续的语音研发工作建立了基础。近期上线了用于外语学习的发音质量评测引擎,并给Kaldi贡献了发音良好度评分的代码。
1 语音识别技术基础1
1.1 语音识别极简史1
1.1.1 语音识别早期探索2
1.1.2 概率模型一统江湖2
1.1.3 神经网络异军突起3
1.1.4 商业应用推波助澜4
1.2 语音识别系统架构6
1.2.1 经典方法的直观理解6
1.2.2 概率模型7
1.2.3 端到端语音识别10
1.3 一些其他细节11
1.3.1 语音信号处理11
1.3.2 发音和语言学12
1.3.3 语音识别系统的评价13
2 Kaldi概要介绍15
2.1 发展历史15
2.1.1 名字的由来15
2.1.2 约翰霍普金斯大学夏季研讨会16
2.1.3 Kaldi发展简史17
2.2 设计思想18
2.2.1 初衷18
2.2.2 开源19
2.2.3 训练脚本19
2.3 安装20
2.3.1 下载Kaldi代码20
2.3.2 安装CUDA20
2.3.3 安装编译依赖库21
2.3.4 安装第三方工具21
2.3.5 选择其他的矩阵库23
2.3.6 编译Kaldi代码23
2.3.7 配置并行环境25
2.4 一个简单的示例26
2.4.1 运行run.sh26
2.4.2 脚本解析28
2.5 示例介绍34
2.5.1 数据示例34
2.5.2 竞赛示例38
2.5.3 其他示例40
2.5.4 示例结构41
3 数据整理44
3.1 数据分集44
3.1.1 Librispeech示例的数据处理过程45
3.1.2 数据下载和解压46
3.2 数据预处理49
3.2.1 环境检查51
3.2.2 生成表单文件52
3.2.3 数据检查55
3.3 输入和输出机制56
3.3.1 列表表单57
3.3.2 存档表单60
3.3.3 读写声明符60
3.3.4 表单属性64
3.4 常用数据表单与处理脚本69
3.4.1 列表类数据表单70
3.4.2 存档类数据表单72
3.4.3 数据文件夹处理脚本77
3.4.4 表单索引的一致性78
3.5 语言模型相关文件79
3.5.1 发音词典与音素集80
3.5.2 语言文件夹85
3.5.3 生成与使用语言文件夹92
4 经典声学建模技术94
4.1 特征提取95
4.1.1 用 Kaldi 提取声学特征95
4.1.2 特征在 Kaldi 中的存储99
4.1.3 特征的使用104
4.1.4 常用特征类型106
4.2 单音子模型的训练107
4.2.1 声学模型的基本概念108
4.2.2 将声学模型用于语音识别112
4.2.3 模型初始化113
4.2.4 对齐115
4.2.5 Transition 模型118
4.2.6 GMM 模型的迭代124
4.3 三音子模型训练128
4.3.1 单音子模型假设的问题128
4.3.2 上下文相关的声学模型129
4.3.3 三音子的聚类裁剪130
4.3.4 Kaldi中的三音子模型训练流程130
4.4 特征变换技术139
4.4.1 无监督特征变换139
4.4.2 有监督特征变换141
4.5 区分性训练143
4.5.1 声学模型训练流程的变迁143
4.5.2 区分性目标函数144
4.5.3 分子、分母145
4.5.4 区分性训练在实践中的应用146
5 构图和解码147
5.1 N元文法语言模型148
5.2 加权有限状态转录机151
5.2.1 概述151
5.2.2 OpenFst153
5.3 用WFST表示语言模型156
5.4 状态图的构建158
5.4.1 用 WFST 表示发音词典158
5.4.2 WFST 的复合运算163
5.4.3 词图的按发音展开165
5.4.4 LG 图对上下文展开166
5.4.5 用 WFST 表示 HMM 拓扑结构169
5.5 图的结构优化170
5.5.1 确定化170
5.5.2 最小化173
5.5.3 图的stochastic性质174
5.6 最终状态图的生成174
5.7 基于令牌传递的维特比搜索176
5.8 SimpleDecoder源码分析178
5.9 Kaldi 解码器家族187
5.10 带词网格生成的解码189
5.11 用语言模型重打分提升识别率192
6 深度学习声学建模技术195
6.1 基于神经网络的声学模型195
6.1.1 神经网络基础196
6.1.2 激活函数198
6.1.3 参数更新199
6.2 神经网络在Kaldi中的实现200
6.2.1 nnet1(nnet)200
6.2.2 nnet2203
6.2.3 nnet3208
6.3 神经网络模型训练214
6.3.1 输入特征的处理214
6.3.2 神经网络的初始化215
6.3.3 训练样本的分批与随机化217
6.3.4 学习率的调整222
6.3.5 并行训练224
6.3.6 数据扩充227
6.4 神经网络的区分性训练228
6.4.1 区分性训练的基本思想228
6.4.2 区分性训练的目标函数229
6.4.3 区分性训练的实用技巧231
6.4.4 Kaldi神经网络区分性训练示例232
6.4.5 chain模型234
6.5 与其他深度学习框架的结合242
6.5.1 声学模型242
6.5.2 语言模型243
6.5.3 端到端语音识别243
7 关键词搜索与语音唤醒245
7.1 关键词搜索技术介绍245
7.1.1 关键词搜索技术的主流方法245
7.1.2 关键词搜索技术的主流应用247
7.2 语音检索247
7.2.1 方法描述248
7.2.2 一个简单的语音检索系统248
7.2.3 集外词处理之词表扩展254
7.2.4 集外词处理之关键词扩展255
7.2.5 集外词处理之音素/音节系统256
7.2.6 一个实用的语音检索系统258
7.3 语音唤醒263
7.3.1 语音唤醒经典框架264
7.3.2 语音唤醒进阶优化266
7.3.3 语音唤醒的Kaldi实现思路267
8 说话人识别269
8.1 概述269
8.2 基于i-vector和PLDA的说话人识别技术271
8.2.1 整体流程271
8.2.2 i-vector 的提取272
8.2.3 基于余弦距离对 i-vector 分类274
8.2.4 基于 PLDA 对 i-vector 分类276
8.3 基于深度学习的说话人识别技术280
8.3.1 概述280
8.3.2 x-vector280
8.3.3 基于 x-vector 的说话人识别示例283
8.4 语种识别288
9 语音识别应用实践292
9.1 语音识别基本应用292
9.1.1 离线语音识别与实时在线语音识别292
9.1.2 语音识别应用模块293
9.1.3 小结296
9.2 话音检测模块296
9.2.1 VAD算法296
9.2.2 离线VAD297
9.2.3 流式在线VAD298
9.3 模型的适应299
9.3.1 声学模型的适应299
9.3.2 词表的扩展300
9.3.3 语言模型的适应301
9.3.4 小结301
9.4 解码器的选择及扩展302
9.4.1 Kaldi中的解码器302
9.4.2 实际应用中的常见问题及扩展303
9.4.3 小结305
附录A 术语列表306
附录B 常见问题解答308
参考文献313