Kaldi(B1)Windows上的编译运行Debug
请首先查阅官方文档kaldi/windows/INSTALL.md
,Windows下面是没办法跑例程里面的脚本的!所以学习的话仍然需要先到Linux环境!
请注意!Windows下仅仅方便调试,正常训练模型等任务仍然需要在Linux环境下安装!
以下仅仅记录我在安装过程中遇到的坑以及部分比较重要的笔记。
想使用cygwin进行安装请参考../INSTALL
.
(Cygwin是一个在windows平台上运行的类UNIX模拟环境)
Notes
- 注意需要安装VS的2017版本,安装VS2017的时候需要安装Win10 SDK&WIn8.1 SDK 不安装8.1后续编译Kaldi的时候会有提示,安装完成之后需要重启。
安装选项
-
以下命令均使用Git for windows进行操作
Git bash
Steps
编译OpenFST
确认安装好了cmake
https://cmake.org/download/
git clone https://github.com/kkm000/openfst.git
cd openfst
mkdir build64
cd build64
cmake -G "Visual Studio 15 2017 Win64" ../
假如这一步成功效果会如下面所示
-- The C compiler identification is MSVC 19.11.25547.0
-- The CXX compiler identification is MSVC 19.11.25547.0
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- The following ICU libraries were not found:
-- data (required)
-- i18n (required)
-- io (required)
-- test (required)
-- tu (required)
-- uc (required)
-- Failed to find all ICU components (missing: ICU_INCLUDE_DIR ICU_LIBRARY _ICU_REQUIRED_LIBS_FOUND)
-- Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/jtrmal/Documents/openfst/build64</pre>
在 build64
目录下 用Visual Studio 17打开 openfst.sln
,分别选择 debug|Win64
release|Win64
并进行编译。
编译Kaldi
从Github上先把Kaldi给git clone
下来,然后下载OpenBLAS, 注意下载的是 "Win64-int32" 而不是"Win64-int64"!在kaldi/tools
目录下进行如下操作
(kaldi)/tools$ curl -L -O http://sourceforge.net/projects/openblas/files/v0.2.14/OpenBLAS-v0.2.14-Win64-int32.zip
(kaldi)/tools$ curl -L -O http://sourceforge.net/projects/openblas/files/v0.2.14/mingw64_dll.zip
(kaldi)/tools$ unzip OpenBLAS-v0.2.14-Win64-int32.zip
(kaldi)/tools$ unzip mingw64_dll.zip
修改配置文件
进入 (kaldi)/windows
把 variables.props.dev
(这一份是备份)复制一份命名为 variables.props
然后修改里面的路径。这里以我的路径举例,应该填写为
<OPENBLASDIR>F:\Git_Home\kaldi\tools\OpenBLAS-v0.2.14-Win64-int32</OPENBLASDIR>
<OPENFST>F:\Git_Home\openfst</OPENFST>
<OPENFSTLIB>F:\Git_Home\openfst\build64\</OPENFSTLIB>
PS:
这一步比较坑,<OPENBLASDIR>
<OPENFST>
估计是没什么问题的,<OPENFSTLIB>
和原来的variables.props.dev
差异比较大,照原来的填最后编译kaldi工程时会出现找不到fst.lib的错误,于是我在kaldiwin_vs2017_OPENBLAS
文件夹下搜索了fst.lib
发现它在openfstwin_debug.props
这个文件中被引用到了,并找到了这个<OPENBLASDIR>
是如何被引用的:
<AdditionalLibraryDirectories>$(OPENFSTLIB)/src/lib/Debug;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
,再看了一下自己在OpenFST阶段生成的文件夹结构,发现<OPENFSTLIB>
应该填写为F:\Git_Home\openfst\build64\
产生工程文件
将 kaldiwin_openblas.props
复制一份命名为kaldiwin.props
,然后运行产生VS工程文件并进行配置
(kaldi)/windows$ ./generate_solution.pl --vsver vs2017 --enable-openblas
(kaldi)/windows$ ./get_version.pl
编译测试
kaldi\kaldiwin_vs2017_OPENBLAS
下打开这个产生好的文件,并切换到 Debug|x64 (或者 Release|x64) 注意是x64!工程打开默认是win32!
找到online2-wav-nnet2-latgen-faster
,点右键生成解决方案作为测试,可以正常通过。但是实际在F:\Git_Home\kaldi\kaldiwin_vs2017_OPENBLAS\x64\Debug
运行online2-wav-nnet2-latgen-faster.exe
首先会提示缺少libopenblas.dll
,从OpenBLAS目录下的bin
下复制一个过来就行;
然后如果在Git Bash里面运行的话还是会提示缺少dll,这里就看不见是少什么了,在cmd下运行发现少的是
libgfortran-3.dll
,百度了一下说是需要安装MingGW,但是发现mingw-w64\x86_64-7.2.0-posix-seh-rt_v5-rev1\mingw64\bin
下的是libgfortran-4.dll
,所以抱着试试看的想法直接网上下了一个libgfortran-3.dll
(注意是x64
版本)扔过去居然跑成功了…这样就可以愉快地在Windows下修改kaldi的源码进行调试了…
工程搭建
假如想要利用它的源代码新建一个自己的项目,该项目里面的函数包括Kaldi里面用到的命令该怎么办呢?
- 新建空项目,添加源代码
新建空项目english-score
这里Kaldi里面别的命令的main改成一个函数复制过来就行,参数同样通过argc
,argv
传入
//声明
int my_decoder(int argc,const char *argv[]) {}
//解码选项
const char *decoder_opt[] = { "englist-score","--do-endpointing=true", "--online=false","--config=./nnet_a_gpu_online/conf/online_nnet2_decoding.conf","--max-active=3500","--beam=15.0", "--lattice-beam=6.0", "--acoustic-scale=0.1","./nnet_a_gpu_online/final.mdl","./graph_own/HCLG.fst","ark:spk2utt","scp:wav.scp","ark:lattice" };
//调用
my_decoder(sizeof(decoder_opt) / sizeof(decoder_opt[0]),decoder_opt);
添加源代码
-
查看一下别的命令的结构,记录一下用到的命令的引用
引用 -
在我们的项目里面添加这些用到了的命令的引用
-
添加工程设置
属性管理器
-
修改一下头文件的路径
src
属性-C/C++-所有选项-附加包含目录
别的项目默认路径是这张图里面的..\..\..\src
,但由于这个项目是我们自己建的,相对路径不一样,所以手动添加一下包含的目录
-
终于编译通过了…
配置文件的修改
如果想要在Windows平台上使用解码等功能,需要用到decode.conf
等配置文件,需要修改路径,这里修改为相对路径(相对于exe所在的路径)是可以的。
--feature-type=mfcc
--mfcc-config=./nnet_a_gpu_online/conf/mfcc.conf
--ivector-extraction-config=./nnet_a_gpu_online/conf/ivector_extractor.conf
--endpoint.silence-phones=1:2:3:4:5:6:7:8:9:10
Debug
添加命令行argv argc
VS debug时传递命令行参数
https://blog.csdn.net/u012750702/article/details/51508214
调整工作目录..\x64\Debug
,加上命令参数
C:\Program Files\Git\mingw64\bin
把dll都拎过来就可以正常Debug啦。