Advertisement

ubuntu16.04安装Kaldi+运行测试TIMIT

阅读量:

kaldi 安装

在Ubuntu 16.04系统上已成功完成NVIDIA CUDA 8.0版本的安装。建议访问官方文档Ubuntu 16.04+Asus Z170-GPU图形卡搭建TensorFlow-GPU以获取详细的安装说明。该文档全面介绍了CUDA 8.0版本的操作步骤与注意事项。通过使用NVIDIA CUDA平台能够显著提升深度神经网络(DNN)声学模型的训练与解码效率。下面将详细介绍Kaldi系统的安装流程,请注意以下几点:

  1. 环境配置
  2. 下载Kaldi安装包
  3. 编译Kaldi
  4. 运行测试

环境配置

确保kaldi编译过程依赖de工具包,并且需要先更新源代码库,请按照以下步骤输入相应的命令。

复制代码
    $ sudo apt-get install autoconf automake libtool subversion libatlas-dev libatlas-base-dev zlib1g-dev gawk git gfortran gcc g++

在安装Ubuntu时末尾的两个编译器通常是预先配置好的。当安装Ubuntu 16.04时,默认情况下使用的gcc版本达到5.0以上,并支持通过Kaldi依赖构建一系列工具包:包括ATLAS、OpenFst、SCTK以及sph2pipe。

下载Kaldi安装包

已不再在Kashi 官方站点发布最新版本 因此建议访问GitHub 仓库下载kashi-master 压缩包 并进行本地解压 也可通过以下方式操作 比如运行相应的安装脚本

复制代码
    $ git clone https://github.com/kaldi-asr/kaldi

kaldi下有这样三个核心组件分别是src、tools和egs。其中src目录存储了Kaldi的所有源代码,并且其中包括MFCC、PLP特征提取、GMM、DNN(nnet)、HMM以及解码器等技术。在未编译状态下,默认情况下这些都是用于安装和编译工具包的脚本。egs目录则存储了大量的标准语音数据集以及相应的运行脚本

编译Kaldi

Kaldi每个文件中的INATALL文件都包含安装指南信息,并且按照指导步骤操作不会产生问题。

首先进入tools文件夹并运行完成的脚本以检查第一步环境配置是否正确

复制代码
    $ cd tools/
    $ extras/check_dependencies.sh

当遇到该行指示时,请启动编译tools文件夹的流程;若未遇到,则按照指示配置tools所需的必要组件。

复制代码
    extras/check_dependencies.sh: all OK.

编译过程中会自动下载、安装、编译ATLAS, OpenFst, SCTK and sph2pipe。

复制代码
    $ sudo make

该软件库集成了一系列线性代数运算功能,
而 OpenFst 则是一个专门处理有限状态自动机的应用程序包,
它主要用于实现音频文件格式转换。
经过测试发现,
ATLAS, SCTK 和 sph2pipe 通常能顺利完成安装,
然而 OpenFst 的安装过程可能会存在问题。
为了避免手动编译复杂程序 OpenFst 的情况,
可以直接进入 src 目录进行编译操作。
系统会自动生成检查指令来验证 OpenFst 是否成功编译。
如果遇到无法正常安装的情况无需过于担心,
因为 tools 目录中已经预装了 OpenFst 的二进制执行文件。
完成以上步骤后,
只需要运行相应的命令就可以顺利启动应用。

复制代码
    $ cd openfst-1.6.2
    $ ./configure
    $ sudo make
    $ sudo make install
  1. 所有编译流程运行缓慢;若机器配置为多核,则可采用make -j指令加快速度。
  2. 进行编译操作于src文件;
    输入相应的命令以确认所有依赖工具包均已安装;一旦确认所有依赖工具包均已安装,则会生成相应的配置界面图示。
复制代码
    $ ./configure --shared
复制代码
    Configuring ...
    Backing up kaldi.mk to kaldi.mk.bak ...
    Checking compiler g++ ...
    Checking OpenFst library in /home/haoran/kaldi-master/tools/openfst ...
    Doing OS specific configurations ...
    On Linux: Checking for linear algebra header files ...
    Using ATLAS as the linear algebra library.
    Successfully configured for Debian/Ubuntu Linux [dynamic libraries] with ATLASLIBS =/usr/lib/libatlas.so.3  /usr/lib/libf77blas.so.3 /usr/lib/libcblas.so.3  /usr/lib/liblapack_atlas.so.3
    Using CUDA toolkit /usr/local/cuda (nvcc compiler and runtime libraries)
    Info: configuring Kaldi not to link with Speex (don't worry, it's only needed if you
    intend to use 'compress-uncompress-speex', which is very unlikely)
    SUCCESS
    To compile: make clean -j; make depend -j; make -j
     ... or e.g. -j 10, instead of -j, to use a specified number of CPUs

如果缺少某个工具包,则可以在tools目录下查找对应的工具包并进行手动编译。通过以上信息可以看出,Kaldi系统已自行检测确认硬件设备已安装了cuDNN库。接下来将开始编译src文件,预计耗时较长,请保持耐心。

复制代码
    $ sudo make depend
    $ sudo make

运行测试

该工具包在egs目录下提供了名为yesno的数据集,可被用来简便测试Kaldi是否安装成功。该数据集的具体应用包括:运行位于egs/yesno/s5/run.sh的运行脚本,并通过该脚本完成以下操作:下载所需数据集、训练单音节声学模型以及执行解码测试。

复制代码
    $ cd egs/yesno/s5
    $ sudo ./run.sh

如果编译成功,会看到最后一行测试结果显示:

复制代码
    %WER 0.00 [ 0 / 232, 0 ins, 0 del, 0 sub ] exp/mono0a/decode_test_yesno/wer_10

安装irstlm(optional)

irstlm是一个语言模型工具包,并非所有公开可用的数据集都需要使用它。对于像TIMIT这样的特定项目来说,则需要使用到irstlm工具包。因此不妨自行安装一下吧!安装完成后,在HOME/.local/bin中运行./install_irstlm.sh即可完成安装操作。安装成功后,在指定目录下将会生成irstlim文件夹。需要注意的是,在timit例程中引用了位于tools目录中的irstlm工具,请将该目录移动至tools/文件夹下以便调用。与此同时,请将位于HOME/.local/bin/extras/env.sh的路径配置文件也复制至tools目录。


运行TIMIT

百度了一下TMIT语音库的介绍:

TIMIT全称The DARPA TIMIT Acoustic-Phonetic Continuous Speech Corpus, 是由德州仪器(TI)、麻省理工学院(MIT)和坦福研究院(SRI)合作构建的声学-音素连续语音语料库。TIMIT数据集的语音采样频率为16kHz,一共包含6300个句子,由来自美国八个主要方言地区的630个人每人说出给定的10个句子,所有的句子都在音素级别(phone level)上进行了手动分割,标记。
TIMIT语料库多年来已经成为语音识别社区的一个标准数据库,在今天仍被广为使用。其原因主要有两个方面:数据集中的每一个句子都在音素级别上进行了手动标记,同时提供了说话人的编号,性别,方言种类等多种信息;数据集相对来说比较小,可以在较短的时间内完成整个实验;同时又足以展现系统的性能。

这个语音库是否为开源项目?不得随意传播。我从实验室获取了这一资源也不便随意外传。
TIMIT数据集分为训练集和测试集两大类将训练集和测试集分别放置于/egs/timit/data目录下即可完成基本配置。
s5目录中包含三个核心脚本:cmd.sh、path.sh以及run.sh文件。
针对本地运行(不依赖集群)的情况修改cmd.sh脚本以实现基本的工作流程。
home/egs/timit/s5目录中创建./config directory并复制以下内容到其中: ./config/speakers.conf中添加新条目 ./configphones.conf中添加所需手机品牌信息 随后进入home/egs/timit/s5目录创建phonebook表并执行相关操作。
最后执行./bin/shell/s5 train命令启动训练过程。

复制代码
    # run it locally
    export train_cmd=run.pl
    export decode_cmd=run.pl
    export cuda_cmd=run.pl
    export mkgraph_cmd=run.pl

然后path.sh用来定义各种工具包的路径。修改path.sh如下:

复制代码
    export KALDI_ROOT=`pwd`/../../..
    [ -f $KALDI_ROOT/tools/env.sh ] && . $KALDI_ROOT/tools/env.sh
    #export PATH=$PWD/utils/:$KALDI_ROOT/tools/openfst/bin:$KALDI_ROOT/tools/irstlm/bin/:$PWD:$PATH
    export PATH=$PWD/utils/:$KALDI_ROOT/src/bin:$KALDI_ROOT/tools/openfst/bin:$KALDI_ROOT/tools/irstlm/bin/:$KALDI_ROOT/src/fstbin/:$KALDI_ROOT/src/gmmbin/:$KALDI_ROOT/src/featbin/:$KALDI_ROOT/src/lm/:$KALDI_ROOT/src/sgmmbin/:$KALDI_ROOT/src/sgmm2bin/:$KALDI_ROOT/src/fgmmbin/:$KALDI_ROOT/src/latbin/:$KALDI_ROOT/src/nnetbin:$KALDI_ROOT/src/nnet2bin/:$KALDI_ROOT/src/kwsbin:$PWD:$PATH
    [ ! -f $KALDI_ROOT/tools/config/common_path.sh ] && echo >&2 "The standard file $KALDI_ROOT/tools/config/common_path.sh is not present -> Exit!" && exit 1
    . $KALDI_ROOT/tools/config/common_path.sh
    export LC_ALL=C
    export IRSTLM=$KALDI_ROOT/tools/irstlm
    export LD_LIBRARY_PATH=$KALDI_ROOT/tools/openfst/lib:$LD_LIBRARY_PATH

最终版本run.py是一个包含多个阶段任务的完整脚本文件(如读取数据集、构建发音字典、特征提取以及声学模型训练等),其中声学模型训练过程涵盖了单音节模式识别、双音节模式识别以及三音节模式识别等多种类型(如SGMM2和DNN等)。此外该脚本还实现了语音解码功能,并最终输出各声学模型的识别准确率统计结果。
运行该脚本前需要确保TIMIT数据目录路径正确配置(必须提供绝对路径)。

复制代码
    timit=/home/XXX/kaldi-master/egs/timit/data # @local

在我的版本库中,在run.sh脚本中涉及的SGMM2训练与解码过程未被注释掉导致该过程在此处立即终止,请各位小伙伴及时检查并修复该问题。

复制代码
    $ sudo ./run.sh

在此处我选择了MonoPhone,并同时包括以下几种技术方案: tri1基于Deltas与Delta-Deltas的结合; tri2采用LDA与MLLT的融合; tri3则在LDA与MLLT的基础上加入了SAT;此外还包含了DNN Hybrid模型来进行测试

复制代码
    %WER 32.5 | 192 7215 | 70.3 19.4 10.3 2.7 32.5 100.0 | -0.254 | exp/mono/decode_test/score_6/ctm_39phn.filt.sys
    %WER 25.9 | 192 7215 | 77.9 16.8 5.3 3.8 25.9 100.0 | -0.123 | exp/tri1/decode_test/score_10/ctm_39phn.filt.sys
    %WER 24.0 | 192 7215 | 79.7 14.9 5.4 3.7 24.0 99.5 | -0.246 | exp/tri2/decode_test/score_10/ctm_39phn.filt.sys
    %WER 21.4 | 192 7215 | 81.6 13.5 4.9 2.9 21.4 98.4 | -0.583 | exp/tri3/decode_test/score_10/ctm_39phn.filt.sys
    %WER 23.6 | 192 7215 | 79.7 15.3 5.1 3.3 23.6 99.5 | -0.305 | exp/tri3/decode_test.si/score_9/ctm_39phn.filt.sys
    %WER 18.4 | 192 7215 | 84.1 11.1 4.7 2.6 18.4 99.0 | -0.871 | exp/dnn4_pretrain-dbn_dnn/decode_test/score_5/ctm_39phn.filt.sys
    %WER 18.4 | 192 7215 | 84.3 11.1 4.5 2.7 18.4 98.4 | -0.873 | exp/dnn4_pretrain-dbn_dnn_smbr/decode_test_it1/score_5/ctm_39phn.filt.sys
    %WER 18.5 | 192 7215 | 84.3 11.4 4.4 2.8 18.5 99.0 | -0.509 | exp/dnn4_pretrain-dbn_dnn_smbr/decode_test_it6/score_7/ctm_39phn.filt.sys

在有GPU加速的情况下,DNN模型训练一共花费了50min。


完成了Kaldi的安装以及TIMIT系统的测试。接下来的重点将是深入研究TIMIT运行脚本和训练过程中的源代码。如有兴趣的朋友可以留意我的博客更新。之前已经接触过语音识别技术的基础知识。而令我印象深刻的是通过将加权有限自动机与声学模型、发音词典及语言模型相结合的研究工作令人叹为观止。


参考文献

<> 和 <>

全部评论 (0)

还没有任何评论哟~