Kaldi语音识别实战
  • 推荐3
  • 收藏0
  • 浏览1.3K

Kaldi语音识别实战

陈果果 等 (作者) 

  • 书  号:978-7-121-37874-4
  • 出版日期:2020-03-30
  • 页  数:336
  • 开  本:16(170*240)
  • 出版状态:上市销售
  • 维护人:刘皎
电子书 ¥62.30
购买电子书
纸质版 ¥89.00
Kaldi是目前语音识别领域,广受欢迎并流行的开源工具包。Kaldi设计之初对通用性,可拓展性等一系列源代码层次的考量,大大降低了Kaldi作为语音识别工具包的门槛, 同时拥有非常完整的语音识别系统训练脚本。本书通过对Kaldi已有训练脚本的梳理和引导,帮助读者快速搭建可用的语音识别系统。
Kaldi之父作序,实际操作, 读完即用
推荐序1
最近这段时间我的生活有了一些戏剧性的变化,大家可以从一些新闻(比如《纽约时报》)中看到具体的报道。因为这些变化,我目前暂时在做一些咨询的工作,也因此有机会到世界各处巡游。比如此时此刻,在为这本书写序的时候,我正在土耳其伊斯坦布尔的一家小咖啡馆里。写序其实并不是一个我所擅长的事情,相对来说,我更喜欢写程序,但是我会尽我所能为这本书写序。
计算机软件很少有处在稳定状态的,对于Kaldi来说尤其如此。用鲨鱼的例子来做类比,鲨鱼是从来不休息的,必须通过持续的运动才能生存;Kaldi也是这样,这些年来一直都在一刻不停地、持续地发展壮大。当然,发展是一把双刃剑,这么高速的发展给Kaldi带来了很多发展红利,也不可避免地带来了问题。事实上,在当前版本的Kaldi开发中,我们做出了不少正确的决定,但是回过去看,也有不少不尽如人意的设计。因此,我目前正在为Kaldi规划一些比平常大得多的改动,比如更好地支持当前主流的机器学习框架,例如PyTorch。当然,Kaldi大部分的特性都会保持不变,因此我相信这本书的内容会一直有很大的参考价值。
Kaldi最宝贵的资产其实一直都是Kaldi的开源社区。我相信这本书的出版能够极大地推动Kaldi开源社区的持续发展。对我个人来说,无论将来在哪里工作,我也都会继续全身心地投入到Kaldi项目中。
Daniel Povey 2019年9月27日
作者 译 2019年9月27日

推荐序2
在最近的十年里,语音识别、语音合成和语音信号处理都有了长足的发展。这些发展一方面归功于研究人员在语音处理领域引入了一系列新的研究成果,比如序列上的区分度训练和基于深度学习的识别和合成框架,另一方面得益于用户在移动互联网时代对语音技术的应用需求和与之对应的海量数据和强大计算力,这些因素互相促进,极大地推动了语音技术的发展,并使得语音技术的性能指标在几年前就超过了用户的使用门槛,催生了大量的实际应用。
在技术和应用的发展过程中,工具一直占有着重要的地位,比如,TensorFlow、PyTorch、CNTK、MXNet等深度学习工具的出现极大地推动了深度学习的发展。而语音系统链路复杂,涉及的技术模块多样,所需的领域知识点繁多,对工程优化的要求高,好的工具就显得尤为重要。早期的语音识别的发展大大得益于HTK和Sphinx 工具集,而在最近的十年里,Kaldi工具箱对于语音技术的普及和研发起到了举足轻重的作用。
Kaldi起源于2009年的约翰霍普金斯大学夏季研讨会,当时我在微软研究院语音与对话研究组的同事Dan Povey博士提出了Subspace Gaussian Mixture Model (SGMM),并在研讨会上组织研究了这个模型。作为这个研究的一个副产品,他们开始整理和开发一个新的语音技术工具箱Kaldi,并采用了开源的开发模式。经过十年的发展,Kaldi已经成为深度学习时代主流的语音技术工具箱,集成了大量的最新进展和最优脚本,极大地降低了语音技术的研究和应用门槛。
不过,Kaldi是一个持续发展中的开源项目,它的文档大大落后于代码。本书作者们基于自己多年的一线语音研发和 Kaldi 使用经验,深入浅出地介绍了语音识别各个模块的原理及Kaldi中各种实践技巧的来龙去脉和使用方法,极大地弥补了 Kaldi文档方面的缺陷,降低了Kaldi的学习和使用门槛,有助于Kaldi的进一步推广和开发。

俞栋 IEEE Fellow,腾讯人工智能实验室副主任
2019年9月28日于西雅图
颜永红 中国科学院语言声学与内容理解重点实验室主任
Kaldi 开源软件对推动语音技术研究和产品落地做出了不可磨灭的贡献,本书作者是工作在语音研究和产业前沿的青年才俊,他们以第一手经验详细讲解了如何运用该软件构建实际系统,这对初学者迅速掌握相关知识和技能是非常有益的。

俞凯 上海交通大学智能语音技术实验室主任,思必驰联合创始人、首席科学家
我和Dan Povey博士十几年前在剑桥大学共事时,使用的是早期最著名的语音识别开源软件之一:HTK。虽然后来Kaldi因其灵活的设计、开放的协议和丰富的功能而如日中天,却一直在系统教程方面远远落后于HTK。本书从理论和实践的角度对Kaldi进行了完整呈现,不仅有其实用价值,也为“知其所以然”给出了很好的注解,相信必然会对Kaldi的传播和语音识别技术的发展起到积极的促进作用。

崔宝秋 小米集团副总裁、集团技术委员会主席
Kaldi是开源语音技术的一个典范,是高校同学们入门语音的启迪工具,也是人们快速提升语音技术的捷径。它消除了大家因为长期沉浸在语音教科书和论文里而产生的“手痒”,给人们带来快速上手实践、快速感受语音数据之美的快乐。本书作者们都有丰富的工业界(包括小米)实战经验和深厚的学术积累,他们把这些经验和积累无私地贡献出来,也真正体现了开源的共享精神。拥抱开源是小米的工程文化,衷心希望Kaldi及其社区在Daniel Povey博士的领导下不断茁壮成长、引领语音技术的发展。

张锦懋 美团首席科学家、基础研发平台负责人
Kaldi的诞生使得语音识别领域的研究和创新成本都显著降低,让整个行业都获益匪浅。这本书的几位作者非常全面地介绍了Kaldi的功能,包括数据处理、声学模型、解码器等相关的工具,同时对相关理论也进行了详细的阐述,让读者不仅学会使用Kaldi,而且能够理解为什么这么使用。

雷欣 出门问问首席技术官
Kaldi相比于经典的HTK工具包进行了巨大的优化,譬如C++的采用、基于WFST的静态解码器、达到state-of-the-art性能的recipe脚本等。这些优势使得Kaldi开源库得到迅速的发展,极大地降低了语音技术的门槛,使得像出门问问这样的语音创业公司能在短时间内开发出一流的语音技术产品。相比于经典的HTK Book,Kaldi在文档方面则显得落后很多。本书的作者们都是Kaldi社区的活跃开发者,对Kaldi及语音技术有着深刻的理解,他们的努力使得中国的语音技术爱好者们有了一本入门和提高的参考书,必将进一步推动语音技术的普及。

邹月娴 北京大学教授、博士生导师,深圳市人工智能学会专家委主任
我在北京大学深圳研究生院开展教学和科研工作十四个整年头,其间为计算机应用技术专业的学生主讲“机器学习与模式识别”课程,带领一群优秀的研究生开展机器听觉技术研究。我们的教学和研究得益于众多的开源项目,深切体会到Kaldi作为主流的语音识别开源工具对同学们的帮助。Kaldi秉承其开源社区的传统特性,支持主流的机器学习框架和算法,受到众多业界和学界开发者的支持。我相信本书的作者们正是秉承这样的精神,以实际行动支持Kaldi开源社区。这本书不仅介绍了语音技术的发展简史、Kaldi的发展历史,也涵盖了最新的基于深度学习的语音技术主流框架和语音识别应用实践案例,所呈现的内容和提供的实战技巧贴近产业需求,该书的出版将有益于学子们更加快速地了解主流的语音技术并迅速开展编程实践,推动语音技术进步和应用的发展。

李岚 中软国际教育科技集团人工智能研究院执行院长
人工智能技术在近年被确立为国家战略后,高校和企业间深度合作,在人工智能的人才培养上形成了一致看法,即实践是学校和学生的一致需求。从产业界的实际发展来看,随着人工智能技术应用领域的扩展,“听”这一感知领域,已经是迫切需要得以提升和发展的。企业专家,特别是实际应用领域的专家联合推动的行业数据和技术开源,为这个领域的人才培养做出了贡献。而如何让更多的老师和学生们了解语音领域的发展现状及学习路径,需要和本书的作者们一样,分享自己的理解和系统梳理。我们也将在后续工作中,将本书作为我们的教材之一,希望能推动语音领域人才的培养。

前言
在过去的几年里,语音相关产业发展迅速,产品形态五花八门。在消费电子领域,随着语音输入、语音搜索、智能助手等产品的出现,一场人人交互和人机交互的变革正在我们身边发生。语音产业的上一次爆发出现在20世纪80年代至90年代:隐马尔可夫模型的应用,使大规模连续语音识别成为可能——这意味着用户在人机语音交互时,得以摆脱字正腔圆、一词一顿的刻板方式。在过去的十年间,随着深度学习技术的强势崛起和以GPU为代表的算力硬件的爆发,语音类产品(包括但不限于语音转文字、说话人识别、语种识别等)的使用体验又一次得到了显著的提升。更重要的是,深度学习技术带来的使用体验的提升,使语音技术更加接近商用,促成了语音产品和语音数据之间的良性循环:相比传统模型,基于深度神经网络的语音识别系统总是能更有效地利用持续增长的数据量,提升识别性能,而识别性能的提升,又会激发更多的产业应用,打通海量语音数据的获取渠道,进一步优化模型。
随着语音算法的逐代升级,语音技术链路的相关研发工具也逐步成型和完善,其中的代表是 HTK 和 Sphinx 工具集,这两个工具集都能够完成从模型的训练到产品原型的搭建等一系列工作,并催生了一批以语音识别为核心技术的公司。在20世纪90年代末,这两个工具集先后开源,再次降低了语音识别和相关领域的研发门槛与成本。
在最近的十年里,新一代的开源项目Kaldi逐步取代了 HTK 和 Sphinx 的统治地位,成为了流行的开源语音工具箱。Kaldi 诞生之初就汲取了其他语音项目的经验,并以语音识别为核心进行全局的设计:包含自成一派的文件I/O及存储、数据处理流水线、模型训练流水线,以及采用高效且优雅的加权有限状态机(WFST)作为语音识别解码的统一框架,并提供了离线/在线识别原型等。
Kaldi 项目发布不久,就吸引了国内外的大量用户,形成了一个活跃的开源社区。在社区中,有国际顶尖的语音科学家、探索新边界的博士研究生,也有初探语音识别的初学者、其他技术领域想使用语音技术的工程师,当然还有经历了HTK时代的老用户们。截至本书完稿时,Kaldi 在 GitHub 上的官方项目中获得的星标和子仓库合计已超过一万个。
尽管 Kaldi 工具箱的出现在很大程度上降低了语音识别技术的研究门槛,但与其他AI技术相比,它的语音识别技术本身链路复杂、模块多样、领域知识点众多;此外,目前 Kaldi 社区的活跃开发者们更关注推进核心技术,因此在文档建设方面,还停留在项目早期的设计理念及核心概念阶段,文档稀缺;再加上市场上少有 Kaldi 相关的教程和书籍,尤其是中文书籍,更使得国内用户在入门语音识别技术及上手 Kaldi 工具箱时,面临比较陡峭的学习曲线。
本书的作者来自 Kaldi 的开发团队、开源社区和企业用户,具有多年的语音研发经验和 Kaldi 使用经验。笔者长期在各Kaldi 社群中为普通用户答疑,交流的主题大致可以分为四类,即语音识别的基础理论、Kaldi 中的具体算法实现、Kaldi 工具箱的用法、搭建语音系统中经常遇到的实际问题。本书致力于系统梳理以上四类问题,深入浅出地介绍语音识别各个模块的原理,厘清 Kaldi 中各种实践技巧的来龙去脉,并结合示例解析,展示如何使用 Kaldi 构建语音识别、关键词检索、说话人识别和语种识别系统。
本书假定读者具备基础的编程知识和最基本的机器学习概念。笔者在行文中注重示例解析,尽量避免公式推导,注重阐述核心问题及对应算法的直观意义,力图帮助读者快速建立语音技术的宏观视角,并熟悉 Kaldi 工具箱的微观样貌。没有语音背景的读者,可以把本书当作快速上手语音研发的入门参考书。同时,对于一些没有详细展开的理论知识点,本书给出了相关的经典论文或参考文献,供有兴趣、有能力的读者进一步纵向深入掌握。
Kaldi 是一个仍在持续演进并快速迭代的开源项目,在 Kaldi 发布10周年之际,藉以此书对其发展历史做一个回顾,对当前状态做一次汇总,愿与广大中文 Kaldi 用户一同展望语音行业的美好未来。

作 者
2019年12月


目录

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


读者评论