kaldi windows安装_kaldi在Windows下的使用
其實不是特別推薦在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的工程文件,具體操作方法如下:
1
2
3
4
5git clone https://github.com/kkm000/openfst.git
cd openfst
mkdir build64
cd build64
cmake -G "Visual Studio 15 2017 Win64" ../
如果這一步成功會顯示以下提示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24-- 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下來
1git clone https://github.com/kaldi-asr/kaldi.git kaldi
然后我們就需要去配置線性代數庫,這里有兩個選擇,一個是Intel MKL,一個是OpenBLAS。這里我選用OpenBLAS。用下面的命令來下載OpenBLAS的二進制包(在kaldi/tools目錄下):
1
2curl -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,打開后將剛剛配置好的庫修改為自己的路徑:
1
2
3
4
5
6
7
C:\Program Files\(x86)\IntelSWTools\compilers_and_libraries\windows\mkl\
C:\Users\Yenda\Downloads\kaldi-svn\tools\OpenBLAS-v0.2.14-Win64-int32
C:\Users\jtrmal\Documents\openfst
C:\Users\jtrmal\Documents\openfst\build64
我們需要將OpenBLAS和Openfst修改為自己的路徑,因為沒有用到MKL就不用修改了。下面就是我修改后的路徑:
1
2
3
4
5
6
7
C:\Program Files(x86)\IntelSWTools\compilers_and_libraries\windows\mkl\
D:\git_home\kaldi\tools\OpenBLAS-v0.2.14-Win64-int32
D:\git_home\openfst
D:\git_home\openfst\build64
產生工程文件
同樣還是在kaldi/windows路徑下,因為我們是使用OpenBLAS所以就把kaldiwin_openblas.props復制一份重命名為kaldiwin.prosp。然后在windows路徑下用git bash運行以下命令:
1
2./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特征:
1
2
3
4
5
6
7
8
9
10#run.sh
#Now make MFCC features.
#mfccdir should be some place with a largish disk where you
#want to store MFCC features.
mfccdir=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中了
1
2
3
4
5
6
7#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文件的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53#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] \n";
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);
SubVector waveform(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特征*/
Matrix mfcc_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 << e.what();
return -1;
}
return 0;
}
kaldi模型的讀取
在windows上跑kaldi,不可避免地會用到kaldi中的I/O接口,比如讀取在Linux下已經訓練好的模型等。kaldi中的模型往往都是一個類,比如說聲紋識別中用到的UBM類FullGmm,提取ivector的IvectorExtractor等等,對于這些類的提取都可以用ReadKaldiObject來完成
1
2
3
4using 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目錄下搜索這幾個文件,發現都在openfst\src\include\fst\test中,于是把幾個文件都復制過來,然后再執行那條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同一目錄下。
1
2curl -L -O http://sourceforge.net/projects/openblas/files/v0.2.14/mingw64_dll.zip
unzip mingw64_dll.zip
參考資料
總結
以上是生活随笔為你收集整理的kaldi windows安装_kaldi在Windows下的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mvc NuGet 数据迁移
- 下一篇: 不收费的数据恢复软件推荐