数据整理
在使用语音识别工具训练声学模型时,需要面临的两个问题:
- 如何选择训练数据
- 如何将数据整理成工具可以支持的格式。
本文介绍如何构建符合Kaldi脚本规范的数据资源文件,包括数据文件夹data和语言文件夹data/lang,并以Librispeech为例,介绍如何划分训练数据,以及各种资源文件的内容和用途。
1. 数据分集
通常将数据分为训练数据、开发数据和测试数据三个子集。
- 训练数据:用于训练模型的参数
- 开发数据:用于指导训练配置参数和调节解码配置参数,优化模型训练过程和配置解码器
- 测试数据:测试模型的性能
一般会按照80%、10%、10%或者85%、10%、5%的比例划分。
1.1 Librispeech示例的数据处理过程
Librispeech示例的脚本是从数据下载开始的,在网站上分发的时候已经做好了分集,其中训练、开发和测试分别用train、dev和test表示。
为了给数据分集,首先对每个句子做一遍语音识别。识别的声学模型使用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数据来源:http://openslr.org/12
完整的压缩包共61GB。
1.2 数据下载和解压
训练脚本的第一步就是数据下载,首先通过如下定义给出数据存放的位置。这里通常使用绝对路径。下载脚本位于:kaldi/egs/librispeech/s5/local/download_and_untar.sh。使用方法如下:
local/download_and_untar.sh [--remove-archive] <data> <data_url> <part>
如果指定了–remove-archive选项,则会在解压后删除数据压缩包。例如,下载dev-clean这个子集:
$ ./local/download_and_untar.sh /home/ubuntu/Sound/Data/storage https://www.openslr.org/resources/12 dev-clean
解压后的数据目录结构如下。
对于其他数据子集,数据目录结构类似。每个子集的目录下面是这个子集中包含的每个说话人的目录,每个说话人的目录下面是该说话人所阅读的每个章节的目录。在每个章节的目录下面可以看到这个章节的全部文本和每一句的录音文件。以dev-clean为例:
其中1271是说话人编号,128104是章节编号,flac文件是每一句录音的音频,不是常见的wav格式。txt文件是这个章节的文本,内容如下:
句子间用换行符隔开,文本和音频编号之间用空格隔开,同时可以看到,文本已经进行了规范。
说话人的详细信息可以在SPEAKERS.TXT文件中找到,内容示例如下。例如14号说话人信息有性别、所属子集、录音时长和姓名。
录音文本的详细信息可以在CHAPTERS.TXT文件中找到,示例内容如下。例如1号章节的详细信息有阅读者、时长、所属子集、章节和书名等信息。
因此,Librispeech除了可以用来构建语音识别的示例外,也可以用来完成说话人识别、性别分类、音频检索等任务。