1 Kaldi简介
Kaldi是一个开源的语音识别工具,整合了HTK的基本功能,同时也加入了深度神经网络的分类器(DNN)。可实现与文本无关的LVCSR系统,基于FST的训练与解码,支持多种标准的机器学习训练模型。
Kaldi相关文档可参考官网:http://www.kaldi-asr.org/
Kaldi内核采用c++语言编写,易于修改和扩展。有如下重要特点:
Ø 有限状态转换器(FSTs)的Code-level集成;
Ø 广泛的线性代数支持,矩阵函数库中包含标准BLAS和LAPACK运算;
Ø 可扩展性设计,算法采用最通用形式;
Ø 开源,Apache2.0许可,支持修改和重新发布;
Ø 包含语音识别系统搭建的完整框架,从LDC等数据库可以直接工作。
需要明确的是Kaldi的目标受众是专业的语音识别研究人员或有一定基础的自学者。短期内,Kaldi的文档中不会出现像HTK那么多关于统计语音识别的介绍性资料。
Kaldi的其他特点:
Ø 强调通用算法和通用框架;
Ø 算法正确性,不会出现突发性fail;
Ø 代码完全测试过;
Ø 保持功能简单,每个命令行实现有限的功能;
Ø 代码易于理解;
Ø 代码易于复用和重构。
2 系统要求
2.1 最理想的计算环境
使用Sun Grid Engine 的linux机器集群,通过NFS或类似的网络文件系统访问共享目录。网络上的计算机采用NVidia的GPU,用于神经网络训练。
SunGrid Engine(现在叫做OracleGird Engine)是一套开源的分布式资源管理软件,用来统一管理和利用所有(愿意被管理的)电脑上的资源,使得这些电脑(集群)使用起来就像一台电脑一样,好处是可以随意扩展总的计算资源(买更多的电脑加入集群),并且管理上就像使用一台电脑一样方便。使用者只需要把需要计算的工作准备好,提交到Sun Grid Engine (SGE),SGE就会根据已经订好的管理策略以及使用者的需求在集群里找到合适的电脑来完成计算工作。SGE主要用在高性能计算、网格计算等领域。
2.2 最低条件的计算环境
任何Unix-like环境,可以运行在单个机器,但是这样会比较慢,并且要尽量减少机器上运行的其他程序,避免内存耗尽。Kaldi在Debian(开源)和RedHat(商业)环境测试结果最好,但是也可以运行在任何linux分布的环境,或者Cygwin/MacOs X环境。
2.3 建议新手使用Ubuntu系统
下面简述Win7和Ubuntu14.04的64位双系统安装方法,并设置从Win7引导Ubuntu,这样删除Ubuntu系统时不影响Win7正常使用。(建议使用Ubuntu14.04版本,不建议更新版本,可能会出现兼容性问题)
步骤一:硬盘划分出空白空间。
右键我的电脑 —> 管理—> 点击“磁盘管理”—> 选择一个磁盘—>右键选择压缩卷—>设置压缩空间量—>压缩。压缩后的磁盘变成未分配空间,这部分用于ubuntu系统安装。
步骤二:用UltraISO刻录Ubuntu镜像文件到U盘。
打开UltraISO软件,在上方选择“打开”—>找到本地的ubuntu14.04镜像文件—>打开;选择“启动”—>写入硬盘映像—>检查弹出窗口设置(按默认设置即可)—>写入。Ubuntu镜像文件官网下载慢,可以到这个网址下载:http://mirrors.xmu.edu.cn/ubuntu/releases/14.04/(32位ubuntu-14.04.4-server-i386.iso,64位ubuntu-14.04.4-desktop-amd64.iso)
步骤三:U盘安装Ubuntu
重启电脑,BIOS启动,设置U盘为优先启动盘并保存,开始安装Ubuntu,鼠标如果不能用,就用tab键和上下左右键选择,提示已安装win7时,选择“其他选项”。过程中需要自己进行分区(都选择逻辑分区):
Ø 引导分区: EXT4日志文件系统 挂载点/boot 200M足够了
Ø 系统分区:EXT4日志文件系统 挂载点/ 装系统和软件 分了15G
Ø 交换分区: swap无挂载点 类似windows的虚拟内存,一般分配不超过物理内存(也有说给物理内存两倍的,不知道信哪个……) 6G
Ø 个人文件分区:EXT4日志文件系统 挂载点/home 你想多大就多大,类似windows的“我的文档”,剩下的空间都给它了
Ø 安装启动引导器的设备中选择/boot所在分区编号,如/dev/sda5……(如果这步忽略了,就用Ubuntu系统来引导Windows了,会很麻烦。)
步骤四:
Ubuntu安装完毕后,重新启动计算机,进入bios选择从SSD启动,会发现并没有选择进入Ubuntu的启动项,而是直接进入到了Win7系统。用EasyBCD来创建启动系统选择项。add new entry, 选择linux/BSD,name这一行随便填写(如Ubuntu),Device这一行选择刚刚我们创建的”/boot“分区。再次重启,就有win7和Ubuntu两个系统入口了。
注意:
(1)这种双系统安装方法中,两个系统相互独立,开机时根据开机选项选择进入不同系统。在Win7里面不能直接查看Ubuntu里的分区,但是在Ubuntu可以访问放在硬盘上的任何东西,也就是可以直接查看Win7系统的分区。
(2)如果存储系统中同时有SSD和机械硬盘,win7装在SSD中,那么ubuntu系统的/boot分区一定也要放在在SSD中,否则无法引导实现双系统,因为启动时只能选择从一个盘启动。除了/boot分区之外的其他分区都可以放在硬盘中。
3 环境配置
Ubuntu安装完以后我们需要先安装一些必须的工具。官网列出的工具主要包括:
版本管理工具SVN,Git;
系统相关工具:autoconf,automake,libtool;
下载工具wget;
解压工具zlib;
脚本工具bash,perl,awk,grep和make;
编程工具gfortran,gcc,g++(注意gcc/gcc版本有要求,后面会详细说明)
3.1 常用工具包安装
linux下软件安装的方法通常有两种。
方法一:sudo apt-get install ***
方法二:官网下载(以zlib为例)
wgethttp://www.zlib.NET/zlib-1.2.8.tar.gz
tar -xvzfzlib-1.2.8.tar.gz
cd zlib-1.2.8
./configure
make
sudo makeinstall
注:能用系统的apt-getinstall的优先这么做,因为这样就不需要自己编译和配置环境变量了。当没法apt-get时,优先去Github上clone,一般Github上project对应的README或INSTALL里有详细的安装说明。当Github上也没有时载去官网下载。这里按第一种方法,在终端依次输入:
sudo apt-get update
sudo apt-get install libtool
sudo apt-get install subversion
sudo apt-get install git
sudo apt-get install autoconf
sudo apt-get install wget
sudo apt-get install perl
sudo apt-get installbuild-essential
sudo apt-get install gfortran
sudo apt-get install libatlas-dev
sudo apt-getinstall libatlas-base-dev
sudo apt-get install zlib1g-dev(中间是数字1)
也可以先忽略这些环境配置,直接安装Kaldi,根据错误提示安装相应工具。(但不建议)
3.2 配置gcc和g++版本
Kaldi自动编译时,需要配合gcc版本4.6,而Ubuntu14.04系统中默认安装的gcc/g++版本是4.8,所以需要重新配置一下版本。
(1)安装版本4.6
sudoapt-get install gcc-4.6
sudoapt-get install gcc-4.6-multilib
sudoapt-get install g++-4.6
sudoapt-get install g++-4.6-multilib
(2)选择当前版本为4.6
sudoupdate-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
sudoupdate-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 40
sudoupdate-alternatives --config gcc
手动选择gcc版本编号,输入1,即选择当前gcc版本为4.6,之后回车。
sudoupdate-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
sudoupdate-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 40
sudoupdate-alternatives --config g++
手动选择g++版本编号,输入1,即选择当前g++版本为4.6,之后回车。
(3)查看当前版本
gcc--version和g++--version
3.3 修改默认shell
sudo ln –s –fbash /bin/sh
3.4 安装CUDA
(1)删除已有的NVIDIA
sudoapt-get remove --purge nvidia*
(2)到官方下载对应的包并按提示安装
https://developer.nvidia.com/cuda-downloads
(3)按提示安装
sudodpkg -i cuda-repo-ubuntu1404-8-0-local_8.0.44-1_amd64.deb
sudoapt-get update
sudoapt-get install cuda
(4)配置环境变量等
在文件/etc/profile的最后一行添加PATH="$PATH:/usr/local/cuda-7.5/bin",保存并退出
source/etc/profile
echo$PATH
在文件/etc/ld.so.conf第二行写入include /usr/local/cuda-7.5/lib64
sudopasswd root #如果是第一次装机,先要设置一下root 密码
su #进入root 账号
ldconfig
exit
4 Kaldi安装和编译
4.1 下载Kaldi
现在Kaldi的最新下载地址是:https://github.com/kaldi-asr/kaldi,下载后,提取并放在主文件夹下即可。也可以利用git版本控制进行下载:
gitclone https://github.com/kaldi-asr/kaldi.git kaldi --origin upstream
kaldi下载好,进去查看文件内容。其中,./tools,./src和./egs三个目录是比较重要的。
./tools目录下全部是Kaldi的依赖库。待安装编译。
./src目录下是Kaldi的源代码。待安装编译。
./egs存放的是Kaldi提供的一些例程。
4.2 安装和编译
(1)安装Kaldi依赖库
Kaldi软件包在编译源码之前,需要先在tools文件夹下安装如下一些依赖库。
Ø OpenFst:WeightedFinite State Transducer Library,用来构造有限状态转换器。Kaldi基于该库编译,使用频率非常高。在自动编译时默认安装OpenFst1.3.4,此时gcc版本不能太高,否则可能出现兼容问题;如果自己下载安装OpenFst-1.4,则需要配合版本gcc>= 4.6。不管采用哪种方法安装OpenFst,gcc版本4.6肯定符合要求,所以前面环境配置时选择gcc-4.6。
Ø IRSTLM:统计语言模型工具包。
Ø sph2pipe:LDC开发的处理sph格式音频的一款软件,将sph格式文件变换为其他格式,如wav等,一些例程中会用到。
Ø sclite:计算识别率,非必须,因为Kaldi自带有较简单的代码(compute-wer.cc)。
Ø ATLAS和CLAPACK:线性代数函数库。
安装过程:
cd kaldi/tools/
extras/check_dependencies.sh #查看有哪些依赖包还没有安装
make #等待,漫长的编译过程
extras/check_dependencies.sh #再次确认
注1:电脑有不只一个CPU时,假设4个,可以用make–j 4代替make以节省时间。
注2:重点检查OpenFST和ATLAS两个外部库是否安装成功。
(2)编译Kaldi源码
当所有外部依赖库都安装完成,开始编译Kaldi源码。
编译过程:
cd ../src
./configure #配置
make #等待,漫长的编译过程
注:如果中途没有退出的话就基本没问题了。安装编译过程中需要全程保持网络畅通。编译完成的src文件夹大小约为8G。
(3)编译cudamatrix
把kaldi-maser/src/cudamatrix/Makefile文件中的TESTFILES改成BINFILE。
cd ~/kaldi-master/src/cudamatrix
make all
./cu-vector-test
如果不报错并显示如下信息,则说明CUDA 进行矩阵运算了。