其他分享
首页 > 其他分享> > Kaldi语音识别学习记录-----编译安装

Kaldi语音识别学习记录-----编译安装

作者:互联网

语音识别领域的开源框架有CMUSphinx、HTK、Kaldi等等,而目前仍然比较活跃,且工程价值较高的就数Kaldi,很多从事语音方面的公司,都使用该框架训练自己的语音识别能力,由于其内部代码逻辑较为复杂,故这里一步一步来解读,了解语音识别的内部原理,并期望自定义,实现业务场景下的语音识别、语音唤醒等引擎。

一、准备工作

学习kaldi需要一定的语言基础,尤其是C++,基本上工具以及代码都是基于C++语言实现起来的,所以它相对python等语言还是有一定的门槛,大家在学习工作中,多读多写。从事算法研究方向,对于这门语言还是硬要求的,算法的工程化实现最好也是用C/C++来实现,确保性能。

硬件:x86_64 服务器一台(32C 128G),没有条件的小伙伴可以用PC机或虚拟机环境(编译及运行速度较慢)

操作系统:CentOS7.4 64bit

二、Kaldi下载

一般开源组件都在使用git作为版本控制,Kaldi也不例外,版本放在github上进行代码管理

先安装git工具

# yum install git

下载Kaldi源码

# git clone https://github.com/kaldi-asr/kaldi.git

三、Kaldi编译

kaldi下载完成后,需要先编译其依赖的第三方组件,一般在tools目录下,其安装脚本依赖系统命令,请提前自行安装automake、autoconf、libtool、g++、wget

# cd tools
# make

执行后会依次安装openfst、mkl、sctk、sph2pipe等工具,实际在编译过程中会出现报错,主要是由于sctk代码使用c++11,手动添加编译标志c++11

make[2]: 进入目录“/home/songwang/kaldi/tools/sctk-20159b5/src”
(cd asclite && if test -f makefile ; then make all ; fi)
make[3]: 进入目录“/home/songwang/kaldi/tools/sctk-20159b5/src/asclite”
(cd core && if test -f makefile ; then make all ; fi)
make[4]: 进入目录“/home/songwang/kaldi/tools/sctk-20159b5/src/asclite/core”
g++ -c  -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DHAVE_LIBM=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DHAVE_STDIO_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MATH_H=1 -DHAVE_TIME_H=1 -DHAVE_ASSERT_H=1 -DHAVE_FLOAT_H=1 -DHAVE_LIMITS_H=1  -I. -w -march=native  -w -march=native recording.cpp
In file included from /usr/include/c++/4.8.2/array:35:0,
                 from sgml_reportgenerator.h:29,
                 from recording.h:35,
                 from recording.cpp:24:
/usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: 错误:#error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^
make[4]: *** [recording.o] 错误 1
make[4]: 离开目录“/home/songwang/kaldi/tools/sctk-20159b5/src/asclite/core”
make[3]: *** [all] 错误 2
make[3]: 离开目录“/home/songwang/kaldi/tools/sctk-20159b5/src/asclite”
make[2]: *** [all] 错误 2
make[2]: 离开目录“/home/songwang/kaldi/tools/sctk-20159b5/src”
make[1]: *** [all] 错误 2
make[1]: 离开目录“/home/songwang/kaldi/tools/sctk-20159b5”
make: *** [sctk/.compiled] 错误 2

修改方式为src下Makefile文件,增加-std=c++11标志:

SCTK_CXFLAGS = -w -march=native -std=c++11

依赖组件安装完成后,进入src源码编译静态库及工具,这里关闭cuda,不使用GPU,不设置的话默认开启

# cd src
# ./configure --use-cuda=no --static

执行完后生成Makefile文件,但是这里为了便于后续其他动态库集成Kaldi静态库,加入-fPIC标志,修改Makefile文件:

CXXFLAGS = -fPIC -std=c++11 -I.. -isystem $(OPENFSTINC) -O1 \

执行编译操作,耗时较久,可以使用多进程编译方式,服务器环境下相对速度较快

# make depend -j 32
# make -j 32

编译完成后,可以把相关的文件拷贝出来,静态库如下:

# find src/ -name *.a | xargs -i cp {} /data/kaldi/lib_x64

头文件使用shell脚本拷贝,具体实现方式可自行根据实际情况考虑:

output=$1
dir=`pwd`
filelist=`ls $dir`
for file in $filelist:
do
	if [ -d $file ];then
		echo $file
		cd $file
		mkdir -p $output/$file
		cp -f *.h $output/$file
		cd ..
	fi
done

至此,Linux x64环境下的组件编译完成,笔者也编译了一套arm aarch64平台下的Kaldi库,相对坑比较多,后续有时间再更新

 

 

标签:src,sctk,kaldi,make,Kaldi,编译,DHAVE,-----
来源: https://blog.csdn.net/Leo_ustc/article/details/110433790