AIBigKaldi(三)| Kaldi的数据准备(源码解析)

 本文来自公众号“AI大道理”。

 

正所谓巧妇难为无米之炊。
对于语音识别任务来说,对于Kaldi来说,数据就是这个米。

在进行特征提取、模型训练之前,首先要做的就是数据准备。
以最简单的YesNo为例。

 

1 YesNo实例结构

 

其中:

文件夹


脚本

 


 

2 脚本解析

cmd.sh

源码解读:

这里的queue.pl为kaldi调用的gridengine,是一种多cpu(gpu)的一种并行处理的方案。

如果是slurm其他并行任务分发软件配合,则是slurm.pl。

将原来的queue.pl改为run.pl ,表示是在单机运行。

这里的都是调用的utils/run.pl。

path.sh

源码解读:



run.sh

 

run.sh 步骤:

0 下载数据

 

源码解读:

if .....fi类似if....endif。

如果不存在 waves_yesno这个文件夹,then用wget 下载安装包,tar -xvzf 进行解压。

rm -rf data exp mfcc 删除这些文件夹如果存在的话,因为后面会再产生。

 

3 数据准备

 

步骤1 数据准备


 

 

4 数据规范

1.1 prepare_data.sh

功能:

下载完数据集后,将数据集划分为31个训练,30个测试。

在s5/下创建data文件夹,并创建data/train_yesno和data/test_yesno两个目录。

把划分好的音频文件放入train_yesno和test_yesno。

源码:

 

源码解析:


 

结果:

data目录下的数据准备完毕。
data下有三个目录,local、test_yesno和train_yesno。

 

Kaldi使用以下几个文件来表示数据:

1. Text 音频的文本记录。

每一个音频文件一行,一般用不带扩展名的文件名表示。
utt_id在wav.scp文件中与具体的文件映射。

2. wav.scp 将文件映射到唯一的utt_id。

第二个参数既可以是对应utt_id的音频文件路径,也可以是能够获得音频文件的指令。

3. utt2spk 对于每一个音频文件,标记是哪一个人发音的。

因为yesno数据集中只有一个发音者,用global来表示所有的utt_id文件内每一行的发音者。


 

 

5 字典准备

 

 

1.2 prepare_dict.sh

功能:

在data/local目录下创建dict子目录。

在dict子目录下生成字典相关文件。

源码:

 

源码解析:


结果:


 

6 语言模型准备

1.3 prepare_lang.sh

功能:

读取input的资源文件,生成data/lang目录,是Kaldi的标准语言文件夹。

源码:

(源码567行,就不一一解析了)

 

命令行解析:


 

结果:


 

其中:

phone.txt:

存储了 音素与整数的映射

words.txt:

单词与整数的映射。

从这里就可以看出 数据准备阶段一开始数据结构与FST格式的不同。

 L.fst:

这是一个 fst 格式的发音词典,输入是音素,而输出是词。

利用命令:fstprint --isymbols=words.txt L.fst L.txt

可以将将二进制 fst 转化为 text进行查看

利用命令: fstdraw --isymbols=words.txt L.fst | dot -Tps > L.ps

可以转化为L.ps进行查看

L_disambig.fst:

这也是一个 fst 格式的发音词典,只是在这个文件当中,添加了消除歧义的符号,比如#1,#2,以及自循环符号 #0。

利用命令:fstprint --isymbols=words.txt L_disambig.fst L_disambig.txt

可以将将二进制 fst 转化为 text进行查看

利用命令: fstdraw --isymbols=words.txt  L_disambig.fst | dot -Tps > L_disambig.ps

可以转化为L_disambig.ps进行查看

oov.txt :

这个文件里面存储了一些符号,所有ooV词(词表之外的词,out of  vocabulary)都会被映射为这个符号。

topo:

这个文件里面存储了我们后将要用到的HMM模型的拓扑模型,可以看到有两部分。
第一部分之间的数字是2,3,是发音的编号指的是YES,NO,这个可以从 phones.txt 找到。
下面一部分 的数字 1 指的是SIL。

YES,NO 有3种状态,SIL有五种状态。

它们各自状态之间的转移以及转移概率则是每一行 state probability 指定。

phones/*:

phones目录描述音素的相关属性。

 

7 构造G.fst

 

1.4 prepare_lm.sh

功能:

将已经生成好的语言模型转化为Kaldi格式的G.fst,其结果在s5/data/lang_test_tg目录下。

源码:

源码解析:


 

words.txt内容:


 

ARPA是常用的语言模型存储格式,由主要由模型文件头和模型文件体构成。

(词组前面的数字:概率,词组后面的数据,回退权值)

yesno的模型input/task.arpabo:


 

结果:

通过arpa2fst转换的G.fst 通过fstprint函数可以看到结果:

对于fst,其打印结果,一行一般有5列,一行对应一个弧。

第一列和第二列,表示这个弧的起始状态和终止状态。

第三列和第四列,表示输入和输出。

第五列是权重。

 

8  总结

至此数据准备阶段完成了。

进入data目录会看到下面的文件夹。


万事俱备只欠MFCC特征提取。

 

 

下期预告

AIBigKaldi(四)|  Kaldi特征提取

往期精选

AIBigKaldi(二)|  Kaldi的I/O机制

AIBigKaldi(一)|  Kaldi目录结构

 

AI大语音(十四)——区分性训练
AI大语音(十三)——DNN-HMM
AI大语音(十二)——WFST解码器(下)
AI大语音(十一)——WFST解码器(上)

AI大语音(十)——N-gram语言模型
AI大语音(九)——基于GMM-HMM的连续语音识别系统
AI大语音(八)——GMM-HMM声学模型
AI大语音(七)——基于GMM的0-9语音识别系统
AI大语音(六)——混合高斯模型(GMM)
AI大语音(五)——隐马尔科夫模型(HMM)
AI大语音(四)——MFCC特征提取
AI大语音(三)——傅里叶变换家族
AI大语音(二)——语音预处理
AI大语音(一)——语音识别基础

 

 ——————

浅谈则止,细致入微AI大道理

扫描下方“AI大道理”,选择“关注”公众号

—————————————————————

​     

—————————————————————

投稿吧   | 留言吧

 

posted on 2020-12-12 11:03  AI大道理  阅读(522)  评论(0编辑  收藏  举报

导航