其实不是特别推荐在 Windows 下使用 kaldi,因为在 egs 下所有的脚本都无法运行,我也是弄了很久才在 Windows 下配置好 kaldi,都一度差点弃坑。就连官方也说There is no commitment to support Windows. The Windows port of Kaldi is targeted at experienced developers who want to program their own apps using the kaldi libraries and are able to do the troubleshooting on their own. 就让我来把坑填平那么一点点吧

kaldi 在 Windows 下的安装

工具准备

git

cmake

Visual Studio 2017

vs2017 要注意安装 win8.1 SDK,如果已经安装了 vs2017,也可以在上方的菜单栏中的工具 -> 获取工具和功能中来查看是否有安装。git 和 cmake 的安装没有什么特别的,就不做介绍了。

编译 Openfst

首先从 github 上将 openfst clone 下来。然后这里用 cmake 的方式来先编译出 vs 的工程文件,具体操作方法如下:

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

成功后会在 build64 目录下面生成一个 openfst.sln 文件,用 vs2017 打开这个文件,分别用 Debug|x64 和 Release|x64 来生成一遍,如下图,如果失败为 0 则代表编译通过。

配置 OpenBLAS

首先也是从 github 上先将 kaldi clone 下来

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

然后我们就需要去配置线性代数库,这里有两个选择,一个是 Intel MKL,一个是 OpenBLAS。这里我选用 OpenBLAS。用下面的命令来下载 OpenBLAS 的二进制包(在 kaldi/tools 目录下):

curl -L -O http://sourceforge.net/projects/openblas/files/v0.2.14/OpenBLAS-v0.2.14-Win64-int32.zip

unzip OpenBLAS-v0.2.14-Win64-int32.zip

注意这里要下载 Win64-int32 版本,而不是 Win64-int64 版本

修改配置文件

进入 kaldi/windows 路径想,将 varialbe.props.dev 复制一份重命名为 variables.props,打开后将刚刚配置好的库修改为自己的路径:

C:Program Files(x86)IntelSWToolscompilers_and_librarieswindowsmkl

C:UsersYendaDownloadskaldi-svnoolsOpenBLAS-v0.2.14-Win64-int32

C:UsersjtrmalDocumentsopenfst

C:UsersjtrmalDocumentsopenfstuild64

我们需要将 OpenBLAS 和 Openfst 修改为自己的路径,因为没有用到 MKL 就不用修改了。下面就是我修改后的路径:

C:Program Files(x86)IntelSWToolscompilers_and_librarieswindowsmkl

D:git_homekaldioolsOpenBLAS-v0.2.14-Win64-int32

D:git_homeopenfst

D:git_homeopenfstuild64

产生工程文件

同样还是在 kaldi/windows 路径下,因为我们是使用 OpenBLAS 所以就把 kaldiwin_openblas.props 复制一份重命名为 kaldiwin.prosp。然后在 windows 路径下用 git bash 运行以下命令:

./generate_solution.pl --vsver vs2017 --enable-openblas

./get_version.pl

kaldi 编译测试

然后我们打开在 kaldi/kaldiwin_vs2017_OPENBLAS 这个新生成的文件夹,打卡里面的 kaldiwin_vs2017.sln 工程文件,这里面就包括了所有 kaldi/src 中 * bin 中的. cc 文件。这时候需要来测试一下 kaldi 能否运行,首先要把 Debug|Win32 改为 Debug|x64,然后右键选择 online2-wav-nnet2-latgen-faster 生成,如下图,如果生成成功则代表之前的工作都做对啦,kaldi 已经配置好了✌️~exe 文件会生成在 kaldiwin_vs2017_OPENBLAS/x64/Debug 中,不过当用命令行来运行刚刚生成的 exe 文件时,还是有可能会报错,如缺少 dll 等,解决方法见常见问题。

kaldi 在 Windows 下的调试

新建自己的 kaldi 项目

在配置好 kaldi 之后,就可以开始调试和编写自己的使用 kaldi 的程序了。不过原来的 kaldi 项目中有 630 个项目或者称为解决方案,每次打开都要加载很久。所以我们可以新建一个空项目:

添加引用

然后点击左上角文件 -> 添加 -> 现有项目,切换到 kaldi/kaldiwin_vs2017_OPENBLAS/kaldiwin 路径下。

最好把所有以 kaldi 开头的项目都添加进去(点进去具体的文件夹,添加. vcxproj 文件),包含 test 的不用。不过如果你清楚你用的项目要用到哪些具体的引用,那么只添加特定的项目即可。那么要怎么看需要用到那些引用呢,这时就要回到之前那个包含 630 个项目的 vs 中去。

比如说我想要提取 mfcc 特征,就可以去看看 compute-mfcc-feats 这个项目中以用了那些项目,然后在自己的项目提取 mfcc 特征项目中,也要以用相同的项目,那么就把对应的项目添加到自己的项目中,如下图:

添加工程属性表

配置好引用还需要我们去添加刚才配置好的 vs 工程属性表,点开左上菜单栏中的视图 -> 其他窗口 -> 属性管理器。

然后在自己的项目的 Debug|64 中添加 variables.props kaldiwin.props openfst_debug.props(如果要 release 则添加对应的 release 版本)

修改附加包含目录

还差一步就大功告成,首先要在自己的项目中添加一个 cpp 文件,然后右键属性 ->C/C++-> 所有选项 -> 附加包含目录,需要把 kaldi/src 目录添加进去

配置好之后,就可以写自己的调用 kaldi 的程序了,之后也可以按照这样的方式来。总结一下:

在当前项目中文件 -> 添加 -> 新建项目

添加需要用到的引用

添加已经配置好的工程属性表

最后把 kaldi/src 添加到附加包含目录就可以了

另外要记住调试模式要切换成 Debug|x64

写自己的 kaldi 程序

如果想写自己的调用 kaldi 的程序要怎么开始呢,最好的办法就是去看 run.sh 中用到了哪些命令,然后在看命令中 C++ 代码是怎么做的。以提取 mfcc 特征为例,在声纹识别中,一般都是下面几条命令用来提取 mfcc 特征:

# run.sh

# Now make MFCC features.

# mfccdir should be some place with a largish disk where you

# want to store MFCC features.

mfccmfccdir=mfcc

for x in train test; do

steps/make_mfcc.sh --cmd "$train_cmd" --nj 10 data/$x exp/make_mfcc/$x $mfccdir

sid/compute_vad_decision.sh --nj 10 --cmd "$train_cmd" data/$x exp/make_mfcc/$x $mfccdir

utils/fix_data_dir.sh data/$x

done

具体的提取 mfcc 的特征程序就在 steps/make_mfcc.sh 中了

# make_mfcc.sh

$cmd JOB=1:$nj $logdir/make_mfcc_${name}.JOB.log

extract-segments scp,p:$scp $logdir/segments.JOB ark:- |

compute-mfcc-feats $vtln_opts --verbose=2--config=$mfcc_config ark:- ark:- |

copy-feats --compress=$compress $write_num_frames_opt ark:-

ark,scp:$mfccdir/raw_mfcc_$name.JOB.ark,$mfccdir/raw_mfcc_$name.JOB.scp

|| exit 1;

里面具体提取 mfcc 特征的命令就应该是 steps/make_mfcc.sh 了,看下 make_mfcc.sh,在经过一系列处理后,使用 compute-mfcc-feat 这个命令来提取 mfcc 特征的。我们就可以去看在 featbin 下的 compute-mfcc-feat.cc 中是如何提取 mfcc 特征的,下面就贴上我的提取 mfcc 并写入一个 txt 文件的代码:

#include

#include

#include"feat/feature-mfcc.h"

#include"feat/wave-reader.h"

#include"base/kaldi-math.h"

#include"matrix/kaldi-matrix-inl.h"

#include"matrix/kaldi-vector.h"

int main(int argc,char * argv[]){

try {

using namespace kaldi;   //要记住使用namespace kaldi

const char * Usage=

"my_kaldi.exe [wav_filename] [mfcc_filename]  ";

ParseOptions po(Usage);

po.Read(argc, argv);

if (po.NumArgs() != 2) {

po.PrintUsage();

exit(1);

}

std::string wav_filename=po.GetArg(1);

std::string mfcc_filename=po.GetArg(2);

/*读取wav文件*/

std::ifstream wav_file;

wav_file.open(wav_filename, std::ios_base::binary);

WaveData wave;

wave.Read(wav_file);

SubVectorwaveform(wave.Data(), 0);//将wav文件数据放到waveform中

/*mfcc特征配置*/

MfccOptions mfcc_opts;

mfcc_opts.frame_opts.samp_freq=16000;

mfcc_opts.frame_opts.frame_length_ms=25;

mfcc_opts.frame_opts.frame_shift_ms=10;

mfcc_opts.frame_opts.preemph_coeff=0.95;

/*提取mfcc特征*/

Matrixmfcc_feature;

Mfcc feat(mfcc_opts);

feat.ComputeFeatures(waveform, wave.SampFreq(), 1.0, &mfcc_feature);

/*写入到文件中*/

WriteKaldiObject(mfcc_feature,mfcc,false);

//kaldi中都可以使用WriteKaldiObject来写使用到的kaldi对象

}

catch (const std::exception &e) {

std::cerr <

return -1;

}

return 0;

}

kaldi 模型的读取

在 windows 上跑 kaldi,不可避免地会用到 kaldi 中的 I/O 接口,比如读取在 Linux 下已经训练好的模型等。kaldi 中的模型往往都是一个类,比如说声纹识别中用到的 UBM 类 FullGmm,提取 ivector 的 IvectorExtractor 等等,对于这些类的提取都可以用 ReadKaldiObject 来完成

using namespace kaldi;

FullGmm fgmm;                           //首先要声明想要读取的模型的类

std::string ubmFile="final.ubm";    //然后确定文件名

ReadKaldiObject(ubmFile, &fgmm);

对于其他的模型,也可以通过类似的方法来读取到内存中。如果想把模型等写出来也可以通过 WriteKaldiObject 来完成。

kaldi 在 Windows 下的移植

此处的移植指的是能够使 kaldi 在一台没有开发环境下的电脑中正常运行。刚开始要做的时候感觉可能会有各种的坑,不过实际中做要比想象中简单得多,如果上面配置基本没什么问题,移植的话也就没什么问题了。

生成 exe

生成 exe 其实很简单,在每次 Debug 的时候都会自动生成一个可执行文件,不过要想在一个没有开发环境的电脑上使用,要用 Release 来重新生成一下。我们可以用 main(int argc, char * argv[]) 来读取命令行的参数,然后可以用 ParseOptions po(Usage); 来控制输入的参数,具体参考上面提取 mfcc 的代码,这里就不做过多的介绍了。在移植过程中还遇到的一个问题就是缺少一些 dll,主要是 mingw 的一些 dll,解决方法见下面遇到的问题。

生成 dll

如果想生成 dll 打包给其他程序用,就需要在头文件中想要导出的函数的前面加上 declspec(dllexport),并且右键右侧的项目属性栏,把常规中的项目默认值 -> 配置类型改为动态库(.dll)

遇到的问题记录

cmake 生成 Openfst 工程文件失败

根据错误提示,应该是缺少了 fst_test.h weight-tester.h algo_test.h,在 openfst/src 目录下搜索这几个文件,发现都在 openfstsrcincludestest 中,于是把几个文件都复制过来,然后再执行那条 cmake 的命令,就可以成功了~。

缺少 libopenblas.dll

当在命令行或 git bash 中运行生成好的 exe 时,会报错缺少 libopenblas.dll:

我们需要将之前下载的 OpenBLAS 中 bin 目录下的 libopenblas.dll 拷到和 exe 文件同一个文件夹中就可以执行了。

mingw dll 下载

包括 libgcc_s_seh-1.dll libgfortran-3.dll libquadmath-0.dll,下载后同样需要放到和 exe 同一目录下。

curl -L -O http://sourceforge.net/projects/openblas/files/v0.2.14/mingw64_dll.zip

unzip mingw64_dll.zip

参考资料

kaldi windows安装_kaldi 在 Windows 下的使用相关推荐

  1. kaldi windows安装_kaldi在Windows下的使用

    其实不是特别推荐在Windows下使用kaldi,因为在egs下所有的脚本都无法运行,我也是弄了很久才在Windows下配置好kaldi,都一度差点弃坑.就连官方也说There is no commi ...

  2. kaldi windows安装_Kaldi安装

    AI 人工智能 Kaldi安装 Kaldi是基于C++开发并遵守Apache License v2.0的一款语音识别工具包,是目前最流行的ASR工具之一,本文基于Ubuntu 18.04 LTS介绍了 ...

  3. mysql sphinx windows安装_Sphinx在windows下安装使用[支持中文全文检索]

    前一阵子尝试使用了一下Sphinx,一个能够被各种语言(PHP/Python/Ruby/etc)方便调用的全文检索系统.网上的资料大多是在 linux环境下的安装使用,当然,作为生产环境很有必要部署在 ...

  4. windows安装gnu_在Windows上安装GNU Emacs

    windows安装gnu GNU Emacs是为各种程序员设计的流行文本编辑器. 因为它是在Unix上开发的,并且在Linux上广泛使用(并且随macOS一起提供),所以人们有时没有意识到它也可用于M ...

  5. 部署Vista – 第2部分:理解Windows安装程序和Windows映像文件格式

    要理解如何部署Windows Vista,首先要熟悉部署概念.技术和工具.在第一篇文章中,介绍了Windows AIK.从这篇文章开始介绍重要的技术,如Windows安装(Windows Setup) ...

  6. windows安装python3步骤_Windows下python3和python2安装与一起使用

    一.python2和python3安装 2.安装步骤,直接双击运行,记得勾选添加环境变量就可以. 图片1.png 3.安装已经选择了添加这个环境变量,所以不用再去配置. 如果没有勾选,得自己去设置. ...

  7. windows 安装linux wubi,windows下安装ubuntu 12.04---利用ubuntu的iso包中的wubi.exe工具安装...

    http://www.cnblogs.com/linjiqin/p/3600146.html 一.下载ubuntu-12.04-desktop-amd64.iso后,用winrar打开,提取出wubi ...

  8. windows 安装 php memcached,Windows安装配置php+memcached的方法

    Windows下Memcached的安装配置方法 1.将第一个包解压放某个盘下面,比如在c:\memcached. 2.在终端(也即cmd命令界面)下输入 'c:\memcached\memcache ...

  9. windows下载redis、windows安装redis、windows启动redis

    一.下载并解压 下载网址:https://github.com/tporadowski/redis/releases 下载后解压并重命名文件夹为redis 二.打开redis文件夹 找到redis.w ...

最新文章

  1. linux空间共享Windows
  2. sklearn 相关性分析_人工智能和大数据的骨架支点—— 机器学习之相关性分析
  3. happens-before俗解
  4. id文本框适应文字_Indesign中对同一行文字进行分行缩排的操作方法
  5. 3_9 VisitorMode 访问者模式
  6. 全校师生放6天春假;清华大学设立天文系;郭守敬望远镜光谱数突破千万;《自然》发表最新发现;百度败诉需道歉;这就是今天的大新闻...
  7. linux input子系统分析--主要函数
  8. linux nvm 管理 nodejs,Nodejs 版本管理器: nvm 介绍
  9. list集合下标从几开始_Java基础进阶 集合框架详解
  10. PAT甲级1017 (模拟排序)
  11. 痴情研究java内存中的对象
  12. eclipse远程连接hive
  13. python爬虫简历项目怎么写_python爬虫简历
  14. 弹性力学方程 有限差分法matlab,泊松方程的有限差分法的MATLAB实现
  15. element-ui时间选择器如何把今日日期改为“至今”
  16. 绿色明珠--野三坡白草畔
  17. 2018年淘宝新店开业怎么引流量
  18. 远程桌⾯连接电脑后键盘失灵解决方案
  19. Visio科学图形包免费下载
  20. dom4j 获取xml中指定节点的信息

热门文章

  1. java字符串转数组,吊打面试官
  2. FTP工作原理及内网用端口映射方式建FTP的注意事项
  3. 如何对光栅进行多波长优化
  4. 什么是吉布斯采样(Gibbs Sampling)
  5. tools :cflow
  6. 暂态matlab仿真,基于matlab的电力系统暂态稳定仿真
  7. libgdx开发指南_使用libgdx进行Android游戏开发–一天中的原型,第1a部分
  8. 也谈软件公司的企业文化
  9. node-sass安装失败解决
  10. 凯斯西储大学(CWR) 轴承数据