141 lines
4.6 KiB
Bash
Executable File
141 lines
4.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Copyright 2019-2021 Alpha Cephei Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
if [ "x$ANDROID_NDK_HOME" == "x" ]; then
|
|
echo "ANDROID_NDK_HOME environment variable is undefined, define it with local.properties or with export"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -d "$ANDROID_NDK_HOME" ]; then
|
|
echo "ANDROID_NDK_HOME ($ANDROID_NDK_HOME) is missing. Make sure you have ndk installed"
|
|
exit 1
|
|
fi
|
|
|
|
set -x
|
|
|
|
OS_NAME=`echo $(uname -s) | tr '[:upper:]' '[:lower:]'`
|
|
ANDROID_TOOLCHAIN_PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/${OS_NAME}-x86_64
|
|
WORKDIR_BASE=`pwd`/build
|
|
PATH=$ANDROID_TOOLCHAIN_PATH/bin:$PATH
|
|
OPENFST_VERSION=1.8.0
|
|
|
|
for arch in armeabi-v7a arm64-v8a x86_64 x86; do
|
|
|
|
WORKDIR=${WORKDIR_BASE}/kaldi_${arch}
|
|
|
|
case $arch in
|
|
armeabi-v7a)
|
|
BLAS_ARCH=ARMV7
|
|
HOST=arm-linux-androideabi
|
|
AR=llvm-ar
|
|
RANLIB=llvm-ranlib
|
|
CC=armv7a-linux-androideabi21-clang
|
|
CXX=armv7a-linux-androideabi21-clang++
|
|
ARCHFLAGS="-mfloat-abi=softfp -mfpu=neon"
|
|
PAGESIZE_LDFLAGS=""
|
|
;;
|
|
arm64-v8a)
|
|
BLAS_ARCH=ARMV8
|
|
HOST=aarch64-linux-android
|
|
AR=llvm-ar
|
|
RANLIB=llvm-ranlib
|
|
CC=aarch64-linux-android21-clang
|
|
CXX=aarch64-linux-android21-clang++
|
|
ARCHFLAGS=""
|
|
# Ensure compatibility with 16KiB page size devices
|
|
PAGESIZE_LDFLAGS="-Wl,-z,common-page-size=4096 -Wl,-z,max-page-size=16384"
|
|
;;
|
|
x86_64)
|
|
BLAS_ARCH=ATOM
|
|
HOST=x86_64-linux-android
|
|
AR=llvm-ar
|
|
RANLIB=llvm-ranlib
|
|
CC=x86_64-linux-android21-clang
|
|
CXX=x86_64-linux-android21-clang++
|
|
ARCHFLAGS=""
|
|
PAGESIZE_LDFLAGS=""
|
|
;;
|
|
x86)
|
|
BLAS_ARCH=ATOM
|
|
HOST=i686-linux-android
|
|
AR=llvm-ar
|
|
RANLIB=llvm-ranlib
|
|
CC=i686-linux-android21-clang
|
|
CXX=i686-linux-android21-clang++
|
|
ARCHFLAGS=""
|
|
PAGESIZE_LDFLAGS=""
|
|
;;
|
|
esac
|
|
|
|
mkdir -p $WORKDIR/local/lib
|
|
|
|
# openblas first
|
|
cd $WORKDIR
|
|
git clone -b v0.3.20 --single-branch https://github.com/xianyi/OpenBLAS
|
|
make -C OpenBLAS TARGET=$BLAS_ARCH ONLY_CBLAS=1 AR=$AR CC=$CC HOSTCC=gcc ARM_SOFTFP_ABI=1 USE_THREAD=0 NUM_THREADS=1 -j 8
|
|
make -C OpenBLAS install PREFIX=$WORKDIR/local
|
|
|
|
# CLAPACK
|
|
cd $WORKDIR
|
|
git clone -b v3.2.1 --single-branch https://github.com/alphacep/clapack
|
|
mkdir -p clapack/BUILD && cd clapack/BUILD
|
|
cmake -DCMAKE_C_FLAGS="$ARCHFLAGS" -DCMAKE_C_COMPILER_TARGET=$HOST \
|
|
-DCMAKE_C_COMPILER=$CC -DCMAKE_SYSTEM_NAME=Generic -DCMAKE_AR=$ANDROID_TOOLCHAIN_PATH/bin/$AR \
|
|
-DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \
|
|
-DCMAKE_CROSSCOMPILING=True ..
|
|
make -j 8 -C F2CLIBS/libf2c
|
|
make -j 8 -C BLAS/SRC
|
|
make -j 8 -C SRC
|
|
find . -name "*.a" | xargs cp -t $WORKDIR/local/lib
|
|
|
|
# tools directory --> we'll only compile OpenFST
|
|
cd $WORKDIR
|
|
git clone https://github.com/alphacep/openfst
|
|
cd openfst
|
|
autoreconf -i
|
|
CXX=$CXX CXXFLAGS="$ARCHFLAGS -O3 -DFST_NO_DYNAMIC_LINKING" ./configure --prefix=${WORKDIR}/local \
|
|
--enable-shared --enable-static --with-pic --disable-bin \
|
|
--enable-lookahead-fsts --enable-ngram-fsts --host=$HOST --build=x86-linux-gnu
|
|
make -j 8
|
|
make install
|
|
|
|
# Kaldi itself
|
|
cd $WORKDIR
|
|
git clone -b vosk-android --single-branch https://github.com/alphacep/kaldi
|
|
cd $WORKDIR/kaldi/src
|
|
CXX=$CXX AR=$AR RANLIB=$RANLIB CXXFLAGS="$ARCHFLAGS -O3 -DFST_NO_DYNAMIC_LINKING" ./configure --use-cuda=no \
|
|
--mathlib=OPENBLAS_CLAPACK --shared \
|
|
--android-incdir=${ANDROID_TOOLCHAIN_PATH}/sysroot/usr/include \
|
|
--host=$HOST --openblas-root=${WORKDIR}/local \
|
|
--fst-root=${WORKDIR}/local --fst-version=${OPENFST_VERSION}
|
|
make -j 8 depend
|
|
cd $WORKDIR/kaldi/src
|
|
make -j 8 online2 rnnlm
|
|
|
|
# Vosk-api
|
|
cd $WORKDIR
|
|
mkdir -p $WORKDIR/vosk
|
|
make -j 8 -C ${WORKDIR_BASE}/../../../src \
|
|
OUTDIR=$WORKDIR/vosk \
|
|
KALDI_ROOT=${WORKDIR}/kaldi \
|
|
OPENFST_ROOT=${WORKDIR}/local \
|
|
OPENBLAS_ROOT=${WORKDIR}/local \
|
|
CXX=$CXX \
|
|
EXTRA_LDFLAGS="-llog -static-libstdc++ -Wl,-soname,libvosk.so ${PAGESIZE_LDFLAGS}"
|
|
cp $WORKDIR/vosk/libvosk.so $WORKDIR/../../src/main/jniLibs/$arch/libvosk.so
|
|
|
|
done
|