在kaldi工具包使用小数字语料库创建一个简单的ASR系统(番外篇)

来源:互联网 发布:淘宝c店已经死了 编辑:程序博客网 时间:2024/06/05 14:05
相信很多人已经看过kaldi英文官网上关于该系统的搭建流程。虽然官方已经写的很通俗易懂,但是第一次接触的话还是不可避免的会碰到许多坑。恰巧最近实践了一下,把整个实践过程写了下来。一是方便自己后续回顾本次实验,避免以后碰到类似问题还得重复造轮子,做无用功。二是希望将官网的搭建指引写的更通俗易懂些,降低新手学习的门槛。

官方搭建指南传送门:Kaldi for Dummies tutorial

本系统的搭建意义:使用自己录制的语料库搭建一个简单的ASR系统,整个系统一共包含0到9共十个英文数字,系统搭建完成后可进行简单的孤立词识别(仅限数字0到9)。系统虽小,但五脏俱全,是入门理解如何利用kaldi搭建语音系统的好例子。


因为官方教程已经说的很详细了,所以这里只讲一些作为新手去实践这个tutorial时需要额外注意的地方。

一,预前准备:
  • SRILM的安装:SRILM是一个语言模型工具包,没有它你就无法生成自己的语言模型,也就无法搭建自己的ASR系统(因为语言模型,声学模型,词典是传统的ASR系统的必要组成部分,缺一不可)这个安装很重要,很多新手容易败在这一关。而官方搭建指南里只用了如下一段话概述安装流程,并且放在了快要工程定稿的部分:
    SRILM installationYou also need to install language modelling toolkit that is used in my example - SRI Language Modeling Toolkit (SRILM).TaskFor detailed installation instructions go to kaldi-trunk/tools/install_srilm.sh (read all comments inside).
如果你是选择用./install_srilm.sh文件来执行srilm的相关安装操作,你的终端最终会反馈给你这些信息:
Installation of SRILM finished successfully,Please source the tools/env.sh in your path.sh to enable it
如果你忽略后面那句”Installation of SRILM finished successfully,Please source the tools/env.sh in your path.sh to enable it",
你的工程很有可能就无法再进行下去,在新工程里搭建语言模型时依然会报出“SRILM工具箱可能没有安装”的提示,就算你运行env.sh来添加环境路径也无济于事。
  当然了,因为我也是新手,存在很多知识漏洞和不足的地方,如果有哪位大佬能教我怎么把官方给的方法work起来,我将非常感谢!!

综上所述,我最终没有选择使用install_srilm.sh来安装srilm。简单介绍下我后来采取的安装小偏方:

1,在安装SRILM前先安装tcl。tcl是可嵌入式脚本语言,用于脚本编程和测试。首先下载tcl8.6.6-src.tar.gz (自行网上搜寻下载),解压到kaldi/tools文件夹下,然后分三步:
cd kaldi/tools/tcl/unix./configuremakesudo make installmake test
          
2,打开srilm/Makefile文件,在第7行加入SRILM=&(PWD),用于指定工具的路径。如果是64位的操作系统,还需要进入srilm/common目录中,修改Makefile.machine.i686-m64文件,在第54行左右找到:
 TCL_INCLUDE =  TCL_LIBRARY = NO_TCL = 1
将其修改为:
 TCL_INCLUDE =  TCL_LIBRARY = NO_TCL = X

再找到倒数第5行:
GAWK = /usr/bin/awk
修改为:
GAWK = /usr/bin/gawk

然后编译SRILM,即在kaldi/tools/srilm目录下输入:
make World

3,在终端添加环境变量,这个跟自己的安装路径有关(直接在终端交互窗口输入,需要根据自己实际的文件名和路径按以前格式修改命令):
export PATH=/home/{user}/kaldi-trunk/tools/srilm-1.7.1/bin/:/home/{user}/kaldi-trunk/tools/srilm-1.7.1/bin:$PATH
然后在该目录下进行测试:
make test
如果终端显示很多类似stderr output IDENTICAL的字样,就说明测试成功了。

二,数据准备:
按照官方指引一步步进行音频数据,声学数据,语言数据的准备。其中 wav.scp / utt2spk /test等为映射文件,在一般的工程里由脚本文件或者其他编程方法(如python /  bash / matlab / c++等)自动生成,但考虑到我们这里自建的ASR系统很小,可直接新建空文本文档,再按照官方指南中指定的格式手动组织编写。

有个特别需要注意的地方,就是编写wav.scp / utt2spk /test等映像文件完成后记得按字母大小写顺序排序。如果是用gedit的插件排序方式,需要注意其排序后会在文件底部自动添加空行,如不删除空行会报error: Bad line,所以每次在gedit里排序后记得删除底部空行。 否则会因为映射文件为乱序文件进而导致mono training环节出现报error。

映射文件的编写需要格外细心,比如不要将文件名text写成test,注意数据集和训练集的映射路径上的细微不同等,否则会出现各种奇奇怪怪的错误(如找不到用于指向提取好的特征的feats.scp文件)。不过一般查log文件也能解决。

三,工程定稿:
参官网指南。

四,运行脚本:
编写cmd.sh / path.sh / run.sh文件。关于脚本的编写细节请参考官网指南,需要注意的是run.sh编写完毕后记得赋予其可执行权限:
chmod 777 run.sh

运行run.sh,通过wer错误率结果衡量系统性能:



从图中可以看出,一共解码了11次,每次错误率为7.41%。27个单词中包含两个识别错误:一个删除错误,一个替换错误。这里之所以错误率相对较低,是因为该语料(包含训练和测试集)只采集了我一个人的声音文件,所以在未进行说话人自适应情况下依然能够达到不错的错误率。下面是按照标准流程采集了10个人的音频文件进行系统的训练和搭建的评测结果。
mono (单音素) 解码:



三音素(tri)解码:


显然,当使用包含非特定人音频文件的语料库训练系统时,错误率明显变高。这是因为该系统并未进行说话人适应训练。

这里碰到一件比较吊诡的事,就是我的单音素训练解码后的错误率比三音素训练解码后的错误率还要低。按照我的理解,就算是孤立词的识别,每个孤立词应该也能拆分为好几个音素,那么这几个音素之间就会存在协同发音效应,也就是说即使在孤立词识别里,考虑了上下音素关联的三音素模型理论上还是要比单音素模型要好。而这里的结果恰好相反,如果有大佬能够解答我这个疑问,感激不尽。





阅读全文
1 0