name: cxx-api on: push: branches: - master - cxx-api-asr-non-streaming paths: - '.github/workflows/cxx-api.yaml' - 'cmake/**' - 'sherpa-onnx/csrc/*' - 'sherpa-onnx/c-api/*' - 'cxx-api-examples/**' pull_request: branches: - master paths: - '.github/workflows/cxx-api.yaml' - 'cmake/**' - 'sherpa-onnx/csrc/*' - 'sherpa-onnx/c-api/*' - 'cxx-api-examples/**' workflow_dispatch: concurrency: group: cxx-api-${{ github.ref }} cancel-in-progress: true jobs: cxx_api: name: ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, ubuntu-22.04-arm] steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: ccache uses: hendrikmuhs/ccache-action@v1.2 with: key: ${{ matrix.os }}-cxx-api-shared - name: Build sherpa-onnx shell: bash run: | export CMAKE_CXX_COMPILER_LAUNCHER=ccache export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" cmake --version mkdir build cd build cmake \ -D CMAKE_BUILD_TYPE=Release \ -D BUILD_SHARED_LIBS=ON \ -D CMAKE_INSTALL_PREFIX=./install \ -D SHERPA_ONNX_ENABLE_BINARY=OFF \ .. make -j2 install ls -lh install/lib ls -lh install/include if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./install/lib/libsherpa-onnx-c-api.so ldd ./install/lib/libsherpa-onnx-cxx-api.so echo "---" readelf -d ./install/lib/libsherpa-onnx-c-api.so readelf -d ./install/lib/libsherpa-onnx-cxx-api.so fi if [[ ${{ matrix.os }} == macos-latest ]]; then otool -L ./install/lib/libsherpa-onnx-c-api.dylib otool -L ./install/lib/libsherpa-onnx-cxx-api.dylib fi - name: Test streaming zipformer with Homophone replacer shell: bash run: | name=streaming-zipformer-with-hr-cxx-api g++ -std=c++17 -o $name ./cxx-api-examples/$name.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime ls -lh $name if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./$name echo "----" readelf -d ./$name fi curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.tar.bz2 tar xvf sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.tar.bz2 rm sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.tar.bz2 ls -lh sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20 echo "---" curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/hr-files/dict.tar.bz2 tar xf dict.tar.bz2 rm dict.tar.bz2 curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/hr-files/replace.fst curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/hr-files/test-hr.wav curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/hr-files/lexicon.txt export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./$name rm -rf sherpa-onnx-streaming-zipformer-* rm -rf dict lexicon.txt test-hr.wav replace.fst rm -v ./$name - name: Test Dolphin CTC shell: bash run: | name=dolphin-ctc-cxx-api g++ -std=c++17 -o $name ./cxx-api-examples/$name.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime ls -lh $name export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./$name echo "----" readelf -d ./$name fi curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-dolphin-base-ctc-multi-lang-int8-2025-04-02.tar.bz2 tar xvf sherpa-onnx-dolphin-base-ctc-multi-lang-int8-2025-04-02.tar.bz2 rm sherpa-onnx-dolphin-base-ctc-multi-lang-int8-2025-04-02.tar.bz2 ./$name rm -rf sherpa-onnx-dolphin-base-ctc-multi-lang-int8-2025-04-02 rm $name - name: Test VAD shell: bash run: | name=vad-cxx-api g++ -std=c++17 -o $name ./cxx-api-examples/$name.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime ls -lh $name export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./$name echo "----" readelf -d ./$name fi curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/lei-jun-test.wav curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/silero_vad.onnx ./$name mkdir vad-test cp -v lei-jun-test*.wav vad-test ls -lh vad-test rm $name - uses: actions/upload-artifact@v4 with: name: vad-test-wavs-cxx-${{ matrix.os }} path: ./vad-test/*.wav - name: Test Speech Enhancement (GTCRN) shell: bash run: | name=speech-enhancement-gtcrn-cxx-api g++ -std=c++17 -o $name ./cxx-api-examples/$name.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime ls -lh $name export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./$name echo "----" readelf -d ./$name fi curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/speech-enhancement-models/gtcrn_simple.onnx curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/speech-enhancement-models/inp_16k.wav ./$name mkdir denoised-wavs cp -v inp_16k.wav denoised-wavs cp -v enhanced_16k.wav denoised-wavs rm $name - uses: actions/upload-artifact@v4 with: name: denoised-wavs-cxx-${{ matrix.os }} path: ./denoised-wavs/*.wav - name: Test FireRedAsr shell: bash run: | g++ -std=c++17 -o fire-red-asr-cxx-api ./cxx-api-examples/fire-red-asr-cxx-api.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime ls -lh fire-red-asr-cxx-api export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./fire-red-asr-cxx-api echo "----" readelf -d ./fire-red-asr-cxx-api fi curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-fire-red-asr-large-zh_en-2025-02-16.tar.bz2 tar xvf sherpa-onnx-fire-red-asr-large-zh_en-2025-02-16.tar.bz2 rm sherpa-onnx-fire-red-asr-large-zh_en-2025-02-16.tar.bz2 ls -lh sherpa-onnx-fire-red-asr-large-zh_en-2025-02-16 echo "---" ls -lh sherpa-onnx-fire-red-asr-large-zh_en-2025-02-16/test_wavs ./fire-red-asr-cxx-api rm -rf sherpa-onnx-fire-red-asr-* - name: Test KWS (zh) shell: bash run: | g++ -std=c++17 -o kws-cxx-api ./cxx-api-examples/kws-cxx-api.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/kws-models/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile.tar.bz2 tar xvf sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile.tar.bz2 rm sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile.tar.bz2 export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./kws-cxx-api rm kws-cxx-api rm -rf sherpa-onnx-kws-* - name: Test Kokoro TTS (zh+en) shell: bash run: | g++ -std=c++17 -o kokoro-tts-zh-en-cxx-api ./cxx-api-examples/kokoro-tts-zh-en-cxx-api.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kokoro-multi-lang-v1_0.tar.bz2 tar xf kokoro-multi-lang-v1_0.tar.bz2 rm kokoro-multi-lang-v1_0.tar.bz2 export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./kokoro-tts-zh-en-cxx-api rm kokoro-tts-zh-en-cxx-api rm -rf kokoro-* - name: Test Kokoro TTS (en) shell: bash run: | g++ -std=c++17 -o kokoro-tts-en-cxx-api ./cxx-api-examples/kokoro-tts-en-cxx-api.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kokoro-en-v0_19.tar.bz2 tar xf kokoro-en-v0_19.tar.bz2 rm kokoro-en-v0_19.tar.bz2 export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./kokoro-tts-en-cxx-api rm kokoro-tts-en-cxx-api rm -rf kokoro-en-* - uses: actions/upload-artifact@v4 with: name: kokoro-tts-${{ matrix.os }} path: ./generated-kokoro-*.wav - name: Test Matcha TTS (zh) shell: bash run: | g++ -std=c++17 -o matcha-tts-zh-cxx-api ./cxx-api-examples/matcha-tts-zh-cxx-api.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/matcha-icefall-zh-baker.tar.bz2 tar xvf matcha-icefall-zh-baker.tar.bz2 rm matcha-icefall-zh-baker.tar.bz2 curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/vocoder-models/vocos-22khz-univ.onnx export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./matcha-tts-zh-cxx-api rm -rf matcha-icefall-* rm vocos-22khz-univ.onnx rm matcha-tts-zh-cxx-api - name: Test Matcha TTS (en) shell: bash run: | g++ -std=c++17 -o matcha-tts-en-cxx-api ./cxx-api-examples/matcha-tts-en-cxx-api.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/matcha-icefall-en_US-ljspeech.tar.bz2 tar xvf matcha-icefall-en_US-ljspeech.tar.bz2 rm matcha-icefall-en_US-ljspeech.tar.bz2 curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/vocoder-models/vocos-22khz-univ.onnx export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./matcha-tts-en-cxx-api rm matcha-tts-en-cxx-api rm -rf matcha-icefall-* rm vocos-22khz-univ.onnx - uses: actions/upload-artifact@v4 with: name: matcha-tts-${{ matrix.os }} path: ./generated-matcha-*.wav - name: Test Moonshine tiny shell: bash run: | g++ -std=c++17 -o moonshine-cxx-api ./cxx-api-examples/moonshine-cxx-api.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-moonshine-tiny-en-int8.tar.bz2 tar xvf sherpa-onnx-moonshine-tiny-en-int8.tar.bz2 rm sherpa-onnx-moonshine-tiny-en-int8.tar.bz2 export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./moonshine-cxx-api rm -rf sherpa-onnx-* rm ./moonshine-cxx-api - name: Test whisper shell: bash run: | g++ -std=c++17 -o whisper-cxx-api ./cxx-api-examples/whisper-cxx-api.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime ls -lh whisper-cxx-api if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./whisper-cxx-api echo "----" readelf -d ./whisper-cxx-api fi curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-whisper-tiny.en.tar.bz2 tar xvf sherpa-onnx-whisper-tiny.en.tar.bz2 rm sherpa-onnx-whisper-tiny.en.tar.bz2 ls -lh sherpa-onnx-whisper-tiny.en echo "---" ls -lh sherpa-onnx-whisper-tiny.en/test_wavs export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./whisper-cxx-api rm -rf sherpa-onnx-whisper-* rm ./whisper-cxx-api - name: Test SenseVoice shell: bash run: | g++ -std=c++17 -o sense-voice-cxx-api ./cxx-api-examples/sense-voice-cxx-api.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime ls -lh sense-voice-cxx-api if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./sense-voice-cxx-api echo "----" readelf -d ./sense-voice-cxx-api fi curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17.tar.bz2 tar xvf sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17.tar.bz2 rm sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17.tar.bz2 ls -lh sherpa-onnx-sense-voice-* echo "---" ls -lh sherpa-onnx-sense-voice-*/test_wavs export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./sense-voice-cxx-api rm -rf sherpa-onnx-sense-voice-* rm ./sense-voice-cxx-api - name: Test streaming zipformer shell: bash run: | g++ -std=c++17 -o streaming-zipformer-cxx-api ./cxx-api-examples/streaming-zipformer-cxx-api.cc \ -I ./build/install/include \ -L ./build/install/lib/ \ -l sherpa-onnx-cxx-api \ -l sherpa-onnx-c-api \ -l onnxruntime ls -lh streaming-zipformer-cxx-api if [[ ${{ matrix.os }} == ubuntu-latest || ${{ matrix.os }} == ubuntu-22.04-arm ]]; then ldd ./streaming-zipformer-cxx-api echo "----" readelf -d ./streaming-zipformer-cxx-api fi curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.tar.bz2 tar xvf sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.tar.bz2 rm sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.tar.bz2 ls -lh sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20 echo "---" ls -lh sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/test_wavs export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH export DYLD_LIBRARY_PATH=$PWD/build/install/lib:$DYLD_LIBRARY_PATH ./streaming-zipformer-cxx-api rm -rf sherpa-onnx-streaming-zipformer-* rm ./streaming-zipformer-cxx-api