Kaldi(B1)Windows上的编译运行Debug

请首先查阅官方文档kaldi/windows/INSTALL.mdWindows下面是没办法跑例程里面的脚本的!所以学习的话仍然需要先到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);
添加源代码
  • 查看一下别的命令的结构,记录一下用到的命令的引用


    引用
  • 在我们的项目里面添加这些用到了的命令的引用

  • 添加工程设置


    属性管理器
添加对应的设置
  • 修改一下头文件的路径
    属性-C/C++-所有选项-附加包含目录
    别的项目默认路径是这张图里面的..\..\..\src,但由于这个项目是我们自己建的,相对路径不一样,所以手动添加一下包含的目录

    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,加上命令参数

Git

C:\Program Files\Git\mingw64\bin把dll都拎过来就可以正常Debug啦。

推荐阅读更多精彩内容