Kaldi 语音识别基础教程

Kaldi 介绍

Kaldi 是由 C++ 编写的语音识别工具,其目的在于为语音识别研究者提供一个研究和使用的平台。

Kaldi 环境搭建

本文主要通过使用 Docker 和 Nvidia-docker 构建 Ubuntu 环境对 Kaldi 进行搭建。Docker 针对的是无 GPU 的环境,Nvidia-docker 针对的是需要使用 GPU 计算的环境,如果读者机器上存在 GPU 计算资源,请使用 Nvidia-docker,使用 Nvidia 官方提供的 CUDA 镜像,可以省去安装 CUDA 的麻烦。Kaldi 的环境搭建分为两部分,一部分为依赖工具安装,另一部分为自身源码编译。

Docker 基础命令

本节简单介绍在安装 Kaldi 过程中使用到的 Docker 基础命令,如读者需要更加详细的学习 Docker ,请主动寻找相应的专业书籍、文档学习。

本章中所用到的 Docker 命令如下:

docker pull       从 Docker Hub 中拉取镜像
docker images     查看系统中所有 Docker 镜像
docker run        运行 Docker 镜像
docker <span class="hljs-built_in">exec       &#x767B;&#x9646;&#x5DF2;&#x7ECF;&#x8FD0;&#x884C;&#x7684; Docker &#x955C;&#x50CF;
docker commit     &#x5728;&#x539F;&#x6709;&#x955C;&#x50CF;&#x57FA;&#x7840;&#x4E0A;&#x521B;&#x5EFA;&#x65B0;&#x955C;&#x50CF;
docker ps         &#x67E5;&#x770B;&#x955C;&#x50CF;&#x662F;&#x5426;&#x8FD0;&#x884C;
</span>

注意: 如果读者需要使用 GPU 来进行计算,需要安装 Nvidia-docker , 该软件的运行命令与 Docker 的运行命令一致。Docker 与 Nvidia-docker 的安装过程这里不做介绍。

Kaldi 环境搭建

这里假设读者电脑已经安装 Docker 和 Nvidia-docker ,如果未安装,请先安装再进行如下操作。

首先通过 Docker 获取相应的 Ubuntu 系统。

docker pull nvidia/cuda:<span class="hljs-number">9.0-<span class="hljs-keyword">base-ubuntu16<span class="hljs-number">.04
</span></span></span>

之后启动该镜像,并安装相应软件

nvidia-docker run -itd nvidia/cuda:9.0-base-ubuntu16.04 /bin/bash         &#x542F;&#x52A8;&#x955C;&#x50CF;&#x5E76;&#x4FDD;&#x6301;&#x540E;&#x53F0;&#x8FD0;&#x884C;

nvidia-docker ps         &#x83B7;&#x53D6;&#x8BE5;&#x542F;&#x52A8;&#x955C;&#x50CF;&#x7684; Container ID

nvidia-docker <span class="hljs-built_in">exec -it <container id> /bin/bash &#x8FDB;&#x5165;&#x7CFB;&#x7EDF;

apt-get update

apt-get install git vim

<span class="hljs-built_in">cd /opt && git <span class="hljs-built_in">clone https://github.com/kaldi-asr/kaldi.git && <span class="hljs-built_in">cd kaldi
</span></span></span></container></span>

接下来进行 Kaldi 的第一部分安装,第一部分主要是针对 Kaldi 依赖工具的安装比如 Openfst、Portaudio 等。安装步骤如下:

    cd tools && extras/check_dependencies.sh

    apt-<span class="hljs-keyword">get install  g++ zlib1g-dev make automake autoconf bzip2 unzip wget sox libtool subversion python2<span class="hljs-number">.7 python3 libatlas-dev libatlas-<span class="hljs-keyword">base-dev

    make

    extras/install_irstlm.sh
</span></span></span>

Kaldi 安装的第二部分为源码编译部分,这里的首要条件是第一部分正常安装之后,第二部分才能顺利完成。安装步骤如下:

    <span class="hljs-built_in">cd /opt/kaldi/src

    ./configure --shared

    make depend -j 8

    make -j 8
</span>

只有以上两部顺利安装,Kaldi 的安装才算成功。

最后读者可以退出终端,使用命令:

docker <span class="hljs-keyword">commit <<span class="hljs-keyword">Container <span class="hljs-keyword">ID> kaldi:latest
</span></span></span>

来构建一个可以长时间使用的 Docker 镜像,当然读者也可以使用作者已经做好的 Dockerfile 文件来生成 Docker 镜像,或者直接拉取作者已经做好的 Docker 镜像。

Kaldi 目录介绍

本节主要对 Kaldi 的目录进行详细介绍。

Kaldi 一级目录

在 Kaldi 的一级主目录中(也就是进入 kaldi 目录之后大家所看到的所有目录)包括:egs、misc、scripts、src、tools、windows。

  • egs :此目录为 Kaldi 例子目录,其中例子包含了不乏语音识别、语种识别、声纹识别、关键字识别等。
  • misc : 此目录包含了一些 pdf、以及相关 docker、htk 等资源
  • scripts: 此目录只用来存放 Rnnlm,以及相应的运行脚本。
  • src : 此目录为 Kaldi 的源代码目录,Kaldi 的多数算法的源代码都存放于此,其中不乏GMM、Ivector、Nnet等一系列的算法。
  • tools: 此目录主要存放 Kaldi 依赖库的安装脚本
  • windows: 此目录为在 Windows 平台运行所必须的脚本以及相关的执行程序。

这里只是针对性的对 egs 和 src 目录进行介绍,其他目录读者可以自行了解。

Kaldi 一级目录 Egs

Egs 目录主要用于存放 Kaldi 的所有例程,这里会统一罗列出相关文件所包含的相关例子。

  • Aishell : 此目录为中文语音识别和声纹识别相关例子。
  • Aishell2 : 此目录主要为中文语音识别例子,但是针对 Aishell 在脚本方面更加规整。
  • ami : 此目录主要涉及到多信道语音识别的例子。
  • an4 : 此例子为 CMU 提供语音识别例子,并没有涉及神经网络。
  • apiai_decode: 此例子为解码器使用的例子,其中包含了如何使用预训练模型,这里主要针对的是 Nnet3 解码。
  • aspire: 此为ASpIRE 挑战赛的例子,其中包含了怎样使用噪声数据构建多条件数据的例子。
  • aurora4: 此例子主要介绍 RBM 预训练。
  • babel: 此例子主要是用来训练 KWS (Key Word Search)。
  • babel_multilang: 此例子为训练多语音 KWS。
  • bentham: 手写笔识别的例子。
  • bn_music_speech : 音乐与语音区分的例子。
  • callhome_diarization : 说话人分割的例子。
  • callhome_etyptian: 埃及语语音识别例子。
  • chime1-5 : 主要针对 CHiME 竞赛开放的例子。
  • cigar : 图像分类的例子。
  • commonvoice: Mozilla Common Voice 语音识别的例子。
  • csj : 日语 语音识别例子。
  • dihard_2018 : DiHARD Speech Diarization CHALLENGE 的例子。
  • fame : 富里西语语音识别和声纹识别的例子。
  • farsdat: 主要用来声学语音研究和语音识别的例子。
  • fisher_callhome_spanish : 使用 Callhome 预料进行语音识别的例子。
  • fisher_english: 英文双声道 8000 Hz 对话电话语音数据集的语音识别例子。
  • fisher_swbd: 包含 fisher 数据集以及 swbd 数据集的语音识别例子。
  • gale_arabic: 阿拉伯语语音识别例子。
  • gale_mandarin: 普通话语音识别例子。
  • gp: 全球电话语音识别例子(多语种语音识别例子)。
  • heroico: 西班牙语音识别例子。
  • houst: 普通话电话语音识别例子。
  • hub4_english : 英语新闻广播语音识别例子。
  • hub4_spanish: 西班牙新闻广播语音识别例子。
  • iam: IAM 手写笔识别例子。
  • iban: 语音识别例子。
  • ifnenit: 阿拉伯语手写笔识别例子。
  • librispeech: 英语语音识别例子。
  • lre/lre07 : 语种识别例子。
  • madcat_ar : 手写笔识别例子。
  • madcat_zh: 中文手写笔识别例子。
  • mini_librispeech: 英语语音识别例子。
  • mult_en: 英语 LVCSR 例子。
  • pub: RNNLM 模型构建例子。
  • reverb: REVERB 挑战赛例子。
  • rimes: 法语手写笔识别例子。
  • rm: 英语语音识别例子,包含了如何进行迁移学习。
  • sitw: sitw 说话人识别挑战赛的例子。
  • sprakbanken: 丹麦语语音识别例子。
  • sprakbanken_swe: 瑞典语语音识别例子。
  • sre08/10/16: 说话人识别的例子。
  • svhn: 图像分类的例子。
  • swahili: 班图人语 语音识别例子。
  • swab: 双声道对电话语音识别例子。
  • tedium: 英语语音识别例子。
  • thchs30: 普通话语音识别例子。
  • tidigits: 基础语音识别的例子。
  • timit: 主要是 GMM/HMM 语音识别例子。
  • tunisian_msa: 阿拉伯语音识别例子。
  • uw3:OCR 识别例子。
  • voxceleb: 说话人识别例子。
  • vystadial_cz: 捷克语语音识别例子。
  • voxforge: 基础语音识别例子,以及对应的在线 demo 的例子。
  • vystadial_en: 英文语音识别例子。
  • wsj: wsj 英文语音识别例子。
  • yesno: 独立词语音识别例子。
  • yomdle_fa/korean/russian/tamil/zh: OCR 识别例子。
  • zeroth_korean: 朝鲜语语音识别例子。

注意: 虽然 Egs 中存放了大量的例子,但由于某些外部原因并不是所有例子的数据都能免费获得。

Kaldi 一级目录 src

src 目录为 Kaldi 的源码目录,主要保存了包括 GMM、HMM 等在内的大部分 Kaldi 语音项目源代码。这里分别对相关算法目录进行介绍。

在 src 目录中,有两类文件夹,一类是算法原目录,一类为算法组合生成bin(可执行程序)目录。

<span class="hljs-attribute">base:       Kaldi &#x57FA;&#x7840;&#x76EE;&#x5F55;&#xFF0C;&#x4E3B;&#x8981;&#x5305;&#x62EC;&#x4E0E; Kaldi &#x9879;&#x76EE;&#x76F8;&#x5173;&#x7684;&#x57FA;&#x7840;&#x5B8F;&#x5B9A;&#x4E49;&#x3001;&#x7C7B;&#x578B;&#x5B9A;&#x4E49;&#x7B49;&#x3002;

<span class="http"><span class="hljs-attribute">bin:        Kaldi &#x7684;&#x57FA;&#x7840; bin &#x76EE;&#x5F55;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x5305;&#x62EC;&#x57FA;&#x7840;&#x7684;&#x6267;&#x884C;&#x7A0B;&#x5E8F;&#x3002;&#x4F8B;&#x5982;&#xFF0C;&#x67E5;&#x770B; tree &#x4FE1;&#x606F;&#x3001;&#x77E9;&#x9635;&#x62F7;&#x8D1D;&#x7B49;&#x57FA;&#x7840;&#x64CD;&#x4F5C;&#x3002;

<span class="http"><span class="hljs-attribute">cudamatrix: Kaldi &#x77E9;&#x9635;&#x8BA1;&#x7B97;&#x76F8;&#x5173; GPU &#x8BA1;&#x7B97;&#x76EE;&#x5F55;

<span class="makefile">matrix :    Kaldi &#x77E9;&#x9635;&#x8BA1;&#x7B97;&#x76F8;&#x5173; CPU &#x8BA1;&#x7B97;&#x76EE;&#x5F55;

<span class="hljs-section">itf:        Kaldi &#x76F8;&#x5173;&#x7684; interface

hmm :       Kaldi &#x76F8;&#x5173;&#x9690;&#x9A6C;&#x5C14;&#x53EF;&#x592B;&#x7B97;&#x6CD5;&#x7684;&#x4EE3;&#x7801;&#x76EE;&#x5F55;

<span class="hljs-section">utils:      Kaldi &#x76F8;&#x5173;&#xFF0C;&#x8BED;&#x97F3;&#x7B97;&#x6CD5;&#x65E0;&#x5173;&#x7684;&#x5DE5;&#x5177;&#x76EE;&#x5F55;&#xFF0C;&#x4F8B;&#x5982;&#xFF0C;&#x7EBF;&#x7A0B;&#x64CD;&#x4F5C;&#x3001;io&#x64CD;&#x4F5C;&#x3001;&#x6587;&#x672C;&#x64CD;&#x4F5C;&#x7B49;&#x3002;

<span class="hljs-section">probe:      Kaldi &#x76F8;&#x5173;&#x7684; exp&#xFF08;&#x6307;&#x6570;&#xFF09; &#x6D4B;&#x8BD5;&#x76EE;&#x5F55;

<span class="hljs-section">transform:  Kaldi &#x76F8;&#x5173;&#x7684;&#x7279;&#x5F81;&#x8F6C;&#x6362;&#x7B97;&#x6CD5;&#x76EE;&#x5F55;

<span class="hljs-section">fstext:     Kaldi &#x4E2D; fst &#x76F8;&#x5173;&#x7684;&#x7B97;&#x6CD5;&#x57FA;&#x7840;&#x76EE;&#x5F55;

<span class="hljs-section">fstbin:     Kaldi &#x4E2D; fst &#x5BF9;&#x5E94;&#x7684;&#x7B97;&#x6CD5;&#x6267;&#x884C;&#x6587;&#x4EF6;&#x5939;

<span class="hljs-section">feat:       Kaldi &#x76F8;&#x5173;&#x7684;&#x7279;&#x5F81;&#x63D0;&#x53D6;&#x7B97;&#x6CD5;&#x76EE;&#x5F55;

<span class="hljs-section">featbin:    Kaldi &#x76F8;&#x5173;&#x7684;&#x7279;&#x5F81;&#x63D0;&#x53D6;&#x53EF;&#x6267;&#x884C;&#x76EE;&#x5F55;

<span class="hljs-section">gmm:        Kaldi &#x76F8;&#x5173;&#x7684; GMM &#x7B97;&#x6CD5;&#x57FA;&#x7840;&#x76EE;&#x5F55;

<span class="hljs-section">gmmbin:     Kaldi &#x76F8;&#x5173;&#x7684; GMM &#x7B97;&#x6CD5;&#x53EF;&#x6267;&#x884C;&#x6587;&#x4EF6;&#x76EE;&#x5F55;

<span class="hljs-section">ivector:    Kaldi &#x76F8;&#x5173;&#x7684; ivector &#x7B97;&#x6CD5;&#x57FA;&#x7840;&#x76EE;&#x5F55;

<span class="hljs-section">ivectorbin: Kaldi &#x76F8;&#x5173;&#x7684; ivector &#x7B97;&#x6CD5;&#x7684;&#x53EF;&#x6267;&#x884C;&#x76EE;&#x5F55;&#xFF0C;&#x4EE5;&#x53CA;&#x57FA;&#x4E8E;&#x80FD;&#x91CF;&#x7684; vad &#x6267;&#x884C;&#x76EE;&#x5F55;&#x3002;

<span class="hljs-section">kws:        Kaldi &#x76F8;&#x5173;&#x7684;&#x5173;&#x952E;&#x5B57;&#x641C;&#x7D22;&#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x76EE;&#x5F55;

<span class="hljs-section">kwsbin:     Kaldi &#x76F8;&#x5173;&#x7684;&#x5173;&#x952E;&#x5B57;&#x641C;&#x7D22;&#x6267;&#x884C;&#x76EE;&#x5F55;

<span class="hljs-section">lat:        Kaldi &#x76F8;&#x5173;&#x7684;&#x7F51;&#x683C;&#x751F;&#x6210;&#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x76EE;&#x5F55;

<span class="hljs-section">latbin:     Kaldi &#x76F8;&#x5173;&#x7684;&#x7F51;&#x683C;&#x751F;&#x6210;&#x7B97;&#x6CD5;&#x7684;&#x53EF;&#x6267;&#x884C;&#x6587;&#x4EF6;&#x76EE;&#x5F55;

<span class="hljs-section">lm:         Kaldi &#x81EA;&#x5E26;&#x7684;&#x8BED;&#x8A00;&#x6A21;&#x578B;&#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x76EE;&#x5F55;

<span class="hljs-section">lmbin:      Kaldi &#x76F8;&#x5173;&#x8BED;&#x97F3;&#x6A21;&#x578B;&#x7684;&#x53EF;&#x6267;&#x884C;&#x6587;&#x4EF6;&#x76EE;&#x5F55;

<span class="hljs-section">nnet:       Kaldi &#x76F8;&#x5173;&#x7684; nnet1 &#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x5B9E;&#x73B0;&#x76EE;&#x5F55;

<span class="hljs-section">nnetbin:    Kaldi nnet1&#x76F8;&#x5173;&#x7684;&#x7B97;&#x6CD5;&#x53EF;&#x6267;&#x884C;&#x6587;&#x4EF6;&#x76EE;&#x5F55;

<span class="hljs-section">nnet2:      Kaldi nnet2 &#x76F8;&#x5173;&#x7684;&#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x5B9E;&#x73B0;&#x76EE;&#x5F55;

<span class="hljs-section">nnet2bin:   Kaldi nnet2 &#x76F8;&#x5173;&#x7684;&#x7B97;&#x6CD5;&#x53EF;&#x6267;&#x884C;&#x6587;&#x4EF6;&#x76EE;&#x5F55;

<span class="hljs-section">nnet3:      Kaldi nnet3 &#x76F8;&#x5173;&#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x5B9E;&#x73B0;&#x76EE;&#x5F55;

<span class="hljs-section">nnet3bin:   Kaldi nnet3 &#x76F8;&#x5173;&#x5B9E;&#x73B0;&#x7B97;&#x6CD5;&#x7684;&#x53EF;&#x6267;&#x884C;&#x6587;&#x4EF6;&#x76EE;&#x5F55;

<span class="hljs-section">online:     Kaldi online1 &#x76F8;&#x5173;&#x89E3;&#x7801;&#x7B97;&#x6CD5;&#x7684;&#x5B9E;&#x73B0;&#x76EE;&#x5F55;

<span class="hljs-section">onlinebin:  Kaldi online1 &#x76F8;&#x5173;&#x89E3;&#x7801;&#x5668;&#x7B97;&#x6CD5;&#x7684;&#x53EF;&#x6267;&#x884C;&#x76EE;&#x5F55;

<span class="hljs-section">online2:    Kaldi online2 &#x76F8;&#x5173;&#x89E3;&#x7801;&#x5668;&#x7B97;&#x6CD5;&#x7684;&#x5B9E;&#x73B0;&#x76EE;&#x5F55;

<span class="hljs-section">online2bin: Kaldi online2 &#x76F8;&#x5173;&#x89E3;&#x7801;&#x5668;&#x7B97;&#x6CD5;&#x7684;&#x53EF;&#x6267;&#x884C;&#x76EE;&#x5F55;

<span class="hljs-section">rnnlm:      Kaldi rnnlm &#x76F8;&#x5173;&#x7684;&#x8BED;&#x97F3;&#x6A21;&#x578B;&#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x5B9E;&#x73B0;&#x76EE;&#x5F55;

<span class="hljs-section">rnnlmbin:   Kaldi rnnlm &#x76F8;&#x5173;&#x7684;&#x8BED;&#x97F3;&#x6A21;&#x578B;&#x7684;&#x53EF;&#x6267;&#x884C;&#x76EE;&#x5F55;

<span class="hljs-section">sgmm2:      Kaldi sgmm2 &#x76F8;&#x5173;&#x7684;&#x5B50;&#x7A7A;&#x95F4; GMM &#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x5B9E;&#x73B0;&#x76EE;&#x5F55;

<span class="hljs-section">sgmm2bin:   Kaldi sgmm2 &#x76F8;&#x5173;&#x7684;&#x5B50;&#x7A7A;&#x95F4; GMM &#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x53EF;&#x6267;&#x884C;&#x76EE;&#x5F55;

<span class="hljs-section">tfrnnlm:    Kaldi &#x76F8;&#x5173;&#x7684; Tensorflow rnnlm &#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x76EE;&#x5F55;

<span class="hljs-section">tfrnnlmbin: Kaldi &#x76F8;&#x5173;&#x7684; Tensorflow rnnlm &#x57FA;&#x7840;&#x7B97;&#x6CD5;&#x5B9E;&#x73B0;&#x7684;&#x53EF;&#x6267;&#x884C;&#x76EE;&#x5F55;
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

Kaldi Egs Aishell 例子黑箱运行

本节的目的在于,让读者在不了解 Kaldi 语音识别相关的算法的情况下,能过顺利运行 Aishell 的例子,并顺利获得语音识别模型。

首先需要有几个注意点:

  • 如果需要运行神经网络相关的算法,确保机器拥有 GPU 运算能力。
  • 确保以上 Kaldi 编译成功。
  • 如果网络下载速度有限,请离线下载相关数据集。
  • 确定运行代码机器内存和硬盘大小。

本例子完全运行需要硬盘资源为 76G,所以需要确定硬盘是否有足够的空间。

Aishell 例子运行

为了能过顺利黑箱运行 Aishell 语音识别的例子。需要对 /opt/kaldi/egs/Aishell/s5 中的 run.sh 脚本进行几点修改。

假设 Aishell 的语音数据已经全部下载,目录存放于 /newdata/corpus/Aishell , 那么对应的 run.sh 脚本修改如下:

Kaldi 语音识别基础教程

同时,由于我们的数据集已经下载,故需要注释掉与 Aishell 数据相关的下载脚本,修改如下:

Kaldi 语音识别基础教程

由于大家机器、内存和 CPU 数量的不同,在部分脚本相对应的运行进程上也要进行部分修改,这里需要大家根据自己实际机器情况。假设运行的机器为 16G 内存,run.sh 脚本修改为,vim 打开 run.sh ,进入命令模式:

<span class="hljs-symbol">:%s/--nj <span class="hljs-number">10/--nj <span class="hljs-number">5/g
</span></span></span>

同时,需要修改 local/nnet3/run_ivector_common.sh 该脚本中对应的 nj 个数,修改方法如上一步。

注意: 由于在运行神经网络计算之前会进行 ivector 计算,因此需要根据运行机器的内存情况进行重新设置。这里建议:如果运行机器内存不到32G,在此例子中 ivector 的 nj 个数设置为 1,对应之上脚本的 118 行。

最后,需要注意,如果需要进行神经网络相关训练操作,需要对 local/chain/run_tdnn.sh 进行修改,修改操作为将 num_jobs_initialnum_jobs_final 统一修改成该训练机器所对应的 GPU 个数。修改如下图:

Kaldi 语音识别基础教程

最后,回到 run.sh 的目录中,使用命令:

<span class="hljs-selector-tag">nohup <span class="hljs-selector-tag">sh <span class="hljs-selector-tag">run<span class="hljs-selector-class">.sh &
</span></span></span></span>

确保 run.sh 能够在后台运行。直至出现错误或者运行成功自动结束。

运行结束之后,我们可以在 exp 目录下的对应目录下找到对应的错误率,以及识别结果。例如,使用 chain 来构建的神经网络,目录位置如下:

exp<span class="hljs-regexp">/chain/tdnn_1a_sp/
</span>

目录中存放的解码所需要的大部分信息。

如何在黑箱情况下,使用独立语音进行模型模型构建

本节假设读者已经成功运行上一节黑箱的例子,相信大家做语音识别的初衷亦或者兴趣点在于如何使用自己的语音训练模型,那么本节的主要目的就在于告诉大家如何在 Aishell 的基础上,使用自己的语音构建模型。

学习本节,读者依旧不需要了解任何的 Kaldi 语音识别相关内容。此时,读者可能会有疑问,既然是黑箱,那如何能够使用独立语音训练集训练出自己的模型呢?

其实很简单,我们这里有两种方法提供给大家:

方法一: 我们只需要模仿 Aishell 的数据存放规律进行存放即可。

方法二: 如果我们现有的独立数据集有自己的规律存放,那么只需要修改针对性的修改 run.sh 中的两个脚本即可。

方法一这里不做详细说明,大家根据上一节使用的 Aishell 的数据方式模仿存储即可。这里针对方法二进行示范。

再次回到 run.sh 脚本中,我们可以发现,Aishell 的数据处理逻辑主要存在于两个子脚本中。他们分别为如图所示:

Kaldi 语音识别基础教程

这两个脚本即是我们需要修改的数据处理脚本。

首先看第一个脚本: local/Aishell_prepare_dict.sh,此脚本的作用在于处理 Aishell 语音数据集所包含的发音字典信息。由于我们使用的是我们自己的独立数据集合,因此,我们需要通过我们自己的独立语音数据集获取相对应的发音词典。对应于 Aishell 数据集中的 lexicon.txt 文件。

第二步:修改 local/Aishell_data_prep.sh 脚本。该脚本主要是用来读取训练数据集、验证集以及测试集相对应的语音和语音相对应文本的对应关系。

由于第一步只需要进行匹配和人工标注,这里不多赘述。这里简单说明一下第二部分如何修改。

假设我们的语音数据集的分布为如图所示:

Kaldi 语音识别基础教程

同时,我们可以通过 Aishell 的数据,看出数据存放格式如下图所示:

Kaldi 语音识别基础教程

那么,我们只需要将我们的数据集中 session 文件夹去除掉,亦或者修改脚本中如下图所示的代码即可:

Kaldi 语音识别基础教程

只需要将 49 行的 NF-1 修改为 NF-2 即可。 这样就可以顺利运行我们自己的独立语音数据集合。

总结

本章主要介绍了 Kaldi 相关的 Docker 基础操作,并介绍了如何正确安装 Kaldi 以及 Kaldi 相关的目录结构,之后介绍了黑盒运行 Aishell 的例子,最后简单介绍了如何修改脚本来运行自己的独立语音数据集。

本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。

Original: https://www.cnblogs.com/zhwl/p/12666581.html
Author: 郑文亮
Title: Kaldi 语音识别基础教程

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/546238/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL通配符与正则表达式

    通配符 通配符必须全文匹配时才为真,使用 LIKE关键字 字符 示例 含义 _ “a_b” 任意一个字符”axb”,其中x可以使任意…

    技术杂谈 2023年7月25日
    058
  • 【数据结构】11.java源码关于TreeMap

    目录 1.TreehMap的内部结构2.TreehMap构造函数3.元素新增策略4.元素删除5.元素修改和查找6.特殊操作7.扩容8.总结 1.TreeMap的内部结构 首先确认一…

    技术杂谈 2023年7月24日
    089
  • [报错]-RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.cuda.FloatTensor) should be the same

    RuntimeError: Input type (torch.cuda.HalfTensor) and weight type (torch.cuda.FloatTensor) …

    技术杂谈 2023年7月10日
    0132
  • 你被离职员工投诉过吗?

    同学你好,很高兴你对团队表达的问题,面对你所提问题我觉得还是有必要作下回答。 首先我个人认为你所描述 确实是开发部 某个期间 的状态,公司其他部门或多或少都有这些现象。 但我当然不…

    技术杂谈 2023年6月1日
    082
  • CAIL2021-阅读理解任务-top3-数据预处理模块

    class SquadExample(object): """ A single training/test example for the Squa…

    技术杂谈 2023年6月1日
    0118
  • Tomcat性能优化方案

    你使用过tomcat的话,简单的说就是”内存溢出”. 通常情况下,这种问题出现在实际的生产环境中.产生这种问题的原因是tomcat使用较少的内存给进程,通过…

    技术杂谈 2023年7月11日
    048
  • Python中import外部模块全局变量修改规则及踩坑

    最近碰到一个import外部文件全局变量修改后未符合预期效果的问题,简要描述如下: 有env.py, test.py, dal.py三个文件,env.py 中定义了DEBUG=Fa…

    技术杂谈 2023年6月21日
    089
  • STORAGE_BUS_TYPE BusType; //找不到

    STORAGE_BUS_TYPE BusType; C:\Program Files (x86)\Windows Kits\8.1\Include\um C:\Program Fi…

    技术杂谈 2023年5月31日
    092
  • caching_sha2_password‘ cannot be loaded问题解决

    在mac上安装 8.0.19版本的mysql后,使用navicat连接时,报caching_sha2_password’ cannot be loaded的异常。 原因…

    技术杂谈 2023年5月30日
    0112
  • k8s (kubenetes)集成runner

    k8s (kubenetes)集成runner unregisterRunners:true—这个很重要,记得设置true,否则容易出现多个没用的runner&#821…

    技术杂谈 2023年6月1日
    087
  • 巧用Prometheus来扩展kubernetes调度器

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月25日
    075
  • 快速排序及优化

    快速排序 每次从当前考虑的数组中选一个元素,把这个元素想办法挪到应该排好序的位置,比如 4这个元素,它就有一个性质 4之前的元素都是小于它的,之后的元素都是大于它的,之后我们要做的…

    技术杂谈 2023年7月23日
    079
  • MySQL InnoDB缓存

    1. 背景 对于各种用户数据、索引数据等各种数据都是需要持久化存储到磁盘,然后以”页”为单位进行读写。 相对于直接读写缓存,磁盘IO的成本相当高昂。 对于读…

    技术杂谈 2023年6月21日
    094
  • PWN学习总结

    一、栈溢出原理 什么是栈溢出?栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分…

    技术杂谈 2023年7月11日
    065
  • MySQL随笔1

    MySQL随笔 ​ 国庆期间花一点时间刷了牛客和力扣的MySQL入门,两个网站的题目各有各的特色。不过最大的感触就是牛客的SQL题你都可以做,但力扣就只给你SQL入门里的题,其他专…

    技术杂谈 2023年7月11日
    090
  • 8086汇编 中断

    8086汇编 中断 中断:CPU不再接着(刚执行完的指令)向下执行,而是转去处理中断信息。 内中断:由CPU内部发生的事件而引起的中断 外中断:由外部设备发生的事件引起的中断 80…

    技术杂谈 2023年6月1日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球