Fangjun Kuang
Committed by GitHub

Add script to build APK for simulated-streaming-asr. (#2220)

  1 +name: apk-vad-asr-simulated-streaming
  2 +
  3 +on:
  4 + push:
  5 + branches:
  6 + - apk
  7 + - apk-android-simulate-streaming-asr
  8 +
  9 + workflow_dispatch:
  10 +
  11 +concurrency:
  12 + group: apk-vad-asr-simulated-streaming-${{ github.ref }}
  13 + cancel-in-progress: true
  14 +
  15 +permissions:
  16 + contents: write
  17 +
  18 +jobs:
  19 + simulated_streaming_asr:
  20 + if: github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa'
  21 + runs-on: ${{ matrix.os }}
  22 + name: ${{ matrix.index }}/${{ matrix.total }}
  23 + strategy:
  24 + fail-fast: false
  25 + matrix:
  26 + os: [ubuntu-latest]
  27 + total: ["18"]
  28 + index: ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17"]
  29 +
  30 + steps:
  31 + - uses: actions/checkout@v4
  32 + with:
  33 + fetch-depth: 0
  34 +
  35 + # https://github.com/actions/setup-java
  36 + - uses: actions/setup-java@v4
  37 + with:
  38 + distribution: 'temurin' # See 'Supported distributions' for available options
  39 + java-version: '21'
  40 +
  41 + - name: ccache
  42 + uses: hendrikmuhs/ccache-action@v1.2
  43 + with:
  44 + key: ${{ matrix.os }}-android
  45 +
  46 + - name: Display NDK HOME
  47 + shell: bash
  48 + run: |
  49 + echo "ANDROID_NDK_LATEST_HOME: ${ANDROID_NDK_LATEST_HOME}"
  50 + ls -lh ${ANDROID_NDK_LATEST_HOME}
  51 +
  52 + - name: Install Python dependencies
  53 + shell: bash
  54 + run: |
  55 + python3 -m pip install --upgrade pip jinja2
  56 +
  57 + - name: Setup build tool version variable
  58 + shell: bash
  59 + run: |
  60 + echo "---"
  61 + ls -lh /usr/local/lib/android/
  62 + echo "---"
  63 +
  64 + ls -lh /usr/local/lib/android/sdk
  65 + echo "---"
  66 +
  67 + ls -lh /usr/local/lib/android/sdk/build-tools
  68 + echo "---"
  69 +
  70 + BUILD_TOOL_VERSION=$(ls /usr/local/lib/android/sdk/build-tools/ | tail -n 1)
  71 + echo "BUILD_TOOL_VERSION=$BUILD_TOOL_VERSION" >> $GITHUB_ENV
  72 + echo "Last build tool version is: $BUILD_TOOL_VERSION"
  73 +
  74 + - name: Generate build script
  75 + shell: bash
  76 + run: |
  77 + cd scripts/apk
  78 +
  79 + total=${{ matrix.total }}
  80 + index=${{ matrix.index }}
  81 +
  82 + ./generate-vad-asr-apk-script.py --total $total --index $index
  83 +
  84 + chmod +x build-apk-vad-asr-simulate-streaming.sh
  85 + mv -v ./build-apk-vad-asr-simulate-streaming.sh ../..
  86 +
  87 + - name: build APK
  88 + shell: bash
  89 + run: |
  90 + export CMAKE_CXX_COMPILER_LAUNCHER=ccache
  91 + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
  92 + cmake --version
  93 +
  94 + export ANDROID_NDK=$ANDROID_NDK_LATEST_HOME
  95 + ./build-apk-vad-asr-simulate-streaming.sh
  96 +
  97 + - name: Display APK
  98 + shell: bash
  99 + run: |
  100 + ls -lh ./apks/
  101 + du -h -d1 .
  102 +
  103 + # https://github.com/marketplace/actions/sign-android-release
  104 + - uses: r0adkll/sign-android-release@v1
  105 + name: Sign app APK
  106 + with:
  107 + releaseDirectory: ./apks
  108 + signingKeyBase64: ${{ secrets.ANDROID_SIGNING_KEY }}
  109 + alias: ${{ secrets.ANDROID_SIGNING_KEY_ALIAS }}
  110 + keyStorePassword: ${{ secrets.ANDROID_SIGNING_KEY_STORE_PASSWORD }}
  111 + env:
  112 + BUILD_TOOLS_VERSION: ${{ env.BUILD_TOOL_VERSION }}
  113 +
  114 + - name: Display APK after signing
  115 + shell: bash
  116 + run: |
  117 + ls -lh ./apks/
  118 + du -h -d1 .
  119 +
  120 + - name: Rename APK after signing
  121 + shell: bash
  122 + run: |
  123 + cd apks
  124 + rm -fv signingKey.jks
  125 + rm -fv *.apk.idsig
  126 + rm -fv *-aligned.apk
  127 +
  128 + all_apks=$(ls -1 *-signed.apk)
  129 + echo "----"
  130 + echo $all_apks
  131 + echo "----"
  132 + for apk in ${all_apks[@]}; do
  133 + n=$(echo $apk | sed -e s/-signed//)
  134 + mv -v $apk $n
  135 + done
  136 +
  137 + cd ..
  138 +
  139 + ls -lh ./apks/
  140 + du -h -d1 .
  141 +
  142 + - name: Display APK after rename
  143 + shell: bash
  144 + run: |
  145 + ls -lh ./apks/
  146 + du -h -d1 .
  147 +
  148 + - name: Publish to huggingface
  149 + env:
  150 + HF_TOKEN: ${{ secrets.HF_TOKEN }}
  151 + uses: nick-fields/retry@v3
  152 + with:
  153 + max_attempts: 20
  154 + timeout_seconds: 200
  155 + shell: bash
  156 + command: |
  157 + git config --global user.email "csukuangfj@gmail.com"
  158 + git config --global user.name "Fangjun Kuang"
  159 +
  160 + rm -rf huggingface
  161 + export GIT_LFS_SKIP_SMUDGE=1
  162 + export GIT_CLONE_PROTECTION_ACTIVE=false
  163 +
  164 + SHERPA_ONNX_VERSION=$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2)
  165 + echo "SHERPA_ONNX_VERSION $SHERPA_ONNX_VERSION"
  166 +
  167 + git clone https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-apk huggingface
  168 + cd huggingface
  169 + du -h -d1 .
  170 + git fetch
  171 + git pull
  172 + git merge -m "merge remote" --ff origin main
  173 +
  174 + d=vad-asr-simulated-streaming/$SHERPA_ONNX_VERSION
  175 + mkdir -p $d
  176 + cp -v ../apks/*.apk $d/
  177 + git status
  178 + git lfs track "*.apk"
  179 + git add .
  180 + git commit -m "add more apks"
  181 + git push https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-apk main
  1 +#!/usr/bin/env bash
  2 +#
  3 +# Auto generated! Please DO NOT EDIT!
  4 +
  5 +# Please set the environment variable ANDROID_NDK
  6 +# before running this script
  7 +
  8 +# Inside the $ANDROID_NDK directory, you can find a binary ndk-build
  9 +# and some other files like the file "build/cmake/android.toolchain.cmake"
  10 +
  11 +set -ex
  12 +
  13 +log() {
  14 + # This function is from espnet
  15 + local fname=${BASH_SOURCE[1]##*/}
  16 + echo -e "$(date '+%Y-%m-%d %H:%M:%S') (${fname}:${BASH_LINENO[0]}:${FUNCNAME[1]}) $*"
  17 +}
  18 +
  19 +SHERPA_ONNX_VERSION=$(grep "SHERPA_ONNX_VERSION" ./CMakeLists.txt | cut -d " " -f 2 | cut -d '"' -f 2)
  20 +
  21 +log "Building simulated-streaming VAD + ASR APK for sherpa-onnx v${SHERPA_ONNX_VERSION}"
  22 +
  23 +export SHERPA_ONNX_ENABLE_TTS=OFF
  24 +
  25 +log "====================arm64-v8a================="
  26 +./build-android-arm64-v8a.sh
  27 +log "====================armv7-eabi================"
  28 +./build-android-armv7-eabi.sh
  29 +log "====================x86-64===================="
  30 +./build-android-x86-64.sh
  31 +log "====================x86===================="
  32 +./build-android-x86.sh
  33 +
  34 +mkdir -p apks
  35 +
  36 +{% for model in model_list %}
  37 +pushd ./android/SherpaOnnxSimulateStreamingAsr/app/src/main/assets/
  38 +model_name={{ model.model_name }}
  39 +type={{ model.idx }}
  40 +lang={{ model.lang }}
  41 +short_name={{ model.short_name }}
  42 +
  43 +curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/${model_name}.tar.bz2
  44 +tar xvf ${model_name}.tar.bz2
  45 +
  46 +{{ model.cmd }}
  47 +
  48 +rm -rf *.tar.bz2
  49 +ls -lh $model_name
  50 +
  51 +curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/silero_vad.onnx
  52 +
  53 +popd
  54 +# Now we are at the project root directory
  55 +
  56 +git checkout .
  57 +pushd android/SherpaOnnxSimulateStreamingAsr/app/src/main/java/com/k2fsa/sherpa/onnx/simulate/streaming/asr
  58 +sed -i.bak s/"asrModelType = 15/asrModelType = $type/" ./SimulateStreamingAsr.kt
  59 +
  60 +{% if model.rule_fsts %}
  61 + rule_fsts={{ model.rule_fsts }}
  62 + sed -i.bak s%"asrRuleFsts = null"%"asrRuleFsts = \"$rule_fsts\""% ./MainActivity.kt
  63 +{% endif %}
  64 +
  65 +git diff
  66 +popd
  67 +
  68 +for arch in arm64-v8a armeabi-v7a x86_64 x86; do
  69 + log "------------------------------------------------------------"
  70 + log "build simulated-streaming ASR apk for $arch"
  71 + log "------------------------------------------------------------"
  72 + src_arch=$arch
  73 + if [ $arch == "armeabi-v7a" ]; then
  74 + src_arch=armv7-eabi
  75 + elif [ $arch == "x86_64" ]; then
  76 + src_arch=x86-64
  77 + fi
  78 +
  79 + ls -lh ./build-android-$src_arch/install/lib/*.so
  80 +
  81 + cp -v ./build-android-$src_arch/install/lib/*.so ./android/SherpaOnnxSimulateStreamingAsr/app/src/main/jniLibs/$arch/
  82 +
  83 + pushd ./android/SherpaOnnxSimulateStreamingAsr
  84 + sed -i.bak s/2048/9012/g ./gradle.properties
  85 + git diff ./gradle.properties
  86 + ./gradlew assembleRelease
  87 + popd
  88 +
  89 + mv android/SherpaOnnxSimulateStreamingAsr/app/build/outputs/apk/release/app-release-unsigned.apk ./apks/sherpa-onnx-${SHERPA_ONNX_VERSION}-$arch-simulated_streaming_asr-$lang-$short_name.apk
  90 + ls -lh apks
  91 + rm -v ./android/SherpaOnnxSimulateStreamingAsr/app/src/main/jniLibs/$arch/*.so
  92 +done
  93 +
  94 +rm -rf ./android/SherpaOnnxSimulateStreamingAsr/app/src/main/assets/$model_name
  95 +{% endfor %}
  96 +
  97 +git checkout .
  98 +
  99 +ls -lh apks/
@@ -532,6 +532,22 @@ def get_models(): @@ -532,6 +532,22 @@ def get_models():
532 popd 532 popd
533 """, 533 """,
534 ), 534 ),
  535 + Model(
  536 + model_name="sherpa-onnx-nemo-parakeet-tdt-0.6b-v2-int8",
  537 + idx=30,
  538 + lang="en",
  539 + lang2="English",
  540 + short_name="parakeet_tdt_0.6b_v2",
  541 + cmd="""
  542 + pushd $model_name
  543 +
  544 + rm -rfv test_wavs
  545 +
  546 + ls -lh
  547 +
  548 + popd
  549 + """,
  550 + ),
535 ] 551 ]
536 return models 552 return models
537 553
@@ -567,6 +583,7 @@ def main(): @@ -567,6 +583,7 @@ def main():
567 filename_list = [ 583 filename_list = [
568 "./build-apk-vad-asr.sh", 584 "./build-apk-vad-asr.sh",
569 "./build-hap-vad-asr.sh", 585 "./build-hap-vad-asr.sh",
  586 + "./build-apk-vad-asr-simulate-streaming.sh",
570 ] 587 ]
571 for filename in filename_list: 588 for filename in filename_list:
572 environment = jinja2.Environment() 589 environment = jinja2.Environment()
@@ -546,6 +546,19 @@ fun getOfflineModelConfig(type: Int): OfflineModelConfig? { @@ -546,6 +546,19 @@ fun getOfflineModelConfig(type: Int): OfflineModelConfig? {
546 modelType = "transducer", 546 modelType = "transducer",
547 ) 547 )
548 } 548 }
  549 +
  550 + 30 -> {
  551 + val modelDir = "sherpa-onnx-nemo-parakeet-tdt-0.6b-v2-int8"
  552 + return OfflineModelConfig(
  553 + transducer = OfflineTransducerModelConfig(
  554 + encoder = "$modelDir/encoder.int8.onnx",
  555 + decoder = "$modelDir/decoder.int8.onnx",
  556 + joiner = "$modelDir/joiner.int8.onnx",
  557 + ),
  558 + tokens = "$modelDir/tokens.txt",
  559 + modelType = "nemo_transducer",
  560 + )
  561 + }
549 } 562 }
550 return null 563 return null
551 } 564 }