ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-12-01 16:32:13  阅读:615  来源: 互联网

标签:src sctk kaldi make Kaldi 编译 DHAVE -----


语音识别领域的开源框架有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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有