Fangjun Kuang
Committed by GitHub

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

  1 +name: android-rknn
  2 +
  3 +on:
  4 + push:
  5 + branches:
  6 + - master
  7 + paths:
  8 + - '.github/workflows/android-rknn.yaml'
  9 + - 'cmake/**'
  10 + - 'sherpa-onnx/csrc/*'
  11 + - 'sherpa-onnx/jni/*'
  12 + - 'build-android*.sh'
  13 + tags:
  14 + - 'v[0-9]+.[0-9]+.[0-9]+*'
  15 + pull_request:
  16 + branches:
  17 + - master
  18 + paths:
  19 + - '.github/workflows/android-rknn.yaml'
  20 + - 'cmake/**'
  21 + - 'sherpa-onnx/csrc/*'
  22 + - 'sherpa-onnx/jni/*'
  23 + - 'build-android*.sh'
  24 +
  25 + workflow_dispatch:
  26 +
  27 +concurrency:
  28 + group: android-rknn-${{ github.ref }}
  29 + cancel-in-progress: true
  30 +
  31 +jobs:
  32 + build-android-rknn-libs:
  33 + name: Android rknn libs
  34 + runs-on: ${{ matrix.os }}
  35 + strategy:
  36 + fail-fast: false
  37 + matrix:
  38 + os: [ubuntu-latest]
  39 +
  40 + steps:
  41 + - uses: actions/checkout@v4
  42 + with:
  43 + fetch-depth: 0
  44 +
  45 + - name: ccache
  46 + uses: hendrikmuhs/ccache-action@v1.2
  47 + with:
  48 + key: ${{ matrix.os }}-android-rknn
  49 +
  50 + - name: Display NDK HOME
  51 + shell: bash
  52 + run: |
  53 + echo "ANDROID_NDK_LATEST_HOME: ${ANDROID_NDK_LATEST_HOME}"
  54 + ls -lh ${ANDROID_NDK_LATEST_HOME}
  55 +
  56 + - name: build android arm64-v8a
  57 + shell: bash
  58 + run: |
  59 + export CMAKE_CXX_COMPILER_LAUNCHER=ccache
  60 + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
  61 +
  62 + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
  63 + export SHERPA_ONNX_ENABLE_C_API=ON
  64 + export SHERPA_ONNX_ENABLE_RKNN=ON
  65 + ./build-android-arm64-v8a.sh
  66 + mkdir -p jniLibs/arm64-v8a/
  67 + cp -v ./build-android-arm64-v8a/install/lib/*.so ./jniLibs/arm64-v8a/
  68 + cp -v ./build-android-arm64-v8a/install/lib/README.md ./jniLibs/arm64-v8a/
  69 + rm -rf ./build-android-arm64-v8a/
  70 +
  71 + - name: build android armv7-eabi
  72 + shell: bash
  73 + run: |
  74 + export CMAKE_CXX_COMPILER_LAUNCHER=ccache
  75 + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
  76 +
  77 + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
  78 + export SHERPA_ONNX_ENABLE_C_API=ON
  79 + export SHERPA_ONNX_ENABLE_RKNN=ON
  80 + ./build-android-armv7-eabi.sh
  81 + mkdir -p ./jniLibs/armeabi-v7a/
  82 + cp -v ./build-android-armv7-eabi/install/lib/*.so ./jniLibs/armeabi-v7a/
  83 + cp -v ./build-android-armv7-eabi/install/lib/README.md ./jniLibs/armeabi-v7a/
  84 + rm -rf ./build-android-armv7-eabi
  85 +
  86 + - name: Copy files
  87 + shell: bash
  88 + run: |
  89 + SHERPA_ONNX_VERSION=v$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2)
  90 + echo "SHERPA_ONNX_VERSION=$SHERPA_ONNX_VERSION" >> "$GITHUB_ENV"
  91 +
  92 + filename=sherpa-onnx-${SHERPA_ONNX_VERSION}-android-rknn.tar.bz2
  93 +
  94 + tar cjvf $filename ./jniLibs
  95 +
  96 + ls -lh
  97 +
  98 + - uses: actions/upload-artifact@v4
  99 + with:
  100 + name: sherpa-onnx-android-libs-rknn
  101 + path: ./jniLibs
  102 +
  103 + # https://huggingface.co/docs/hub/spaces-github-actions
  104 + - name: Publish to huggingface
  105 + if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
  106 + env:
  107 + HF_TOKEN: ${{ secrets.HF_TOKEN }}
  108 + uses: nick-fields/retry@v3
  109 + with:
  110 + max_attempts: 20
  111 + timeout_seconds: 200
  112 + shell: bash
  113 + command: |
  114 + git config --global user.email "csukuangfj@gmail.com"
  115 + git config --global user.name "Fangjun Kuang"
  116 + du -h -d1 .
  117 + ls -lh
  118 +
  119 + rm -rf huggingface
  120 + export GIT_CLONE_PROTECTION_ACTIVE=false
  121 + GIT_LFS_SKIP_SMUDGE=1 git clone https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs huggingface
  122 +
  123 + cd huggingface
  124 +
  125 + cp -v ../sherpa-onnx-*-android-rknn.tar.bz2 ./
  126 +
  127 + git status
  128 + git lfs track "*.bz2"
  129 +
  130 + git add .
  131 +
  132 + git commit -m "upload sherpa-onnx-${SHERPA_ONNX_VERSION}-android.tar.bz2"
  133 +
  134 + git push https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs main
  135 +
  136 + - name: Release android libs
  137 + if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && github.event_name == 'push' && contains(github.ref, 'refs/tags/')
  138 + uses: svenstaro/upload-release-action@v2
  139 + with:
  140 + file_glob: true
  141 + overwrite: true
  142 + file: sherpa-onnx-*-android-rknn.tar.bz2
  143 + # repo_name: k2-fsa/sherpa-onnx
  144 + # repo_token: ${{ secrets.UPLOAD_GH_SHERPA_ONNX_TOKEN }}
  145 + # tag: v1.11.3
  146 +
  147 + build-android-aar-rknn:
  148 + needs: [build-android-rknn-libs]
  149 + name: Android rknn AAR
  150 + runs-on: ${{ matrix.os }}
  151 + strategy:
  152 + fail-fast: false
  153 + matrix:
  154 + os: [ubuntu-latest]
  155 +
  156 + steps:
  157 + - uses: actions/checkout@v4
  158 + with:
  159 + fetch-depth: 0
  160 +
  161 + # https://github.com/actions/setup-java
  162 + - uses: actions/setup-java@v4
  163 + with:
  164 + distribution: 'temurin' # See 'Supported distributions' for available options
  165 + java-version: '21'
  166 +
  167 + - name: Display NDK HOME
  168 + shell: bash
  169 + run: |
  170 + echo "ANDROID_NDK_LATEST_HOME: ${ANDROID_NDK_LATEST_HOME}"
  171 + ls -lh ${ANDROID_NDK_LATEST_HOME}
  172 +
  173 + - name: Retrieve artifact
  174 + uses: actions/download-artifact@v4
  175 + with:
  176 + name: sherpa-onnx-android-libs-rknn
  177 + path: /tmp/jniLibs
  178 +
  179 + - name: Show jni libs
  180 + shell: bash
  181 + run: |
  182 + ls -lh /tmp/jniLibs
  183 +
  184 + # drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 arm64-v8a
  185 + # drwxr-xr-x 2 runner docker 4.0K Dec 12 06:56 armeabi-v7a
  186 +
  187 + - name: Copy libs
  188 + shell: bash
  189 + run: |
  190 + for arch in arm64-v8a armeabi-v7a; do
  191 + cp -v /tmp/jniLibs/$arch/* android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/$arch/
  192 + done
  193 +
  194 + rm -rf android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/x86
  195 + rm -rf android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/x86_64
  196 +
  197 + - name: Check libs
  198 + shell: bash
  199 + run: |
  200 + ls -lh android/SherpaOnnxAar/sherpa_onnx/src/main/jniLibs/*
  201 +
  202 + - name: Build aar
  203 + shell: bash
  204 + run: |
  205 + cd android/SherpaOnnxAar
  206 +
  207 + ./gradlew :sherpa_onnx:assembleRelease
  208 +
  209 + - name: Display aar
  210 + shell: bash
  211 + run: |
  212 + cd android/SherpaOnnxAar
  213 +
  214 + ls -lh ./sherpa_onnx/build/outputs/aar/sherpa_onnx-release.aar
  215 + cp ./sherpa_onnx/build/outputs/aar/sherpa_onnx-release.aar ../../
  216 +
  217 +
  218 + - name: Rename aar
  219 + shell: bash
  220 + run: |
  221 + SHERPA_ONNX_VERSION=$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2)
  222 + echo "SHERPA_ONNX_VERSION=$SHERPA_ONNX_VERSION" >> "$GITHUB_ENV"
  223 +
  224 + mv sherpa_onnx-release.aar sherpa-onnx-${SHERPA_ONNX_VERSION}-rknn.aar
  225 +
  226 + - uses: actions/upload-artifact@v4
  227 + with:
  228 + name: sherpa-onnx-android-aar
  229 + path: ./*.aar
  230 +
  231 + # https://huggingface.co/docs/hub/spaces-github-actions
  232 + - name: Publish to huggingface
  233 + if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
  234 + env:
  235 + HF_TOKEN: ${{ secrets.HF_TOKEN }}
  236 + uses: nick-fields/retry@v3
  237 + with:
  238 + max_attempts: 20
  239 + timeout_seconds: 200
  240 + shell: bash
  241 + command: |
  242 + git config --global user.email "csukuangfj@gmail.com"
  243 + git config --global user.name "Fangjun Kuang"
  244 + du -h -d1 .
  245 + ls -lh
  246 +
  247 + rm -rf huggingface
  248 + export GIT_CLONE_PROTECTION_ACTIVE=false
  249 + GIT_LFS_SKIP_SMUDGE=1 git clone https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs huggingface
  250 +
  251 + cd huggingface
  252 + dst=android/aar
  253 + mkdir -p $dst
  254 +
  255 + cp -v ../*.aar $dst
  256 +
  257 + git status
  258 + git lfs track "*.aar"
  259 +
  260 + git add .
  261 +
  262 + git commit -m "upload sherpa-onnx-${SHERPA_ONNX_VERSION}-rknn.aar"
  263 +
  264 + git push https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs main
  265 +
  266 + - name: Release android aar
  267 + if: github.repository_owner == 'csukuangfj' && github.event_name == 'push' && contains(github.ref, 'refs/tags/')
  268 + uses: svenstaro/upload-release-action@v2
  269 + with:
  270 + file_glob: true
  271 + overwrite: true
  272 + file: ./*.aar
  273 + # repo_name: k2-fsa/sherpa-onnx
  274 + # repo_token: ${{ secrets.UPLOAD_GH_SHERPA_ONNX_TOKEN }}
  275 + # tag: v1.11.3
  276 +
  277 + - name: Release android aar
  278 + if: github.repository_owner == 'k2-fsa' && github.event_name == 'push' && contains(github.ref, 'refs/tags/')
  279 + uses: svenstaro/upload-release-action@v2
  280 + with:
  281 + file_glob: true
  282 + overwrite: true
  283 + file: ./*.aar
@@ -97,6 +97,23 @@ fi @@ -97,6 +97,23 @@ fi
97 echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR" 97 echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR"
98 echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR" 98 echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR"
99 99
  100 +if [ -z $SHERPA_ONNX_ENABLE_RKNN ]; then
  101 + SHERPA_ONNX_ENABLE_RKNN=OFF
  102 +fi
  103 +
  104 +if [ $SHERPA_ONNX_ENABLE_RKNN == ON ]; then
  105 + rknn_version=2.2.0
  106 + if [ ! -d ./librknnrt-android ]; then
  107 + rm -fv librknnrt-android.tar.bz2
  108 + wget https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/librknnrt-android.tar.bz2
  109 + tar xvf librknnrt-android.tar.bz2
  110 + rm librknnrt-android.tar.bz2
  111 + fi
  112 +
  113 + export SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR=$PWD/librknnrt-android/v$rknn_version/arm64-v8a/
  114 + export CPLUS_INCLUDE_PATH=$PWD/librknnrt-android/v$rknn_version/include:$CPLUS_INCLUDE_PATH
  115 +fi
  116 +
100 if [ -z $SHERPA_ONNX_ENABLE_TTS ]; then 117 if [ -z $SHERPA_ONNX_ENABLE_TTS ]; then
101 SHERPA_ONNX_ENABLE_TTS=ON 118 SHERPA_ONNX_ENABLE_TTS=ON
102 fi 119 fi
@@ -135,6 +152,7 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" @@ -135,6 +152,7 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
135 -DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \ 152 -DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \
136 -DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \ 153 -DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \
137 -DCMAKE_INSTALL_PREFIX=./install \ 154 -DCMAKE_INSTALL_PREFIX=./install \
  155 + -DSHERPA_ONNX_ENABLE_RKNN=$SHERPA_ONNX_ENABLE_RKNN \
138 -DANDROID_ABI="arm64-v8a" \ 156 -DANDROID_ABI="arm64-v8a" \
139 -DANDROID_PLATFORM=android-21 .. 157 -DANDROID_PLATFORM=android-21 ..
140 158
@@ -147,6 +165,11 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" @@ -147,6 +165,11 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
147 make -j4 165 make -j4
148 make install/strip 166 make install/strip
149 cp -fv $onnxruntime_version/jni/arm64-v8a/libonnxruntime.so install/lib 2>/dev/null || true 167 cp -fv $onnxruntime_version/jni/arm64-v8a/libonnxruntime.so install/lib 2>/dev/null || true
  168 +
  169 +if [ $SHERPA_ONNX_ENABLE_RKNN == ON ]; then
  170 + cp -fv $SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR/librknnrt.so install/lib
  171 +fi
  172 +
150 rm -rf install/share 173 rm -rf install/share
151 rm -rf install/lib/pkgconfig 174 rm -rf install/lib/pkgconfig
152 rm -rf install/lib/lib*.a 175 rm -rf install/lib/lib*.a
@@ -186,3 +209,19 @@ fi @@ -186,3 +209,19 @@ fi
186 # It should show the help message of sherpa-onnx. 209 # It should show the help message of sherpa-onnx.
187 # 210 #
188 # Please use the above approach to copy model files to your phone. 211 # Please use the above approach to copy model files to your phone.
  212 +#
  213 +# ----------------------------------------
  214 +# For android rknn
  215 +# ----------------------------------------
  216 +# If you get the following error from the logcat
  217 +# 2025-04-15 15:27:43.441 19568-19646 RKNN com.k2fsa.sherpa.onnx E Meet unsupported input dtype for gather
  218 +# 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
  219 +# 2025-04-15 15:27:43.442 19568-19646 sherpa-onnx com.k2fsa.sherpa.onnx W Return code is: -1
  220 +# 2025-04-15 15:27:43.442 19568-19646 sherpa-onnx com.k2fsa.sherpa.onnx W Failed to run encoder
  221 +#
  222 +# You need to update /vendor/lib64/librknnrt.so and /vendor/lib/librknnrt.so
  223 +#
  224 +# adb root
  225 +# adb remount /vendor
  226 +# adb push ./install/lib/librknnrt.so /vendor/lib64
  227 +# adb push ./install/lib/librknnrt.so /vendor/lib
@@ -98,6 +98,23 @@ fi @@ -98,6 +98,23 @@ fi
98 echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR" 98 echo "SHERPA_ONNXRUNTIME_LIB_DIR: $SHERPA_ONNXRUNTIME_LIB_DIR"
99 echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR" 99 echo "SHERPA_ONNXRUNTIME_INCLUDE_DIR $SHERPA_ONNXRUNTIME_INCLUDE_DIR"
100 100
  101 +if [ -z $SHERPA_ONNX_ENABLE_RKNN ]; then
  102 + SHERPA_ONNX_ENABLE_RKNN=OFF
  103 +fi
  104 +
  105 +if [ $SHERPA_ONNX_ENABLE_RKNN == ON ]; then
  106 + rknn_version=2.2.0
  107 + if [ ! -d ./librknnrt-android ]; then
  108 + rm -fv librknnrt-android.tar.bz2
  109 + wget https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/librknnrt-android.tar.bz2
  110 + tar xvf librknnrt-android.tar.bz2
  111 + rm librknnrt-android.tar.bz2
  112 + fi
  113 +
  114 + export SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR=$PWD/librknnrt-android/v$rknn_version/armeabi-v7a/
  115 + export CPLUS_INCLUDE_PATH=$PWD/librknnrt-android/v$rknn_version/include:$CPLUS_INCLUDE_PATH
  116 +fi
  117 +
101 if [ -z $SHERPA_ONNX_ENABLE_TTS ]; then 118 if [ -z $SHERPA_ONNX_ENABLE_TTS ]; then
102 SHERPA_ONNX_ENABLE_TTS=ON 119 SHERPA_ONNX_ENABLE_TTS=ON
103 fi 120 fi
@@ -136,6 +153,7 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" @@ -136,6 +153,7 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
136 -DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \ 153 -DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \
137 -DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \ 154 -DSHERPA_ONNX_ENABLE_C_API=$SHERPA_ONNX_ENABLE_C_API \
138 -DCMAKE_INSTALL_PREFIX=./install \ 155 -DCMAKE_INSTALL_PREFIX=./install \
  156 + -DSHERPA_ONNX_ENABLE_RKNN=$SHERPA_ONNX_ENABLE_RKNN \
139 -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON \ 157 -DANDROID_ABI="armeabi-v7a" -DANDROID_ARM_NEON=ON \
140 -DANDROID_PLATFORM=android-21 .. 158 -DANDROID_PLATFORM=android-21 ..
141 159
@@ -146,6 +164,11 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" @@ -146,6 +164,11 @@ cmake -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
146 make -j4 164 make -j4
147 make install/strip 165 make install/strip
148 cp -fv $onnxruntime_version/jni/armeabi-v7a/libonnxruntime.so install/lib 2>/dev/null || true 166 cp -fv $onnxruntime_version/jni/armeabi-v7a/libonnxruntime.so install/lib 2>/dev/null || true
  167 +
  168 +if [ $SHERPA_ONNX_ENABLE_RKNN == ON ]; then
  169 + cp -fv $SHERPA_ONNX_RKNN_TOOLKIT2_LIB_DIR/librknnrt.so install/lib
  170 +fi
  171 +
149 rm -rf install/share 172 rm -rf install/share
150 rm -rf install/lib/pkgconfig 173 rm -rf install/lib/pkgconfig
151 rm -rf install/lib/lib*.a 174 rm -rf install/lib/lib*.a
@@ -51,7 +51,9 @@ std::unique_ptr<OnlineRecognizerImpl> OnlineRecognizerImpl::Create( @@ -51,7 +51,9 @@ std::unique_ptr<OnlineRecognizerImpl> OnlineRecognizerImpl::Create(
51 #else 51 #else
52 SHERPA_ONNX_LOGE( 52 SHERPA_ONNX_LOGE(
53 "Please rebuild sherpa-onnx with -DSHERPA_ONNX_ENABLE_RKNN=ON if you " 53 "Please rebuild sherpa-onnx with -DSHERPA_ONNX_ENABLE_RKNN=ON if you "
54 - "want to use rknn. Fallback to CPU"); 54 + "want to use rknn.");
  55 + SHERPA_ONNX_EXIT(-1);
  56 + return nullptr
55 #endif 57 #endif
56 } 58 }
57 59
@@ -108,7 +110,9 @@ std::unique_ptr<OnlineRecognizerImpl> OnlineRecognizerImpl::Create( @@ -108,7 +110,9 @@ std::unique_ptr<OnlineRecognizerImpl> OnlineRecognizerImpl::Create(
108 #else 110 #else
109 SHERPA_ONNX_LOGE( 111 SHERPA_ONNX_LOGE(
110 "Please rebuild sherpa-onnx with -DSHERPA_ONNX_ENABLE_RKNN=ON if you " 112 "Please rebuild sherpa-onnx with -DSHERPA_ONNX_ENABLE_RKNN=ON if you "
111 - "want to use rknn. Fallback to CPU"); 113 + "want to use rknn.");
  114 + SHERPA_ONNX_EXIT(-1);
  115 + return nullptr
112 #endif 116 #endif
113 } 117 }
114 118
@@ -55,9 +55,9 @@ class OnlineRecognizerCtcRknnImpl : public OnlineRecognizerImpl { @@ -55,9 +55,9 @@ class OnlineRecognizerCtcRknnImpl : public OnlineRecognizerImpl {
55 const OnlineRecognizerConfig &config) 55 const OnlineRecognizerConfig &config)
56 : OnlineRecognizerImpl(mgr, config), 56 : OnlineRecognizerImpl(mgr, config),
57 config_(config), 57 config_(config),
58 - model_(  
59 - std::make_unique<OnlineZipformerCtcModelRknn>(config.model_config)),  
60 - sym_(mgr, config.model_config.tokens), 58 + model_(std::make_unique<OnlineZipformerCtcModelRknn>(
  59 + mgr, config_.model_config)),
  60 + sym_(mgr, config_.model_config.tokens),
61 endpoint_(config_.endpoint_config) { 61 endpoint_(config_.endpoint_config) {
62 InitDecoder(); 62 InitDecoder();
63 } 63 }
@@ -111,9 +111,33 @@ class OnlineRecognizerTransducerRknnImpl : public OnlineRecognizerImpl { @@ -111,9 +111,33 @@ class OnlineRecognizerTransducerRknnImpl : public OnlineRecognizerImpl {
111 : OnlineRecognizerImpl(mgr, config), 111 : OnlineRecognizerImpl(mgr, config),
112 config_(config), 112 config_(config),
113 endpoint_(config_.endpoint_config), 113 endpoint_(config_.endpoint_config),
114 - model_(  
115 - std::make_unique<OnlineZipformerTransducerModelRknn>(mgr, config)) {  
116 - // TODO(fangjun): Support Android 114 + model_(std::make_unique<OnlineZipformerTransducerModelRknn>(
  115 + mgr, config_.model_config)) {
  116 + if (!config.model_config.tokens_buf.empty()) {
  117 + sym_ = SymbolTable(config.model_config.tokens_buf, false);
  118 + } else {
  119 + /// assuming tokens_buf and tokens are guaranteed not being both empty
  120 + sym_ = SymbolTable(mgr, config.model_config.tokens);
  121 + }
  122 +
  123 + if (sym_.Contains("<unk>")) {
  124 + unk_id_ = sym_["<unk>"];
  125 + }
  126 +
  127 + if (config.decoding_method == "greedy_search") {
  128 + decoder_ = std::make_unique<OnlineTransducerGreedySearchDecoderRknn>(
  129 + model_.get(), unk_id_);
  130 + } else if (config.decoding_method == "modified_beam_search") {
  131 + decoder_ =
  132 + std::make_unique<OnlineTransducerModifiedBeamSearchDecoderRknn>(
  133 + model_.get(), config.max_active_paths, unk_id_);
  134 + } else {
  135 + SHERPA_ONNX_LOGE(
  136 + "Invalid decoding method: '%s'. Support only greedy_search and "
  137 + "modified_beam_search.",
  138 + config.decoding_method.c_str());
  139 + SHERPA_ONNX_EXIT(-1);
  140 + }
117 } 141 }
118 142
119 std::unique_ptr<OnlineStream> CreateStream() const override { 143 std::unique_ptr<OnlineStream> CreateStream() const override {
@@ -252,7 +252,7 @@ OnlineZipformerCtcModelRknn::OnlineZipformerCtcModelRknn( @@ -252,7 +252,7 @@ OnlineZipformerCtcModelRknn::OnlineZipformerCtcModelRknn(
252 template <typename Manager> 252 template <typename Manager>
253 OnlineZipformerCtcModelRknn::OnlineZipformerCtcModelRknn( 253 OnlineZipformerCtcModelRknn::OnlineZipformerCtcModelRknn(
254 Manager *mgr, const OnlineModelConfig &config) 254 Manager *mgr, const OnlineModelConfig &config)
255 - : impl_(std::make_unique<OnlineZipformerCtcModelRknn>(mgr, config)) {} 255 + : impl_(std::make_unique<Impl>(mgr, config)) {}
256 256
257 std::vector<std::vector<uint8_t>> OnlineZipformerCtcModelRknn::GetInitStates() 257 std::vector<std::vector<uint8_t>> OnlineZipformerCtcModelRknn::GetInitStates()
258 const { 258 const {
@@ -435,8 +435,7 @@ OnlineZipformerTransducerModelRknn::OnlineZipformerTransducerModelRknn( @@ -435,8 +435,7 @@ OnlineZipformerTransducerModelRknn::OnlineZipformerTransducerModelRknn(
435 template <typename Manager> 435 template <typename Manager>
436 OnlineZipformerTransducerModelRknn::OnlineZipformerTransducerModelRknn( 436 OnlineZipformerTransducerModelRknn::OnlineZipformerTransducerModelRknn(
437 Manager *mgr, const OnlineModelConfig &config) 437 Manager *mgr, const OnlineModelConfig &config)
438 - : impl_(std::make_unique<OnlineZipformerTransducerModelRknn>(mgr, config)) {  
439 -} 438 + : impl_(std::make_unique<Impl>(mgr, config)) {}
440 439
441 std::vector<std::vector<uint8_t>> 440 std::vector<std::vector<uint8_t>>
442 OnlineZipformerTransducerModelRknn::GetEncoderInitStates() const { 441 OnlineZipformerTransducerModelRknn::GetEncoderInitStates() const {
@@ -22,22 +22,34 @@ @@ -22,22 +22,34 @@
22 namespace sherpa_onnx { 22 namespace sherpa_onnx {
23 23
24 std::unique_ptr<VadModel> VadModel::Create(const VadModelConfig &config) { 24 std::unique_ptr<VadModel> VadModel::Create(const VadModelConfig &config) {
25 -#if SHERPA_ONNX_ENABLE_RKNN  
26 if (config.provider == "rknn") { 25 if (config.provider == "rknn") {
  26 +#if SHERPA_ONNX_ENABLE_RKNN
27 return std::make_unique<SileroVadModelRknn>(config); 27 return std::make_unique<SileroVadModelRknn>(config);
28 - } 28 +#else
  29 + SHERPA_ONNX_LOGE(
  30 + "Please rebuild sherpa-onnx with -DSHERPA_ONNX_ENABLE_RKNN=ON if you "
  31 + "want to use rknn.");
  32 + SHERPA_ONNX_EXIT(-1);
  33 + return nullptr;
29 #endif 34 #endif
  35 + }
30 return std::make_unique<SileroVadModel>(config); 36 return std::make_unique<SileroVadModel>(config);
31 } 37 }
32 38
33 template <typename Manager> 39 template <typename Manager>
34 std::unique_ptr<VadModel> VadModel::Create(Manager *mgr, 40 std::unique_ptr<VadModel> VadModel::Create(Manager *mgr,
35 const VadModelConfig &config) { 41 const VadModelConfig &config) {
36 -#if SHERPA_ONNX_ENABLE_RKNN  
37 if (config.provider == "rknn") { 42 if (config.provider == "rknn") {
  43 +#if SHERPA_ONNX_ENABLE_RKNN
38 return std::make_unique<SileroVadModelRknn>(mgr, config); 44 return std::make_unique<SileroVadModelRknn>(mgr, config);
39 - } 45 +#else
  46 + SHERPA_ONNX_LOGE(
  47 + "Please rebuild sherpa-onnx with -DSHERPA_ONNX_ENABLE_RKNN=ON if you "
  48 + "want to use rknn.");
  49 + SHERPA_ONNX_EXIT(-1);
  50 + return nullptr;
40 #endif 51 #endif
  52 + }
41 return std::make_unique<SileroVadModel>(mgr, config); 53 return std::make_unique<SileroVadModel>(mgr, config);
42 } 54 }
43 55
@@ -394,6 +394,34 @@ fun getModelConfig(type: Int): OnlineModelConfig? { @@ -394,6 +394,34 @@ fun getModelConfig(type: Int): OnlineModelConfig? {
394 tokens = "$modelDir/tokens.txt", 394 tokens = "$modelDir/tokens.txt",
395 ) 395 )
396 } 396 }
  397 +
  398 + 1000 -> {
  399 + val modelDir = "sherpa-onnx-rk3588-streaming-zipformer-bilingual-zh-en-2023-02-20"
  400 + return OnlineModelConfig(
  401 + transducer = OnlineTransducerModelConfig(
  402 + encoder = "$modelDir/encoder.rknn",
  403 + decoder = "$modelDir/decoder.rknn",
  404 + joiner = "$modelDir/joiner.rknn",
  405 + ),
  406 + tokens = "$modelDir/tokens.txt",
  407 + modelType = "zipformer",
  408 + provider = "rknn",
  409 + )
  410 + }
  411 +
  412 + 1001 -> {
  413 + val modelDir = "sherpa-onnx-rk3588-streaming-zipformer-small-bilingual-zh-en-2023-02-16"
  414 + return OnlineModelConfig(
  415 + transducer = OnlineTransducerModelConfig(
  416 + encoder = "$modelDir/encoder.rknn",
  417 + decoder = "$modelDir/decoder.rknn",
  418 + joiner = "$modelDir/joiner.rknn",
  419 + ),
  420 + tokens = "$modelDir/tokens.txt",
  421 + modelType = "zipformer",
  422 + provider = "rknn",
  423 + )
  424 + }
397 } 425 }
398 return null 426 return null
399 } 427 }