Skip to content

Support running sherpa-onnx with RK NPU on Android #2124

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 15, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
283 changes: 283 additions & 0 deletions .github/workflows/android-rknn.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,283 @@
name: android-rknn

on:
push:
branches:
- master
paths:
- '.github/workflows/android-rknn.yaml'
- 'cmake/**'
- 'sherpa-onnx/csrc/*'
- 'sherpa-onnx/jni/*'
- 'build-android*.sh'
tags:
- 'v[0-9]+.[0-9]+.[0-9]+*'
pull_request:
branches:
- master
paths:
- '.github/workflows/android-rknn.yaml'
- 'cmake/**'
- 'sherpa-onnx/csrc/*'
- 'sherpa-onnx/jni/*'
- 'build-android*.sh'

workflow_dispatch:

concurrency:
group: android-rknn-${{ github.ref }}
cancel-in-progress: true

jobs:
build-android-rknn-libs:
name: Android rknn libs
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: ccache
uses: hendrikmuhs/ccache-action@v1.2
with:
key: ${{ matrix.os }}-android-rknn

- name: Display NDK HOME
shell: bash
run: |
echo "ANDROID_NDK_LATEST_HOME: ${ANDROID_NDK_LATEST_HOME}"
ls -lh ${ANDROID_NDK_LATEST_HOME}

- name: build android arm64-v8a
shell: bash
run: |
export CMAKE_CXX_COMPILER_LAUNCHER=ccache
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"

export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
export SHERPA_ONNX_ENABLE_C_API=ON
export SHERPA_ONNX_ENABLE_RKNN=ON
./build-android-arm64-v8a.sh
mkdir -p jniLibs/arm64-v8a/
cp -v ./build-android-arm64-v8a/install/lib/*.so ./jniLibs/arm64-v8a/
cp -v ./build-android-arm64-v8a/install/lib/README.md ./jniLibs/arm64-v8a/
rm -rf ./build-android-arm64-v8a/

- name: build android armv7-eabi
shell: bash
run: |
export CMAKE_CXX_COMPILER_LAUNCHER=ccache
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"

export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
export SHERPA_ONNX_ENABLE_C_API=ON
export SHERPA_ONNX_ENABLE_RKNN=ON
./build-android-armv7-eabi.sh
mkdir -p ./jniLibs/armeabi-v7a/
cp -v ./build-android-armv7-eabi/install/lib/*.so ./jniLibs/armeabi-v7a/
cp -v ./build-android-armv7-eabi/install/lib/README.md ./jniLibs/armeabi-v7a/
rm -rf ./build-android-armv7-eabi

- name: Copy files
shell: bash
run: |
SHERPA_ONNX_VERSION=v$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2)
echo "SHERPA_ONNX_VERSION=$SHERPA_ONNX_VERSION" >> "$GITHUB_ENV"

filename=sherpa-onnx-${SHERPA_ONNX_VERSION}-android-rknn.tar.bz2

tar cjvf $filename ./jniLibs

ls -lh

- uses: actions/upload-artifact@v4
with:
name: sherpa-onnx-android-libs-rknn
path: ./jniLibs

# https://huggingface.co/docs/hub/spaces-github-actions
- name: Publish to huggingface
if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
env:
HF_TOKEN: ${{ secrets.HF_TOKEN }}
uses: nick-fields/retry@v3
with:
max_attempts: 20
timeout_seconds: 200
shell: bash
command: |
git config --global user.email "csukuangfj@gmail.com"
git config --global user.name "Fangjun Kuang"
du -h -d1 .
ls -lh

rm -rf huggingface
export GIT_CLONE_PROTECTION_ACTIVE=false
GIT_LFS_SKIP_SMUDGE=1 git clone https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs huggingface

cd huggingface

cp -v ../sherpa-onnx-*-android-rknn.tar.bz2 ./

git status
git lfs track "*.bz2"

git add .

git commit -m "upload sherpa-onnx-${SHERPA_ONNX_VERSION}-android.tar.bz2"

git push https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs main

- name: Release android libs
if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && github.event_name == 'push' && contains(github.ref, 'refs/tags/')
uses: svenstaro/upload-release-action@v2
with:
file_glob: true
overwrite: true
file: sherpa-onnx-*-android-rknn.tar.bz2
# repo_name: k2-fsa/sherpa-onnx
# repo_token: ${{ secrets.UPLOAD_GH_SHERPA_ONNX_TOKEN }}
# tag: v1.11.3

build-android-aar-rknn:
needs: [build-android-rknn-libs]
name: Android rknn AAR
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

# https://github.com/actions/setup-java
- uses: actions/setup-java@v4
with:
distribution: 'temurin' # See 'Supported distributions' for available options
java-version: '21'

- name: Display NDK HOME
shell: bash
run: |
echo "ANDROID_NDK_LATEST_HOME: ${ANDROID_NDK_LATEST_HOME}"
ls -lh ${ANDROID_NDK_LATEST_HOME}

- name: Retrieve artifact
uses: actions/download-artifact@v4
with:
name: sherpa-onnx-android-libs-rknn
path: /tmp/jniLibs

- name: Show jni libs
shell: bash
run: |
ls -lh /tmp/jniLibs

# drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 arm64-v8a
# drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 armeabi-v7a

- name: Copy libs
shell: bash
run: |
for arch in arm64-v8a armeabi-v7a; do
cp -v /tmp/jniLibs/$arch/* android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/$arch/
done

rm -rf android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/x86
rm -rf android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/x86_64

- name: Check libs
shell: bash
run: |
ls -lh android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/*

- name: Build aar
shell: bash
run: |
cd android/SherpaOnnxAar

./gradlew :sherpa_onnx:assembleRelease

- name: Display aar
shell: bash
run: |
cd android/SherpaOnnxAar

ls -lh ./sherpa_onnx/build/outputs/aar/sherpa_onnx-release.aar
cp ./sherpa_onnx/build/outputs/aar/sherpa_onnx-release.aar ../../


- name: Rename aar
shell: bash
run: |
SHERPA_ONNX_VERSION=$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2)
echo "SHERPA_ONNX_VERSION=$SHERPA_ONNX_VERSION" >> "$GITHUB_ENV"

mv sherpa_onnx-release.aar sherpa-onnx-${SHERPA_ONNX_VERSION}-rknn.aar

- uses: actions/upload-artifact@v4
with:
name: sherpa-onnx-android-aar
path: ./*.aar

# https://huggingface.co/docs/hub/spaces-github-actions
- name: Publish to huggingface
if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
env:
HF_TOKEN: ${{ secrets.HF_TOKEN }}
uses: nick-fields/retry@v3
with:
max_attempts: 20
timeout_seconds: 200
shell: bash
command: |
git config --global user.email "csukuangfj@gmail.com"
git config --global user.name "Fangjun Kuang"
du -h -d1 .
ls -lh

rm -rf huggingface
export GIT_CLONE_PROTECTION_ACTIVE=false
GIT_LFS_SKIP_SMUDGE=1 git clone https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs huggingface

cd huggingface
dst=android/aar
mkdir -p $dst

cp -v ../*.aar $dst

git status
git lfs track "*.aar"

git add .

git commit -m "upload sherpa-onnx-${SHERPA_ONNX_VERSION}-rknn.aar"

git push https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs main

- name: Release android aar
if: github.repository_owner == 'csukuangfj' && github.event_name == 'push' && contains(github.ref, 'refs/tags/')
uses: svenstaro/upload-release-action@v2
with:
file_glob: true
overwrite: true
file: ./*.aar
# repo_name: k2-fsa/sherpa-onnx
# repo_token: ${{ secrets.UPLOAD_GH_SHERPA_ONNX_TOKEN }}
# tag: v1.11.3

- name: Release android aar
if: github.repository_owner == 'k2-fsa' && github.event_name == 'push' && contains(github.ref, 'refs/tags/')
uses: svenstaro/upload-release-action@v2
with:
file_glob: true
overwrite: true
file: ./*.aar
39 changes: 39 additions & 0 deletions build-android-arm64-v8a.sh
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,23 @@ fi
echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR"
echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR"

if [ -z $SHERPA_ONNX_ENABLE_RKNN ]; then
SHERPA_ONNX_ENABLE_RKNN=OFF
fi

if [ $SHERPA_ONNX_ENABLE_RKNN == ON ]; then
rknn_version=2.2.0
if [ ! -d ./librknnrt-android ]; then
rm -fv librknnrt-android.tar.bz2
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/librknnrt-android.tar.bz2
tar xvf librknnrt-android.tar.bz2
rm librknnrt-android.tar.bz2
fi

export SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR=$PWD/librknnrt-android/v$rknn_version/arm64-v8a/
export CPLUS_INCLUDE_PATH=$PWD/librknnrt-android/v$rknn_version/include:$CPLUS_INCLUDE_PATH
fi

if [ -z $SHERPA_ONNX_ENABLE_TTS ]; then
SHERPA_ONNX_ENABLE_TTS=ON
fi
Expand Down Expand Up @@ -135,6 +152,7 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
-DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \
-DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \
-DCMAKE_INSTALL_PREFIX=./install \
-DSHERPA_ONNX_ENABLE_RKNN=$SHERPA_ONNX_ENABLE_RKNN \
-DANDROID_ABI="arm64-v8a" \
-DANDROID_PLATFORM=android-21 ..

Expand All @@ -147,6 +165,11 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
make -j4
make install/strip
cp -fv $onnxruntime_version/jni/arm64-v8a/libonnxruntime.so install/lib 2>/dev/null || true

if [ $SHERPA_ONNX_ENABLE_RKNN == ON ]; then
cp -fv $SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR/librknnrt.so install/lib
fi

rm -rf install/share
rm -rf install/lib/pkgconfig
rm -rf install/lib/lib*.a
Expand Down Expand Up @@ -186,3 +209,19 @@ fi
# It should show the help message of sherpa-onnx.
#
# Please use the above approach to copy model files to your phone.
#
# ----------------------------------------
# For android rknn
# ----------------------------------------
# If you get the following error from the logcat
# 2025-04-15 15:27:43.441 19568-19646 RKNN com.k2fsa.sherpa.onnx E Meet unsupported input dtype for gather
# 2025-04-15 15:27:43.442 19568-19646 RKNN com.k2fsa.sherpa.onnx E Op type:Gather, name: Gather:/Concat_78_2gather, fallback cpu failed. If using rknn, update to the latest toolkit2 and runtime from: https://console.zbox.filez.com/l/I00fc3 (PWD: rknn). If using rknn-llm, update from: https://github.com/airockchip/rknn-llm
# 2025-04-15 15:27:43.442 19568-19646 sherpa-onnx com.k2fsa.sherpa.onnx W Return code is: -1
# 2025-04-15 15:27:43.442 19568-19646 sherpa-onnx com.k2fsa.sherpa.onnx W Failed to run encoder
#
# You need to update /vendor/lib64/librknnrt.so and /vendor/lib/librknnrt.so
#
# adb root
# adb remount /vendor
# adb push ./install/lib/librknnrt.so /vendor/lib64
# adb push ./install/lib/librknnrt.so /vendor/lib
23 changes: 23 additions & 0 deletions build-android-armv7-eabi.sh
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,23 @@ fi
echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR"
echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR"

if [ -z $SHERPA_ONNX_ENABLE_RKNN ]; then
SHERPA_ONNX_ENABLE_RKNN=OFF
fi

if [ $SHERPA_ONNX_ENABLE_RKNN == ON ]; then
rknn_version=2.2.0
if [ ! -d ./librknnrt-android ]; then
rm -fv librknnrt-android.tar.bz2
wget https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/librknnrt-android.tar.bz2
tar xvf librknnrt-android.tar.bz2
rm librknnrt-android.tar.bz2
fi

export SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR=$PWD/librknnrt-android/v$rknn_version/armeabi-v7a/
export CPLUS_INCLUDE_PATH=$PWD/librknnrt-android/v$rknn_version/include:$CPLUS_INCLUDE_PATH
fi

if [ -z $SHERPA_ONNX_ENABLE_TTS ]; then
SHERPA_ONNX_ENABLE_TTS=ON
fi
Expand Down Expand Up @@ -136,6 +153,7 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
-DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \
-DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \
-DCMAKE_INSTALL_PREFIX=./install \
-DSHERPA_ONNX_ENABLE_RKNN=$SHERPA_ONNX_ENABLE_RKNN \
-DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON \
-DANDROID_PLATFORM=android-21 ..

Expand All @@ -146,6 +164,11 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
make -j4
make install/strip
cp -fv $onnxruntime_version/jni/armeabi-v7a/libonnxruntime.so install/lib 2>/dev/null || true

if [ $SHERPA_ONNX_ENABLE_RKNN == ON ]; then
cp -fv $SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR/librknnrt.so install/lib
fi

rm -rf install/share
rm -rf install/lib/pkgconfig
rm -rf install/lib/lib*.a
Expand Down
Loading
Loading