您的位置:首页 > 产品设计 > UI/UE

Building of Kaldi VS2015 Project on Windows

2017-10-17 18:55 961 查看
[本文地址:]http://http://blog.csdn.net/bluepuma/article/details/78264778]

本文在Kaldi已有的Windows VS工程及其编译流程说明的基础上,更新有问题的子模块,并添加对VS工程的适配代码,确保Kaldi VS工程在windows平台上编译通过online-wave-gmm-decode-faster 解码程序的正常运行

Note:
1) 本文撰写时间为:2017.Oct.17, 相关代码的版本以此时间点为基准。

2) 感谢 “工 - Kaldi新手” (279295537) QQ群 @10号同学 (1004018924)的鼎力协助。

3) 如有问题,请留言,或者在QQ群 (279295537) 里Ping我(@L-SAE)

1. 相关背景

Kaldi的相关工程和示例 (https://github.com/kaldi-asr/kaldi ),可以在Ubuntu Linux Server上借助GPU的Power几近完美的编译和运行起来。

但是,工程上,还是存在相关的需求,需要在windows平台上,借助于Visual Studio的强大能力,对定制的VS工程进行Debugging或动态流程调用分析。

幸运的是,Kaldi本身已经包含了一个针对Windows平台的VS工程 (见 https://github.com/kaldi-asr/kaldi/tree/master/windows )。

不幸的是,该工程最近的更新也在2年之前, 编译的时候会有问题。涉及到的第三方的依赖子模块的版本也很低,使用最新的kaldi代码训练出来的模型进行解码时,会出现参数不匹配的问题。

因此,需要对相关的子模块进行版本更新和病添加对windows平台的适配。

2. 准备工作

进行相关VS工程的更新和修改前,请确认你已经完成了以下列表所述工作,以保证后续更新的正确进行:

已在Ubuntu Server上成功安装并运行Kaldi;

请自行搜索相关Kaldi在Ubuntu上install/building的相关资源,这里不是重点,不再赘述。

[Code Link] https://github.com/kaldi-asr/kaldi

已在Ubuntu Server上下载THCHS30语料库,并成功运行至少 tri2b的步骤;

[Example Code Dir] TRUNK_ROOT/egs/thchs30/s5/

[Corpus Link] http://www.openslr.org/18/

Windows平台上已安装Cygwin,并可以运行Unzip,Git, Wget, Patch命令,及Perl脚本;

如果没有,请使用Cygwin Setup重新添加一下package:
[x] unzip : Info-ZIP

[x] git : Distributed version control system

[x] wget : Utility to retrieve filts from the WWW via HTTP and FTP

[x] patch : Applies diff files

Windows平台上下载相同版本Kaldi代码,并依据相关Guide生成VS工程,并可编译(尽管编译有错误);

[Guide] https://github.com/kaldi-asr/kaldi/blob/master/windows/INSTALL.md

Note:

VS工程选择VS2015(v140), 配置选择 x64 Debug/Release

请fellow步骤 1,2,3,4,6,8,9,10,11,12,13,15,16

步骤15使用选项: (kaldi)/windows$ generate_solution.pl –vsver vs2015 –enable-openblas

如果无法使用wget下载代码,请使用浏览器打开相关网址直接下载,注意版本;

pthreads-w32-2-9-1-release.zip

OpenBLAS-v0.2.14-Win64-int32.zip

mingw64_dll.zip

如果无法 patch /pthread-2.9.1.patch, 请修改pthreads\Pre-built.2\include\pthread.h的ending type为UNIX模式;

3. 问题及解决方案

Kaldi自带的VS工程的编译问题,主要是由PortAudio模块的缺失和openfst版本过低一起的。下面我们来逐一解决。

Note: 以下步骤的验证,可以只编译/运行 (kaldi)\kaldiwin_vs2015_OPENBLAS\kaldiwin_vs2015.sln 中的 oneline-wave-gmm-decode-faster工程。 编译整个Solution 600多个Project太耗时。

3.1 PortAudio的更新及编译

.PortAudio
问题fata error C1083: Cannot open include file: ‘portaudio.h’: No such file or directory
原因PortAudio 子模块未安装
方法Install PortAudio module and also ASIO supported sub-module
步骤1) 下载 pa_stable_v190600_20161030.tgzasiosdk.zip , 拷贝到 (kaldi)/tools/ 目录
.2) cd (kaldi)/tools/
.3) tar -xvf pa_stable_v190600_20161030.tgz
.4) unzip asiosdk.zip
.5) mv ASIOSDK2.3/ portaudio/src/hostapi/asio/ASIOSDK
.6) 在VS2015中打开 (kaldi)\tools\portaudio\build\msvc\portaudio.sln,选择x64/Release配置进行编译。
.7) 打开(kaldi)\kaldiwin_vs2015_OPENBLAS\kaldiwin\variables.props, 添加PortAudio相关信息.
> —————-
<PropertyGroup Label="UserMacros">
子项下添加:

<PORTAUDIO>D:\Local\_Work\Proj_DL\kaldi_win_valid\tools\portaudio</PORTAUDIO>

<PORTAUDIOLIB>D:\Local\_Work\Proj_DL\kaldi_win_valid\tools\portaudio\build\msvc\x64</PORTAUDIOLIB>


<ItemGroup>
子项下添加:

<BuildMacro Include="PORTAUDIO">

<Value>$(PORTAUDIO)</Value>

<EnvironmentVariable>true</EnvironmentVariable>

</BuildMacro>

<BuildMacro Include="PORTAUDIOLIB">

<Value>$(PORTAUDIOLIB)</Value>

<EnvironmentVariable>true</EnvironmentVariable>

</BuildMacro>

.8) 打开(kaldi)\kaldiwin_vs2015_OPENBLAS\kaldiwin\kaldiwin.props, 添加PortAudio相关信息.
> —————-
<AdditionalIncludeDirectories>
子项下添加:

$(PORTAUDIO)\include;$(PORTAUDIO)\src\common;


<AdditionalLibraryDirectories>
子项下添加:

$(PORTAUDIOLIB)\Debug;


<AdditionalDependencies>
子项下添加:

portaudio_x64.lib;pa_ringbuffer.obj;
.9) Rebuild kaldiwin_vs2015.slnoneline-wave-gmm-decode-faster工程.

3.2 Openfst的更新及编译

b8e7
.Openfst
问题context-fst.h(90): error C2143: syntax error: missing ‘;’ before ‘<’
table-matcher.h(289): error C2143: syntax error: missing ‘;’ before ‘<’
trivial-factor-weight.h(112): error C2143: syntax error: missing ‘;’ before ‘<’
原因openfst版本不匹配, 当前使用为1.6.2, VS工程中使用的是1.3.4
方法更新openfst版本,添加/修改相关windows平台适配代码
步骤1) 下载 openfst-1.6.2.tar.gzopenfst-1.6.2.patch, 拷贝到 (kaldi)/tools/ 目录
.2) cd (kaldi)/tools/
.3) rm -rf openfst
.4) tar -xvf openfst-1.6.2.tar.gz
.5) patch -b -p1 < openfst-1.6.2.patch
.6) 在VS2015中打开 (kaldi)\tools\openfst-1.6.2\openfst.sln,选择x64/Release & Debug配置进行编译.
.7) 打开(kaldi)\kaldiwin_vs2015_OPENBLAS\kaldiwin\variables.props, 修改openfst相关信息.
> —————-
<PropertyGroup Label="UserMacros">
子项下的
<OPENFST><OPENFSTLIB>
内容修改为:

<OPENFST>(KALDI_ROOT)\tools\openfst-1.6.2</OPENFST>

<OPENFSTLIB>(KALDI_ROOT)\tools\openfst-1.6.2\x64</OPENFSTLIB>
.8) 打开(kaldi)\kaldiwin_vs2015_OPENBLAS\kaldiwin\openfstwin_debug.props, 修改openfst相关信息.
> —————-
<AdditionalDependencies>
子项下的
openfstx64-gd.lib
内容修改为:

<AdditionalDependencies>libfst.lib;%(AdditionalDependencies)</AdditionalDependencies>
.9) 打开(kaldi)\kaldiwin_vs2015_OPENBLAS\kaldiwin\openfstwin_release.props, 修改openfst相关信息.
> —————-
<AdditionalDependencies>
子项下的
openfstx64.lib
内容修改为:

<AdditionalDependencies>libfst.lib;%(AdditionalDependencies)</AdditionalDependencies>

3.3 pthread-win的路径错误

.pthread-win
问题12>LINK : fatal error LNK1104: cannot open file ‘pthreadVC2.lib’
原因pthreads路径错误
方法更改kaldiwin_vs2015 solution配置文件中pthreads路径
步骤1) 打开(kaldi)\kaldiwin_vs2015_OPENBLAS\kaldiwin\variables.props, 修改openfst相关信息.
> —————-
<PropertyGroup Label="UserMacros">
子项下的
<PTHREADW>
内容修改为:

<PTHREADW>(KALDI_ROOT)\pthreads\Pre-built.2</PTHREADW>

3.4 dll files missing的错误

.dll files missing
问题编译完成后运行时,提示找不到相关的dll文件
原因工程运行依赖的dll文件未注册
方法拷贝dll文件到可执行文件目录下
步骤1) 相关dll的位置如下所示
> —————-
libopenblas.dll
(KALDI_ROOT)\tools\OpenBLAS-v0.2.14-Win64-int32\bin\libopenblas.dll

portaudio_x64.dll
(KALDI_ROOT)\tools\portaudio\build\msvc\x64\Debug\portaudio_x64.dll

libgcc_s_seh-1.dll
(KALDI_ROOT)\tools\mingw64_dll\libgcc_s_seh-1.dll

libgfortran-3.dll
(KALDI_ROOT)\tools\mingw64_dll\libgfortran-3.dll

libquadmath-0.dll
(KALDI_ROOT)\tools\mingw64_dll\libquadmath-0.dll
.2) 请将其拷贝到工程生成的执行文件目录
(kaldi)\kaldiwin_vs2015_OPENBLAS\x64\Debug

3.5 控制台中文输出乱码

.解码输出中文乱码
问题online-wave-gmm-decode-faster.exe的控制台输出的解码后的文本显示是乱码
原因解码所需的字典文件word.txt的编码格式(UTF-8)和中文版windows的控制台默认的编码格式(GBK)不一致
方法字典文件和控制台的编码格式需要保持一致
步骤1) 用notepad++将word.txt编码格式更改为GB2312(GBK)

- -

.2) 将控制台输出的编码格式更改为UTF-8
添加
system("chcp 65001");
到oneline-wave-gmm-decode-faster.cc的main()函数中。


- -

4. Reference Link

Kaldi Source Code on Github

PortAudio Download Page

ASIO SDK Download Page

openfst Download Page

PortAudio(v19) 在vs2010上的环境搭建

Building PortAudio for Windows using Microsoft Visual Studio

openfstwin Reference code

让VS调试器正确显示UTF-8字符串

基于kaldi的在线中文识别,online的操作介绍

kaldi中的在线识别—-Online Recognizers
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息