Outline:
a) ndk下載&ndk-toolchain提取
b) kaldi編譯
c) android ndk-toolchain編譯kaldi
一、NDK下載及ndk-toolchain提取
ndk下載地址:Android-ndk?下載后解壓得到android-ndk-r18b文件夾炫惩;進(jìn)入目錄build-->tools下纤掸,執(zhí)行python make_standalone_toolchain.py腳本兼蕊,配合參數(shù):--arch arm --api 21 --install-dir /expected rootdir/android-toolchain 即可提取出android-toolchain鏈接工具。參數(shù)含義及關(guān)于該提取步驟更詳細(xì)內(nèi)容參見:Android NDK獨(dú)立工具鏈?參考博客? 使用該toolchain編譯C++工程時會遇到錯誤:找不到文件crtbegin_so.o和crtend_so.o稚照,解決方法見:https://blog.csdn.net/qiaoliang328/article/details/50965215?[除此之外還遇到過stderr不識別的錯誤揭斧,但后期用先前的toolchain就沒問題了]
二、Kaldi下載編譯
kaldi下載地址:Kaldi?git clone進(jìn)入kaldi文件夾崇棠。先是在tools目錄下編譯,后再去到src目錄下編譯丸卷。具體分別編譯細(xì)則可參考對應(yīng)目錄下的INSTALL文件枕稀。
A)執(zhí)行./tools/extras/check_dependencies.sh。若出現(xiàn)“./check_dependencies.sh:all ok.”則此步驟結(jié)束谜嫉。
在check dependencies時我遇到了錯誤:大意是系統(tǒng)沒有安裝mkl萎坷,并提示使用exrtas/install_mkl.sh腳本安裝(運(yùn)行此腳本需要使用sudo權(quán)限)。但執(zhí)行此腳本時有遇到了錯誤如圖:
此問題的出現(xiàn)是因?yàn)閕nstall_mkl.sh腳本有執(zhí)行到“apt-get update”指令沐兰,該問題的解決方法可參考執(zhí)行sudo apt-get update報錯解決
B) cd回到tools目錄下哆档,執(zhí)行make指令(也可執(zhí)行make -j 4指令使用多線程,具體參見tools下的INSTALL文件)住闯,直到出現(xiàn)“All done OK.”表示編譯完成且成功瓜浸。
C) 進(jìn)入src目錄澳淑,總體編譯過程參照該目錄下的INSTALL文件。具體來說:首先執(zhí)行./configure --shared插佛,沒有提示錯誤則執(zhí)行make depend -j 8(“8”這個數(shù)量根據(jù)自己電腦硬件條件適當(dāng)更改)杠巡,最后執(zhí)行make -j 8。當(dāng)出現(xiàn)“Done”時說明編譯完成且成功雇寇。
D) 測試安裝是否成功
可用yesno工程測試kaldi安裝是否成功氢拥,具體地:cd /kaldi-dir/egs/yesno/s5/然后執(zhí)行./run.sh 成功運(yùn)行后會顯示如圖信息:
E) 卸載kaldi
需先在src目錄下make clean,然后刪除整個kaldi文件夾锨侯。
三嫩海、toolchain編譯kaldi
A) 編譯OpenBLAS
首先下載OpenBLAS(提供個GitHub的repo: https://github.com/xianyi/OpenBLAS.git)并用ndk-toolchain去編譯openblas,步驟可參考wiki?, 此步驟完成后最終要獲得libopenblas.a囚痴。具體地:
CLANG_FLAGS="-target arm-linux-androideabi -marm -mfpu=vfp -mfloat-abi=softfp --sysroot /ndk-toolchain-path/sysroot -gcc-toolchain /ndk-toolchain-path/"
make-C /openblas-dir/ TARGET=ARMV7 ONLY_CBLAS=1 AR=ar CC="clang ${CLANG_FLAGS}" HOSTCC=gcc ARM_SOFTFP_ABI=1 USE_THREAD=0 NUM_THREADS=32 -j4
make-C /openblas-dir/ install NO_SHARED=1 PREFIX=/openblas-dir/install
B) 編譯clapack
提供參考GitHub repo:https://github.com/simonlynen/android_libs.git?叁怪。里面有clapack,編譯時首先注釋掉/lapack/jni/Android.mk中關(guān)于測試部分的內(nèi)容:
LOCAL_MODULE:= testlapack
LOCAL_SRC_FILES:= testclapack.cpp
LOCAL_STATIC_LIBRARIES := lapack
include $(BUILD_SHARED_LIBRARY)
然后使用ndk-build編譯這個工程渡讼,上述過程步驟如下圖:
該步驟會遇到一些問題骂束,主要如下(根據(jù)編譯過程的報錯信息均可較容易地找到問題并改正):
1、修改/lapack/AndroidManifest.xml中的android:minSdkVersion="10", 把10改為16成箫;
2展箱、修改/lapack/project.properties中的target=android-10, 把-10改為-16;
3蹬昌、修改/lapack/jni/Application.mk中的APP_STL:=gnustl_static, 把gnustl-static改為c++_static; APP_ABI:=armeabi armeabi-v7a ,把a(bǔ)rmeabi去掉只保留armeabi-v7a混驰;
最后將clapack生成的blas,lapack皂贩,clapack栖榨,f2c四個庫拷貝到openblas安裝目錄下的lib中,kaldi會自動配置到kaldi.mk中作為鏈接庫(此步驟最終目的是獲得libblas.a,libf2c.a,libclapack.a,liblapack.a)明刷。
C) 安卓編譯Kaldi
不同于“二”中介紹的Linux下kaldi的安裝編譯愚争,此處介紹的是安卓編譯kaldi的過程。操作中挤聘,在此步驟需要額外分配一個路徑給kaldi轰枝,不可與已有的Linux編譯好的kaldi位置沖突。
tools目錄下主要涉及到openfst和cub的編譯(此步驟最后要獲得libfst.a):
接下來是src目錄下編譯组去,此過程最后要產(chǎn)生一堆相關(guān).a文件鞍陨。具體步驟如圖:
最后需要把$NDK_TOOLCHAIN_PATH/arm-linux-androideabi/lib/armv7-a/libc++_shared.so軟鏈到上述所有.a文件所在的目錄下(一般命名為lib)。全部編譯完該lib目錄下的所有文件如下圖: