zoukankan      html  css  js  c++  java
  • 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大道理”,选择“关注”公众号

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

    ​     

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

    投稿吧   | 留言吧

  • 相关阅读:
    设计模式---工厂模式和抽象工厂模式
    设计模式---简单工厂模式
    设计模式---设计模式的分类及六大原则
    分布式---Raft算法
    分布式---Paxos算法
    分布式---CAP和BASE理论
    分布式---分布式事务
    分布式---分布式锁
    css
    react生命周期
  • 原文地址:https://www.cnblogs.com/AIBigTruth/p/14123964.html
Copyright © 2011-2022 走看看