
本书围绕语音识别的原理和应用讲解,理论结合实际,采用大量插图,辅以实例,力求深入浅出,让读者能较快地理解语音识别的基础理论和关键技术。为了帮助读者动手操作,提高实战技能,本书最后还结合Kaldi、ESPnet和WeNet等开源工具,介绍了具体的工程实践方法。
本书围绕语音识别的原理和应用讲解,理论结合实际,采用大量插图,辅以实例,力求深入浅出,让读者能较快地理解语音识别的基础理论和关键技术。为了帮助读者动手操作,提高实战技能,本书最后还结合Kaldi、ESPnet和WeNet等开源工具,介绍了具体的工程实践方法。本书包含以下章节: 第1章 语音识别概论,介绍人类语音的产生和感知过程,语音识别的关键技术、发展历史等。 第2章 语音信号基础,介绍声音的采集和量化过程,以及编码和存储格式。 第3章 语音特征提取,介绍语音信号的频域分析、倒谱分析、声学特征提取过程等。 第4章 HMM,介绍双重随机过程,以及HMM的三大问题。 第5章 GMM-HMM,介绍高斯混合模型的定义和重估计公式,并结合例子讲解GMM如何与HMM结合,以及对应的具体参数形式。 第6章 基于HMM的语音识别,介绍单音子声学模型和Viterbi解码过程,以及音素的上下文建模,包括双音子和三音子模型。 第7章 DNN-HMM,介绍深度学习在语音识别中的应用,包括CNN、LSTM、TDNN等网络。 第8章 语言模型,介绍语言模型的训练过程及其在语音识别中的作用。 第9章 WFST 解码器,介绍动态和静态的解码网络,以及WFST、HCLG等关键技术。 第10章 序列区分性训练,介绍 MMI/BMMI、MPE/sMBR等准则,以及Lattice-free MMI训练方法。 第11章 端到端语音识别,介绍CTC、RNN-T、Attention和Transformer等端到端语音识别系统。 第12章 Kaldi实践,首先介绍Kaldi的下载与安装步骤,然后以aishell-1中文数据库为例,介绍如何训练和测试模型。 第13章 ESPnet实践,介绍使用ESPnet进行目前主流的端到端语音识别模型的训练和解码过程。 第14章 WeNet实践,介绍使用WeNet进行CTC/Attention模型的训练和解码过程。 第15章 工业应用实践,介绍如何封装语音识别动态库,如何调用和调优,以及嵌入式移植和端侧部署过程。 本书由洪青阳完成主要章节的编写,李琳负责第3章的编写,洪青阳和李琳对全书进行了审校。特别感谢赵淼、李松、张宁、夏仕鹏、刘凯、胡文轩、李涛、余洪涌对本书的贡献,赵淼、李松、胡文轩和李涛分别对Kaldi、ESPnet和WeNet的实践过程等内容做了深入细致的整理,他们的协助使得本书顺利完成。 感谢厦门大学智能语音实验室的童峰老师、许彬彬老师和同学们,为本书的创作提供了良好的学术氛围和精益求精的驱动力。 感谢语音学术和产业界的赵庆卫、王东、余洪涌、李明、张超、谢磊、张卫强、张鹏远等专家和学者,他们的指导和启发令本书增色不少。 感谢电子工业出版社的郑柳洁等老师的大力支持,她们认真细致的工作保证了本书的质量。 为读者写一本精品书是作者的初衷,但由于作者水平有限,书中难免有疏漏和不足之处,恳请读者批评指正!
第1章 语音识别概论 1 1.1 语音的产生和感知 1 1.2 语音识别过程 4 1.3 语音识别发展历史 8 1.4 国内语音识别现状 15 1.5 语音识别建模方法 18 1.5.1 DTW 19 1.5.2 GMM-HMM 19 1.5.3 DNN-HMM 20 1.5.4 E2E模型 22 1.6 语音识别开源工具 22 1.7 常用语音识别数据库 23 1.8 语音识别评价指标 24 1.9 参考资料 25 第2章 语音信号基础 28 2.1 声波的特性 28 2.2 声音的接收装置 29 2.2.1 麦克风的性能指标 30 2.2.2 麦克风阵列 31 2.3 声音的采样 32 2.4 声音的量化 33 2.5 语音的编码 35 2.6 WAV文件格式 39 2.7 WAV文件分析 40 2.8 本章小结 43 思考练习题 43 第3章 语音特征提取 44 3.1 预处理 44 3.2 短时傅里叶变换 48 3.3 听觉特性 51 3.4 线性预测 54 3.5 倒谱分析 55 3.6 常用的声学特征 56 3.6.1 语谱图 57 3.6.2 FBank 58 3.6.3 MFCC 59 3.6.4 PLP 60 3.7 本章小结 62 思考练习题 63 第4章 HMM 64 4.1 HMM的基本概念 66 4.1.1 马尔可夫链 67 4.1.2 双重随机过程 68 4.1.3 HMM的定义 69 4.2 HMM的三个基本问题 70 4.2.1 模型评估问题 71 4.2.2 最佳路径问题 74 4.2.3 模型训练问题 76 4.3 本章小结 78 4.4 参考资料 79 思考练习题 79 第5章 GMM-HMM 80 5.1 概率统计 81 5.2 高斯分布 82 5.3 GMM 85 5.3.1 初始化 86 5.3.2 重估计 87 5.4 GMM与HMM的结合 88 5.5 GMM-HMM的训练 94 5.6 模型自适应 96 5.6.1 MAP 96 5.6.2 MLLR 97 5.6.3 fMLLR 97 5.6.4 SAT 98 5.7 本章小结 98 5.8 参考资料 98 思考练习题 99 第6章 基于HMM的语音识别 100 6.1 建模单元 100 6.2 发音过程与HMM状态 103 6.3 串接HMM 104 6.4 固定语法的识别 108 6.5 随机语法的识别 113 6.6 音素的上下文建模 119 6.6.1 协同发音 120 6.6.2 上下文建模 121 6.6.3 决策树 122 6.6.4 问题集 123 6.6.5 三音子模型的训练 128 6.7 本章小结 129 思考练习题 130 第7章 DNN-HMM 131 7.1 深度学习 131 7.2 DNN 132 7.2.1 激活函数 133 7.2.2 损失函数 135 7.2.3 梯度下降算法 136 7.3 DNN与HMM的结合 138 7.4 不同的DNN结构 142 7.4.1 CNN 143 7.4.2 LSTM 147 7.4.3 GRU 147 7.4.4 TDNN 148 7.4.5 TDNN-F 151 7.5 本章小结 154 7.6 参考资料 155 思考练习题 155 第8章 语言模型 156 8.1 n-gram模型 158 8.2 评价指标——困惑度 162 8.3 平滑技术 163 8.3.1 Good-Turing折扣法 163 8.3.2 Witten-Bell折扣法 165 8.3.3 Katz回退法 166 8.3.4 Jelinek-Mercer插值法 169 8.3.5 Kneser-Ney插值法 170 8.4 语言模型的训练 172 8.5 神经网络语言模型 175 8.6 本章小结 180 8.7 参考资料 180 思考练习题 181 第9章 WFST解码器 183 9.1 基于动态网络的Viterbi解码 184 9.2 WFST理论 189 9.3 HCLG构建 193 9.3.1 H的构建 194 9.3.2 C的构建 195 9.3.3 L的构建 196 9.3.4 G的构建 197 9.3.5 HCLG合并 200 9.4 WFST的Viterbi解码 202 9.4.1 Token的定义 202 9.4.2 Viterbi算法 203 9.5 Lattice解码 210 9.5.1 主要数据结构 211 9.5.2 令牌传播过程 212 9.5.3 剪枝策略 215 9.5.4 Lattice 216 9.6 本章小结 218 9.7 参考资料 218 思考练习题 218 第10章 序列区分性训练 219 10.1 区分性准则 220 10.1.1 MMI 220 10.1.2 BMMI 221 10.1.3 MPE/sMBR 221 10.2 MMI求导过程 222 10.3 Lattice-based MMI 224 10.4 Lattice-free MMI 226 10.5 Kaldi Chain模型 228 10.6 本章小结 230 10.7 参考资料 230 思考练习题 231 第11章 端到端语音识别 232 11.1 CTC 233 11.1.1 损失函数 234 11.1.2 前向算法 238 11.1.3 后向算法 241 11.1.4 求导过程 242 11.1.5 CTC解码 244 11.2 RNN-T 247 11.3 基于Attention的Encoder-Decoder模型 250 11.4 Hybrid CTC/Attention 253 11.5 Transformer 255 11.6 Conformer 258 11.7 本章小结 259 11.8 参考资料 259 思考练习题 261 第12章 Kaldi实践 262 12.1 下载与安装Kaldi 263 12.1.1 获取源代码 263 12.1.2 编译 264 12.2 创建和配置基本的工程目录 265 12.3 aishell语音识别工程 266 12.3.1 数据集映射目录准备 267 12.3.2 词典准备和lang目录生成 269 12.3.3 语言模型训练 271 12.3.4 声学特征提取与倒谱均值归一化 273 12.3.5 声学模型训练与强制对齐 275 12.3.6 解码测试与指标计算 277 12.4 本章小结 279 第13章 ESPnet实践 280 13.1 数据准备 280 13.1.1 映射文件准备 280 13.1.2 特征提取 281 13.1.3 数据扩增 282 13.1.4 词典生成 282 13.1.5 数据打包 283 13.2 ESPnet配置文件 284 13.3 语言模型训练 286 13.4 声学模型训练 287 13.4.1 声学模型训练脚本 287 13.4.2 CTC声学模型训练 288 13.4.3 Attention声学模型训练 289 13.4.4 RNN-T模型训练 290 13.4.5 Transformer模型训练 292 13.5 语音识别解码 293 13.6 ESPnet训练解码可视化 294 13.6.1 ESPnet训练参数可视化 294 13.6.2 ESPnet中的Attention可视化 295 13.6.3 ESPnet解码结果可视化 296 13.7 ESPnet2 297 13.7.1 ESPnet2与ESPnet 297 13.7.2 数据准备 298 13.7.3 配置文件 299 13.7.4 模型训练 300 13.7.5 训练日志与可视化 303 13.7.6 性能对比 304 13.8 本章小结 305 13.9 参考资料 305 第14章 WeNet实践 306 14.1 数据准备 306 14.1.1 映射文件准备 306 14.1.2 CMVN计算 307 14.1.3 词典生成 307 14.1.4 数据打包 307 14.2 WeNet配置文件 308 14.3 声学模型训练 309 14.3.1 声学模型训练脚本 309 14.3.2 Transformer模型训练 310 14.3.3 Conformer模型训练 313 14.3.4 Unified Conformer模型训练 314 14.3.5 U2++ Conformer模型训练 315 14.4 Python环境解码 315 14.5 WeNet 模型部署 317 14.5.1 模型导出 317 14.5.2 语言模型训练 317 14.5.3 结合语言模型的解码 318 14.6 WeNet 解码结果可视化 318 14.7 本章小结 319 14.8 参考文献 319 第15章 工业应用实践 320 15.1 应用场景 321 15.2 引擎优化 323 15.2.1 Kaldi方案 323 15.2.2 WeNet方案 327 15.3 工程部署 330 15.3.1 SDK封装 330 15.3.2 语音云平台 338 15.3.3 Kaldi嵌入式移植 342 15.3.4 WeNet端侧部署 344 15.4 本章小结