Kaldi语音识别实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1 数据分集

在准备语音识别的模型训练环境时,通常会将数据分为训练数据、开发数据和测试数据三个子集。训练数据用于训练模型的参数;开发数据用于指导训练配置参数和调节解码配置参数,以便优化模型训练过程和配置解码器;测试数据则用于测试模型的性能。在数据量不多的情况下,一般会按照80%、10%、10%或85%、10%、5%来划分。Librispeech示例的数据量达到1000小时,划分出100小时来做开发和测试是对数据的浪费,后面将介绍它的分集策略。除数据量外,大规模的语音数据库的数据质量也不是完全均衡的,有些数据的质量比较高,适合初始化,有些数据的质量差一些,更接近实际应用,适合模型调优。对于如何在不同的训练阶段分配数据,以达到优化模型训练流程的目的,Librispeech示例提供了很好的指导。

3.1.1 Librispeech示例的数据处理过程

Librispeech示例的脚本是从数据下载开始的,在网站上分发的数据已经做好了分集,其中训练、开发和测试分别用train、dev和test表示,在此基础上,还有clean和other的区分。Librispeech示例的数据采集自一个有声书网站,原始音频通过对齐和切分,已经形成了一个性别均衡的、以句为单位的数据集,包含每个句子的音频和对应的文本。

为了给这些数据分集,首先对每个句子做一遍语音识别。识别的声学模型使用WSJ示例中训练的声学模型,语言模型使用二元文法,语言模型数据来自这些语音数据对应的电子书文本。根据语音识别的结果,统计每个说话人的WER,然后从低到高排序。在排序的说话人列表中,将前一半标记为clean,意义是这些说话人的语音比较清晰,其余的标记为other。

从clean数据中,随机取20名男性和20名女性作为开发集(dev-clean)。同样的,在剩余的说话人中随机取20名男性和20名女性作为测试集(test-clean)。剩余clean数据用于训练,随机地分为大约100小时和360小时的两个子集,分别命名为train-clean-100和train-clean-360。

在other数据的分集过程中,有意挑选了WER比较高的数据用于开发和测试。以说话人为单位按照WER由低到高排序,在第三个四分位点附近随机选择。剩余other数据用于训练,命名为train-other-500。因此,Librispeech示例的数据共分为7个子集,如表3-1所示。

表3-1 Librispeech示例数据分集结果

3.1.2 数据下载和解压

训练脚本的第一步就是数据下载,首先通过如下定义给出数据存放的位置。这里通常使用绝对路径,便于后续数据处理工具的访问。如果是单机训练,则需要确保这个路径有读写权限。如果是多机训练,则需要确保这个路径在每个计算节点上都是可以直接访问的,并享有读写权限。

接下来定义数据下载的网址,默认使用OpenSLR的官方网站。

OpenSLR网站的服务器在德国,在国内访问可以选择一个速度更快的镜像,例如:

下载数据的脚本中使用了wget作为下载工具,如果下载过程中没有返回错误,则意味着下载的数据是完整的。脚本首先检查目标路径下是否有下载并完成解压的标识文件,如果有,则跳过;如果没有,则在目标文件夹中寻找之前下载过的压缩包,根据文件大小判断已有的压缩包是否完整,如果完整直接解压,否则重新下载。该脚本的使用方法如下:

如果指定了--remove-archive选项,则会在解压结束后删除数据压缩包。例如,我们要下载dev-clean这个子集,执行方式和结果如下,下载的指令细节和进度都会显示出来:

在以上示例脚本中,有三处下载脚本:第一次下载了5个数据子集,包括两个开发集、两个测试集和一个最小的训练集train-clean-100;后面两次分别下载train-clean-360和train-other-500两个比较大的子集,都在实际用到这批数据之前下载。如果需要提前下载好后面的两批数据,可以单独运行下载脚本:

如果实际使用的服务器无法连接下载网址,则可以选择用其他下载工具下载压缩包,然后放到上述目标目录下,这样在运行时脚本就会跳过下载直接解压。在运行示例脚本之前,要确保上述定义的数据下载路径有足够的空间。完整的7个压缩包共61GB,解压后的数据目录结构如下:

除这些文件外,还有一些数据在示例中没有用到,但是也可以在网站上下载。这些数据的信息在README.TXT中可以看到,同时这个文件还介绍了示例中用到的7个子集的目录结构。每个子集的目录下面是这个子集中包含的每个说话人的目录,每个说话人的目录下面是该说话人所阅读的每个章节的目录。在每个章节的目录下面可以看到这个章节的全部文本和每一句的录音文件,例如我们展开train-clean-100可以看到以下目录:

其中,103是说话人编号,1240是章节编号,FLAC文件是每一句录音的音频,不是常见的WAV格式,后面会讲到如何进行音频格式转换。TXT文件是这个章节的文本,内容如下。句子间用换行符分隔,文本和音频编号之间用空格隔开,同时可以看到,文本已经进行了规范。

说话人的详细信息可以在SPEAKERS.TXT文件中找到,例如103号说话人的详细信息有性别、所属子集、录音时长和姓名:

录音文本的详细信息可以在CHAPTERS.TXT文件中找到,例如1240号章节的详细信息有阅读者、时长、所属子集、章节和书名等信息:

因此,Librispeech除可以用来构建语音识别的示例外,也可以用来完成说话人识别、性别分类、音频检索等任务。