Fangjun Kuang
Committed by GitHub

Add Java API for non-streaming ASR (#807)

正在显示 24 个修改的文件 包含 834 行增加27 行删除
@@ -92,13 +92,9 @@ jobs: @@ -92,13 +92,9 @@ jobs:
92 make -j4 92 make -j4
93 ls -lh lib 93 ls -lh lib
94 94
95 - - name: Run java test 95 + - name: Run java test (Streaming ASR)
96 shell: bash 96 shell: bash
97 run: | 97 run: |
98 - export CMAKE_CXX_COMPILER_LAUNCHER=ccache  
99 - export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"  
100 - cmake --version  
101 -  
102 cd ./java-api-examples 98 cd ./java-api-examples
103 ./run-streaming-decode-file-ctc.sh 99 ./run-streaming-decode-file-ctc.sh
104 # Delete model files to save space 100 # Delete model files to save space
@@ -109,3 +105,16 @@ jobs: @@ -109,3 +105,16 @@ jobs:
109 105
110 ./run-streaming-decode-file-transducer.sh 106 ./run-streaming-decode-file-transducer.sh
111 rm -rf sherpa-onnx-streaming-* 107 rm -rf sherpa-onnx-streaming-*
  108 +
  109 + - name: Run java test (Non-Streaming ASR)
  110 + shell: bash
  111 + run: |
  112 + cd ./java-api-examples
  113 + ./run-non-streaming-decode-file-paraformer.sh
  114 + rm -rf sherpa-onnx-paraformer-zh-*
  115 +
  116 + ./run-non-streaming-decode-file-transducer.sh
  117 + rm -rf sherpa-onnx-zipformer-*
  118 +
  119 + ./run-non-streaming-decode-file-whisper.sh
  120 + rm -rf sherpa-onnx-whisper-*
1 lib 1 lib
2 hs_err* 2 hs_err*
3 !run-streaming*.sh 3 !run-streaming*.sh
  4 +!run-non-streaming*.sh
  1 +// Copyright 2024 Xiaomi Corporation
  2 +
  3 +// This file shows how to use an offline paraformer, i.e., non-streaming paraformer,
  4 +// to decode files.
  5 +import com.k2fsa.sherpa.onnx.*;
  6 +
  7 +public class NonStreamingDecodeFileTransducer {
  8 + public static void main(String[] args) {
  9 + // please refer to
  10 + // https://k2-fsa.github.io/sherpa/onnx/pretrained_models/offline-paraformer/paraformer-models.html#csukuangfj-sherpa-onnx-paraformer-zh-2023-03-28-chinese-english
  11 + // to download model files
  12 + String model = "./sherpa-onnx-paraformer-zh-2023-03-28/model.int8.onnx";
  13 + String tokens = "./sherpa-onnx-paraformer-zh-2023-03-28/tokens.txt";
  14 +
  15 + String waveFilename = "./sherpa-onnx-paraformer-zh-2023-03-28/test_wavs/3-sichuan.wav";
  16 +
  17 + WaveReader reader = new WaveReader(waveFilename);
  18 +
  19 + OfflineParaformerModelConfig paraformer =
  20 + OfflineParaformerModelConfig.builder().setModel(model).build();
  21 +
  22 + OfflineModelConfig modelConfig =
  23 + OfflineModelConfig.builder()
  24 + .setParaformer(paraformer)
  25 + .setTokens(tokens)
  26 + .setNumThreads(1)
  27 + .setDebug(true)
  28 + .build();
  29 +
  30 + OfflineRecognizerConfig config =
  31 + OfflineRecognizerConfig.builder()
  32 + .setOfflineModelConfig(modelConfig)
  33 + .setDecodingMethod("greedy_search")
  34 + .build();
  35 +
  36 + OfflineRecognizer recognizer = new OfflineRecognizer(config);
  37 + OfflineStream stream = recognizer.createStream();
  38 + stream.acceptWaveform(reader.getSamples(), reader.getSampleRate());
  39 +
  40 + recognizer.decode(stream);
  41 +
  42 + String text = recognizer.getResult(stream).getText();
  43 +
  44 + System.out.printf("filename:%s\nresult:%s\n", waveFilename, text);
  45 +
  46 + stream.release();
  47 + recognizer.release();
  48 + }
  49 +}
  1 +// Copyright 2024 Xiaomi Corporation
  2 +
  3 +// This file shows how to use an offline transducer, i.e., non-streaming transducer,
  4 +// to decode files.
  5 +import com.k2fsa.sherpa.onnx.*;
  6 +
  7 +public class NonStreamingDecodeFileTransducer {
  8 + public static void main(String[] args) {
  9 + // please refer to
  10 + // https://k2-fsa.github.io/sherpa/onnx/pretrained_models/offline-transducer/zipformer-transducer-models.html#sherpa-onnx-zipformer-gigaspeech-2023-12-12-english
  11 + // to download model files
  12 + String encoder =
  13 + "./sherpa-onnx-zipformer-gigaspeech-2023-12-12/encoder-epoch-30-avg-1.int8.onnx";
  14 + String decoder = "./sherpa-onnx-zipformer-gigaspeech-2023-12-12/decoder-epoch-30-avg-1.onnx";
  15 + String joiner = "./sherpa-onnx-zipformer-gigaspeech-2023-12-12/joiner-epoch-30-avg-1.onnx";
  16 + String tokens = "./sherpa-onnx-zipformer-gigaspeech-2023-12-12/tokens.txt";
  17 +
  18 + String waveFilename =
  19 + "./sherpa-onnx-zipformer-gigaspeech-2023-12-12/test_wavs/1089-134686-0001.wav";
  20 +
  21 + WaveReader reader = new WaveReader(waveFilename);
  22 +
  23 + OfflineTransducerModelConfig transducer =
  24 + OfflineTransducerModelConfig.builder()
  25 + .setEncoder(encoder)
  26 + .setDecoder(decoder)
  27 + .setJoiner(joiner)
  28 + .build();
  29 +
  30 + OfflineModelConfig modelConfig =
  31 + OfflineModelConfig.builder()
  32 + .setTransducer(transducer)
  33 + .setTokens(tokens)
  34 + .setNumThreads(1)
  35 + .setDebug(true)
  36 + .build();
  37 +
  38 + OfflineRecognizerConfig config =
  39 + OfflineRecognizerConfig.builder()
  40 + .setOfflineModelConfig(modelConfig)
  41 + .setDecodingMethod("greedy_search")
  42 + .build();
  43 +
  44 + OfflineRecognizer recognizer = new OfflineRecognizer(config);
  45 + OfflineStream stream = recognizer.createStream();
  46 + stream.acceptWaveform(reader.getSamples(), reader.getSampleRate());
  47 +
  48 + recognizer.decode(stream);
  49 +
  50 + String text = recognizer.getResult(stream).getText();
  51 +
  52 + System.out.printf("filename:%s\nresult:%s\n", waveFilename, text);
  53 +
  54 + stream.release();
  55 + recognizer.release();
  56 + }
  57 +}
  1 +// Copyright 2024 Xiaomi Corporation
  2 +
  3 +// This file shows how to use an offline whisper, i.e., non-streaming whisper,
  4 +// to decode files.
  5 +import com.k2fsa.sherpa.onnx.*;
  6 +
  7 +public class NonStreamingDecodeFileWhisper {
  8 + public static void main(String[] args) {
  9 + // please refer to
  10 + // https://k2-fsa.github.io/sherpa/onnx/pretrained_models/whisper/tiny.en.html
  11 + // to download model files
  12 + String encoder = "./sherpa-onnx-whisper-tiny.en/tiny.en-encoder.int8.onnx";
  13 + String decoder = "./sherpa-onnx-whisper-tiny.en/tiny.en-decoder.int8.onnx";
  14 + String tokens = "./sherpa-onnx-whisper-tiny.en/tiny.en-tokens.txt";
  15 +
  16 + String waveFilename = "./sherpa-onnx-whisper-tiny.en/test_wavs/1.wav";
  17 +
  18 + WaveReader reader = new WaveReader(waveFilename);
  19 +
  20 + OfflineWhisperModelConfig whisper =
  21 + OfflineWhisperModelConfig.builder().setEncoder(encoder).setDecoder(decoder).build();
  22 +
  23 + OfflineModelConfig modelConfig =
  24 + OfflineModelConfig.builder()
  25 + .setWhisper(whisper)
  26 + .setTokens(tokens)
  27 + .setNumThreads(1)
  28 + .setDebug(true)
  29 + .build();
  30 +
  31 + OfflineRecognizerConfig config =
  32 + OfflineRecognizerConfig.builder()
  33 + .setOfflineModelConfig(modelConfig)
  34 + .setDecodingMethod("greedy_search")
  35 + .build();
  36 +
  37 + OfflineRecognizer recognizer = new OfflineRecognizer(config);
  38 + OfflineStream stream = recognizer.createStream();
  39 + stream.acceptWaveform(reader.getSamples(), reader.getSampleRate());
  40 +
  41 + recognizer.decode(stream);
  42 +
  43 + String text = recognizer.getResult(stream).getText();
  44 +
  45 + System.out.printf("filename:%s\nresult:%s\n", waveFilename, text);
  46 +
  47 + stream.release();
  48 + recognizer.release();
  49 + }
  50 +}
@@ -4,8 +4,18 @@ This directory contains examples for the JAVA API of sherpa-onnx. @@ -4,8 +4,18 @@ This directory contains examples for the JAVA API of sherpa-onnx.
4 4
5 # Usage 5 # Usage
6 6
  7 +## Streaming Speech recognition
  8 +
7 ``` 9 ```
8 ./run-streaming-decode-file-ctc.sh 10 ./run-streaming-decode-file-ctc.sh
9 ./run-streaming-decode-file-paraformer.sh 11 ./run-streaming-decode-file-paraformer.sh
10 ./run-streaming-decode-file-transducer.sh 12 ./run-streaming-decode-file-transducer.sh
11 ``` 13 ```
  14 +
  15 +## Non-Streaming Speech recognition
  16 +
  17 +```bash
  18 +./run-non-streaming-decode-file-paraformer.sh
  19 +./run-non-streaming-decode-file-transducer.sh
  20 +./run-non-streaming-decode-file-whisper.sh
  21 +```
1 -// Copyright 2022-2023 by zhaoming  
2 // Copyright 2024 Xiaomi Corporation 1 // Copyright 2024 Xiaomi Corporation
3 2
4 // This file shows how to use an online CTC model, i.e., streaming CTC model, 3 // This file shows how to use an online CTC model, i.e., streaming CTC model,
@@ -16,8 +15,6 @@ public class StreamingDecodeFileCtc { @@ -16,8 +15,6 @@ public class StreamingDecodeFileCtc {
16 String waveFilename = "./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/test_wavs/8k.wav"; 15 String waveFilename = "./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/test_wavs/8k.wav";
17 16
18 WaveReader reader = new WaveReader(waveFilename); 17 WaveReader reader = new WaveReader(waveFilename);
19 - System.out.println(reader.getSampleRate());  
20 - System.out.println(reader.getSamples().length);  
21 18
22 OnlineZipformer2CtcModelConfig ctc = 19 OnlineZipformer2CtcModelConfig ctc =
23 OnlineZipformer2CtcModelConfig.builder().setModel(model).build(); 20 OnlineZipformer2CtcModelConfig.builder().setModel(model).build();
1 -// Copyright 2022-2023 by zhaoming  
2 // Copyright 2024 Xiaomi Corporation 1 // Copyright 2024 Xiaomi Corporation
3 2
4 // This file shows how to use an online paraformer, i.e., streaming paraformer, 3 // This file shows how to use an online paraformer, i.e., streaming paraformer,
@@ -16,8 +15,6 @@ public class StreamingDecodeFileParaformer { @@ -16,8 +15,6 @@ public class StreamingDecodeFileParaformer {
16 String waveFilename = "./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/2.wav"; 15 String waveFilename = "./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/2.wav";
17 16
18 WaveReader reader = new WaveReader(waveFilename); 17 WaveReader reader = new WaveReader(waveFilename);
19 - System.out.println(reader.getSampleRate());  
20 - System.out.println(reader.getSamples().length);  
21 18
22 OnlineParaformerModelConfig paraformer = 19 OnlineParaformerModelConfig paraformer =
23 OnlineParaformerModelConfig.builder().setEncoder(encoder).setDecoder(decoder).build(); 20 OnlineParaformerModelConfig.builder().setEncoder(encoder).setDecoder(decoder).build();
@@ -22,8 +22,6 @@ public class StreamingDecodeFileTransducer { @@ -22,8 +22,6 @@ public class StreamingDecodeFileTransducer {
22 "./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/test_wavs/0.wav"; 22 "./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/test_wavs/0.wav";
23 23
24 WaveReader reader = new WaveReader(waveFilename); 24 WaveReader reader = new WaveReader(waveFilename);
25 - System.out.println(reader.getSampleRate());  
26 - System.out.println(reader.getSamples().length);  
27 25
28 OnlineTransducerModelConfig transducer = 26 OnlineTransducerModelConfig transducer =
29 OnlineTransducerModelConfig.builder() 27 OnlineTransducerModelConfig.builder()
  1 +#!/usr/bin/env bash
  2 +
  3 +set -ex
  4 +
  5 +if [[ ! -f ../build/lib/libsherpa-onnx-jni.dylib && ! -f ../build/lib/libsherpa-onnx-jni.so ]]; then
  6 + mkdir -p ../build
  7 + pushd ../build
  8 + cmake \
  9 + -DSHERPA_ONNX_ENABLE_PYTHON=OFF \
  10 + -DSHERPA_ONNX_ENABLE_TESTS=OFF \
  11 + -DSHERPA_ONNX_ENABLE_CHECK=OFF \
  12 + -DBUILD_SHARED_LIBS=ON \
  13 + -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
  14 + -DSHERPA_ONNX_ENABLE_JNI=ON \
  15 + ..
  16 +
  17 + make -j4
  18 + ls -lh lib
  19 + popd
  20 +fi
  21 +
  22 +if [ ! -f ../sherpa-onnx/java-api/build/sherpa-onnx.jar ]; then
  23 + pushd ../sherpa-onnx/java-api
  24 + make
  25 + popd
  26 +fi
  27 +
  28 +if [[ ! -f ../build/lib/libsherpa-onnx-jni.dylib && ! -f ../build/lib/libsherpa-onnx-jni.so ]]; then
  29 + cmake \
  30 + -DSHERPA_ONNX_ENABLE_PYTHON=OFF \
  31 + -DSHERPA_ONNX_ENABLE_TESTS=OFF \
  32 + -DSHERPA_ONNX_ENABLE_CHECK=OFF \
  33 + -DBUILD_SHARED_LIBS=ON \
  34 + -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
  35 + -DSHERPA_ONNX_ENABLE_JNI=ON \
  36 + ..
  37 +
  38 + make -j4
  39 + ls -lh lib
  40 +fi
  41 +
  42 +if [ ! -f ./sherpa-onnx-paraformer-zh-2023-03-28/tokens.txt ]; then
  43 + curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-paraformer-zh-2023-03-28.tar.bz2
  44 +
  45 + tar xvf sherpa-onnx-paraformer-zh-2023-03-28.tar.bz2
  46 + rm sherpa-onnx-paraformer-zh-2023-03-28.tar.bz2
  47 +fi
  48 +
  49 +java \
  50 + -Djava.library.path=$PWD/../build/lib \
  51 + -cp ../sherpa-onnx/java-api/build/sherpa-onnx.jar \
  52 + NonStreamingDecodeFileParaformer.java
  1 +#!/usr/bin/env bash
  2 +
  3 +set -ex
  4 +
  5 +if [[ ! -f ../build/lib/libsherpa-onnx-jni.dylib && ! -f ../build/lib/libsherpa-onnx-jni.so ]]; then
  6 + mkdir -p ../build
  7 + pushd ../build
  8 + cmake \
  9 + -DSHERPA_ONNX_ENABLE_PYTHON=OFF \
  10 + -DSHERPA_ONNX_ENABLE_TESTS=OFF \
  11 + -DSHERPA_ONNX_ENABLE_CHECK=OFF \
  12 + -DBUILD_SHARED_LIBS=ON \
  13 + -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
  14 + -DSHERPA_ONNX_ENABLE_JNI=ON \
  15 + ..
  16 +
  17 + make -j4
  18 + ls -lh lib
  19 + popd
  20 +fi
  21 +
  22 +if [ ! -f ../sherpa-onnx/java-api/build/sherpa-onnx.jar ]; then
  23 + pushd ../sherpa-onnx/java-api
  24 + make
  25 + popd
  26 +fi
  27 +
  28 +if [[ ! -f ../build/lib/libsherpa-onnx-jni.dylib && ! -f ../build/lib/libsherpa-onnx-jni.so ]]; then
  29 + cmake \
  30 + -DSHERPA_ONNX_ENABLE_PYTHON=OFF \
  31 + -DSHERPA_ONNX_ENABLE_TESTS=OFF \
  32 + -DSHERPA_ONNX_ENABLE_CHECK=OFF \
  33 + -DBUILD_SHARED_LIBS=ON \
  34 + -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
  35 + -DSHERPA_ONNX_ENABLE_JNI=ON \
  36 + ..
  37 +
  38 + make -j4
  39 + ls -lh lib
  40 +fi
  41 +
  42 +if [ ! -f ./sherpa-onnx-zipformer-gigaspeech-2023-12-12/tokens.txt ]; then
  43 + curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-zipformer-gigaspeech-2023-12-12.tar.bz2
  44 +
  45 + tar xvf sherpa-onnx-zipformer-gigaspeech-2023-12-12.tar.bz2
  46 + rm sherpa-onnx-zipformer-gigaspeech-2023-12-12.tar.bz2
  47 +fi
  48 +
  49 +java \
  50 + -Djava.library.path=$PWD/../build/lib \
  51 + -cp ../sherpa-onnx/java-api/build/sherpa-onnx.jar \
  52 + NonStreamingDecodeFileTransducer.java
  1 +#!/usr/bin/env bash
  2 +
  3 +set -ex
  4 +
  5 +if [[ ! -f ../build/lib/libsherpa-onnx-jni.dylib && ! -f ../build/lib/libsherpa-onnx-jni.so ]]; then
  6 + mkdir -p ../build
  7 + pushd ../build
  8 + cmake \
  9 + -DSHERPA_ONNX_ENABLE_PYTHON=OFF \
  10 + -DSHERPA_ONNX_ENABLE_TESTS=OFF \
  11 + -DSHERPA_ONNX_ENABLE_CHECK=OFF \
  12 + -DBUILD_SHARED_LIBS=ON \
  13 + -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
  14 + -DSHERPA_ONNX_ENABLE_JNI=ON \
  15 + ..
  16 +
  17 + make -j4
  18 + ls -lh lib
  19 + popd
  20 +fi
  21 +
  22 +if [ ! -f ../sherpa-onnx/java-api/build/sherpa-onnx.jar ]; then
  23 + pushd ../sherpa-onnx/java-api
  24 + make
  25 + popd
  26 +fi
  27 +
  28 +if [[ ! -f ../build/lib/libsherpa-onnx-jni.dylib && ! -f ../build/lib/libsherpa-onnx-jni.so ]]; then
  29 + cmake \
  30 + -DSHERPA_ONNX_ENABLE_PYTHON=OFF \
  31 + -DSHERPA_ONNX_ENABLE_TESTS=OFF \
  32 + -DSHERPA_ONNX_ENABLE_CHECK=OFF \
  33 + -DBUILD_SHARED_LIBS=ON \
  34 + -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
  35 + -DSHERPA_ONNX_ENABLE_JNI=ON \
  36 + ..
  37 +
  38 + make -j4
  39 + ls -lh lib
  40 +fi
  41 +
  42 +if [ ! -f ./sherpa-onnx-whisper-tiny.en/tiny.en-tokens.txt ]; then
  43 + curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-whisper-tiny.en.tar.bz2
  44 +
  45 + tar xvf sherpa-onnx-whisper-tiny.en.tar.bz2
  46 + rm sherpa-onnx-whisper-tiny.en.tar.bz2
  47 +fi
  48 +
  49 +java \
  50 + -Djava.library.path=$PWD/../build/lib \
  51 + -cp ../sherpa-onnx/java-api/build/sherpa-onnx.jar \
  52 + NonStreamingDecodeFileWhisper.java
@@ -19,6 +19,15 @@ java_files += OnlineRecognizerConfig.java @@ -19,6 +19,15 @@ java_files += OnlineRecognizerConfig.java
19 java_files += OnlineRecognizerResult.java 19 java_files += OnlineRecognizerResult.java
20 java_files += OnlineRecognizer.java 20 java_files += OnlineRecognizer.java
21 21
  22 +java_files += OfflineTransducerModelConfig.java
  23 +java_files += OfflineParaformerModelConfig.java
  24 +java_files += OfflineWhisperModelConfig.java
  25 +java_files += OfflineModelConfig.java
  26 +java_files += OfflineRecognizerConfig.java
  27 +java_files += OfflineRecognizerResult.java
  28 +java_files += OfflineStream.java
  29 +java_files += OfflineRecognizer.java
  30 +
22 class_files := $(java_files:%.java=%.class) 31 class_files := $(java_files:%.java=%.class)
23 32
24 java_files := $(addprefix src/$(package_dir)/,$(java_files)) 33 java_files := $(addprefix src/$(package_dir)/,$(java_files))
  1 +// Copyright 2024 Xiaomi Corporation
  2 +package com.k2fsa.sherpa.onnx;
  3 +
  4 +public class OfflineModelConfig {
  5 + private final OfflineTransducerModelConfig transducer;
  6 + private final OfflineParaformerModelConfig paraformer;
  7 + private final OfflineWhisperModelConfig whisper;
  8 + private final String tokens;
  9 + private final int numThreads;
  10 + private final boolean debug;
  11 + private final String provider;
  12 +
  13 + private final String modelType;
  14 +
  15 + private OfflineModelConfig(Builder builder) {
  16 + this.transducer = builder.transducer;
  17 + this.paraformer = builder.paraformer;
  18 + this.whisper = builder.whisper;
  19 + this.tokens = builder.tokens;
  20 + this.numThreads = builder.numThreads;
  21 + this.debug = builder.debug;
  22 + this.provider = builder.provider;
  23 + this.modelType = builder.modelType;
  24 + }
  25 +
  26 + public static Builder builder() {
  27 + return new Builder();
  28 + }
  29 +
  30 + public OfflineParaformerModelConfig getParaformer() {
  31 + return paraformer;
  32 + }
  33 +
  34 + public OfflineTransducerModelConfig getTransducer() {
  35 + return transducer;
  36 + }
  37 +
  38 + public OfflineWhisperModelConfig getZipformer2Ctc() {
  39 + return whisper;
  40 + }
  41 +
  42 + public String getTokens() {
  43 + return tokens;
  44 + }
  45 +
  46 + public int getNumThreads() {
  47 + return numThreads;
  48 + }
  49 +
  50 + public boolean getDebug() {
  51 + return debug;
  52 + }
  53 +
  54 + public String getProvider() {
  55 + return provider;
  56 + }
  57 +
  58 + public String getModelType() {
  59 + return modelType;
  60 + }
  61 +
  62 +
  63 + public static class Builder {
  64 + private OfflineParaformerModelConfig paraformer = OfflineParaformerModelConfig.builder().build();
  65 + private OfflineTransducerModelConfig transducer = OfflineTransducerModelConfig.builder().build();
  66 + private OfflineWhisperModelConfig whisper = OfflineWhisperModelConfig.builder().build();
  67 + private String tokens = "";
  68 + private int numThreads = 1;
  69 + private boolean debug = true;
  70 + private String provider = "cpu";
  71 + private String modelType = "";
  72 +
  73 + public OfflineModelConfig build() {
  74 + return new OfflineModelConfig(this);
  75 + }
  76 +
  77 + public Builder setTransducer(OfflineTransducerModelConfig transducer) {
  78 + this.transducer = transducer;
  79 + return this;
  80 + }
  81 +
  82 + public Builder setParaformer(OfflineParaformerModelConfig paraformer) {
  83 + this.paraformer = paraformer;
  84 + return this;
  85 + }
  86 +
  87 + public Builder setWhisper(OfflineWhisperModelConfig whisper) {
  88 + this.whisper = whisper;
  89 + return this;
  90 + }
  91 +
  92 + public Builder setTokens(String tokens) {
  93 + this.tokens = tokens;
  94 + return this;
  95 + }
  96 +
  97 + public Builder setNumThreads(int numThreads) {
  98 + this.numThreads = numThreads;
  99 + return this;
  100 + }
  101 +
  102 + public Builder setDebug(boolean debug) {
  103 + this.debug = debug;
  104 + return this;
  105 + }
  106 +
  107 + public Builder setProvider(String provider) {
  108 + this.provider = provider;
  109 + return this;
  110 + }
  111 +
  112 + public Builder setModelType(String modelType) {
  113 + this.modelType = modelType;
  114 + return this;
  115 + }
  116 + }
  117 +}
  1 +// Copyright 2024 Xiaomi Corporation
  2 +package com.k2fsa.sherpa.onnx;
  3 +
  4 +public class OfflineParaformerModelConfig {
  5 + private final String model;
  6 +
  7 + private OfflineParaformerModelConfig(Builder builder) {
  8 + this.model = builder.model;
  9 + }
  10 +
  11 + public static Builder builder() {
  12 + return new Builder();
  13 + }
  14 +
  15 + public String getModel() {
  16 + return model;
  17 + }
  18 +
  19 +
  20 + public static class Builder {
  21 + private String model = "";
  22 +
  23 + public OfflineParaformerModelConfig build() {
  24 + return new OfflineParaformerModelConfig(this);
  25 + }
  26 +
  27 + public Builder setModel(String model) {
  28 + this.model = model;
  29 + return this;
  30 + }
  31 + }
  32 +}
  1 +// Copyright 2024 Xiaomi Corporation
  2 +package com.k2fsa.sherpa.onnx;
  3 +
  4 +public class OfflineRecognizer {
  5 + static {
  6 + System.loadLibrary("sherpa-onnx-jni");
  7 + }
  8 +
  9 + private long ptr = 0; // this is the asr engine ptrss
  10 +
  11 + public OfflineRecognizer(OfflineRecognizerConfig config) {
  12 + ptr = newFromFile(config);
  13 + }
  14 +
  15 + public void decode(OfflineStream s) {
  16 + decode(ptr, s.getPtr());
  17 + }
  18 +
  19 + public OfflineStream createStream() {
  20 + long p = createStream(ptr);
  21 + return new OfflineStream(p);
  22 + }
  23 +
  24 + @Override
  25 + protected void finalize() throws Throwable {
  26 + release();
  27 + }
  28 +
  29 + // You'd better call it manually if it is not used anymore
  30 + public void release() {
  31 + if (this.ptr == 0) {
  32 + return;
  33 + }
  34 + delete(this.ptr);
  35 + this.ptr = 0;
  36 + }
  37 +
  38 + public OfflineRecognizerResult getResult(OfflineStream s) {
  39 + Object[] arr = getResult(s.getPtr());
  40 + String text = (String) arr[0];
  41 + String[] tokens = (String[]) arr[1];
  42 + float[] timestamps = (float[]) arr[2];
  43 + return new OfflineRecognizerResult(text, tokens, timestamps);
  44 + }
  45 +
  46 + private native void delete(long ptr);
  47 +
  48 + private native long newFromFile(OfflineRecognizerConfig config);
  49 +
  50 + private native long createStream(long ptr);
  51 +
  52 + private native void decode(long ptr, long streamPtr);
  53 +
  54 + private native Object[] getResult(long streamPtr);
  55 +}
  1 +// Copyright 2024 Xiaomi Corporation
  2 +package com.k2fsa.sherpa.onnx;
  3 +
  4 +public class OfflineRecognizerConfig {
  5 + private final FeatureConfig featConfig;
  6 + private final OfflineModelConfig modelConfig;
  7 + private final String decodingMethod;
  8 + private final int maxActivePaths;
  9 + private final String hotwordsFile;
  10 + private final float hotwordsScore;
  11 +
  12 + private OfflineRecognizerConfig(Builder builder) {
  13 + this.featConfig = builder.featConfig;
  14 + this.modelConfig = builder.modelConfig;
  15 + this.decodingMethod = builder.decodingMethod;
  16 + this.maxActivePaths = builder.maxActivePaths;
  17 + this.hotwordsFile = builder.hotwordsFile;
  18 + this.hotwordsScore = builder.hotwordsScore;
  19 + }
  20 +
  21 + public static Builder builder() {
  22 + return new Builder();
  23 + }
  24 +
  25 + public OfflineModelConfig getModelConfig() {
  26 + return modelConfig;
  27 + }
  28 +
  29 + public static class Builder {
  30 + private FeatureConfig featConfig = FeatureConfig.builder().build();
  31 + private OfflineModelConfig modelConfig = OfflineModelConfig.builder().build();
  32 + private String decodingMethod = "greedy_search";
  33 + private int maxActivePaths = 4;
  34 + private String hotwordsFile = "";
  35 + private float hotwordsScore = 1.5f;
  36 +
  37 + public OfflineRecognizerConfig build() {
  38 + return new OfflineRecognizerConfig(this);
  39 + }
  40 +
  41 + public Builder setFeatureConfig(FeatureConfig featConfig) {
  42 + this.featConfig = featConfig;
  43 + return this;
  44 + }
  45 +
  46 + public Builder setOfflineModelConfig(OfflineModelConfig modelConfig) {
  47 + this.modelConfig = modelConfig;
  48 + return this;
  49 + }
  50 +
  51 + public Builder setDecodingMethod(String decodingMethod) {
  52 + this.decodingMethod = decodingMethod;
  53 + return this;
  54 + }
  55 +
  56 + public Builder setMaxActivePaths(int maxActivePaths) {
  57 + this.maxActivePaths = maxActivePaths;
  58 + return this;
  59 + }
  60 +
  61 + public Builder setHotwordsFile(String hotwordsFile) {
  62 + this.hotwordsFile = hotwordsFile;
  63 + return this;
  64 + }
  65 +
  66 + public Builder setHotwordsScore(float hotwordsScore) {
  67 + this.hotwordsScore = hotwordsScore;
  68 + return this;
  69 + }
  70 + }
  71 +}
  1 +// Copyright 2024 Xiaomi Corporation
  2 +package com.k2fsa.sherpa.onnx;
  3 +
  4 +public class OfflineRecognizerResult {
  5 + private final String text;
  6 + private final String[] tokens;
  7 + private final float[] timestamps;
  8 +
  9 + public OfflineRecognizerResult(String text, String[] tokens, float[] timestamps) {
  10 + this.text = text;
  11 + this.tokens = tokens;
  12 + this.timestamps = timestamps;
  13 + }
  14 +
  15 + public String getText() {
  16 + return text;
  17 + }
  18 +
  19 + public String[] getTokens() {
  20 + return tokens;
  21 + }
  22 +
  23 + public float[] getTimestamps() {
  24 + return timestamps;
  25 + }
  26 +}
  1 +// Copyright 2024 Xiaomi Corporation
  2 +package com.k2fsa.sherpa.onnx;
  3 +
  4 +public class OfflineStream {
  5 + static {
  6 + System.loadLibrary("sherpa-onnx-jni");
  7 + }
  8 +
  9 + private long ptr = 0;
  10 +
  11 + public OfflineStream() {
  12 + this.ptr = 0;
  13 + }
  14 +
  15 + public OfflineStream(long ptr) {
  16 + this.ptr = ptr;
  17 + }
  18 +
  19 + public long getPtr() {
  20 + return ptr;
  21 + }
  22 +
  23 + public void setPtr(long ptr) {
  24 + this.ptr = ptr;
  25 + }
  26 +
  27 + public void acceptWaveform(float[] samples, int sampleRate) {
  28 + acceptWaveform(this.ptr, samples, sampleRate);
  29 + }
  30 +
  31 + public void release() {
  32 + // stream object must be release after used
  33 + if (this.ptr == 0) {
  34 + return;
  35 + }
  36 + delete(this.ptr);
  37 + this.ptr = 0;
  38 + }
  39 +
  40 + @Override
  41 + protected void finalize() throws Throwable {
  42 + release();
  43 + super.finalize();
  44 + }
  45 +
  46 + private native void acceptWaveform(long ptr, float[] samples, int sampleRate);
  47 +
  48 + private native void delete(long ptr);
  49 +}
  1 +// Copyright 2024 Xiaomi Corporation
  2 +package com.k2fsa.sherpa.onnx;
  3 +
  4 +public class OfflineTransducerModelConfig {
  5 + private final String encoder;
  6 + private final String decoder;
  7 + private final String joiner;
  8 +
  9 + private OfflineTransducerModelConfig(Builder builder) {
  10 + this.encoder = builder.encoder;
  11 + this.decoder = builder.decoder;
  12 + this.joiner = builder.joiner;
  13 + }
  14 +
  15 + public static Builder builder() {
  16 + return new Builder();
  17 + }
  18 +
  19 + public String getEncoder() {
  20 + return encoder;
  21 + }
  22 +
  23 + public String getDecoder() {
  24 + return decoder;
  25 + }
  26 +
  27 + public String getJoiner() {
  28 + return joiner;
  29 + }
  30 +
  31 + public static class Builder {
  32 + private String encoder = "";
  33 + private String decoder = "";
  34 + private String joiner = "";
  35 +
  36 + public OfflineTransducerModelConfig build() {
  37 + return new OfflineTransducerModelConfig(this);
  38 + }
  39 +
  40 + public Builder setEncoder(String encoder) {
  41 + this.encoder = encoder;
  42 + return this;
  43 + }
  44 +
  45 + public Builder setDecoder(String decoder) {
  46 + this.decoder = decoder;
  47 + return this;
  48 + }
  49 +
  50 + public Builder setJoiner(String joiner) {
  51 + this.joiner = joiner;
  52 + return this;
  53 + }
  54 + }
  55 +}
  1 +// Copyright 2024 Xiaomi Corporation
  2 +package com.k2fsa.sherpa.onnx;
  3 +
  4 +public class OfflineWhisperModelConfig {
  5 + private final String encoder;
  6 + private final String decoder;
  7 + private final String language;
  8 + private final String task;
  9 + private final int tailPaddings;
  10 +
  11 + private OfflineWhisperModelConfig(Builder builder) {
  12 + this.encoder = builder.encoder;
  13 + this.decoder = builder.decoder;
  14 + this.language = builder.language;
  15 + this.task = builder.task;
  16 + this.tailPaddings = builder.tailPaddings;
  17 + }
  18 +
  19 + public static Builder builder() {
  20 + return new Builder();
  21 + }
  22 +
  23 + public String getEncoder() {
  24 + return encoder;
  25 + }
  26 +
  27 + public String getDecoder() {
  28 + return decoder;
  29 + }
  30 +
  31 + public String getLanguage() {
  32 + return language;
  33 + }
  34 +
  35 + public String getTask() {
  36 + return task;
  37 + }
  38 +
  39 + public int getTailPaddings() {
  40 + return tailPaddings;
  41 + }
  42 +
  43 + public static class Builder {
  44 + private String encoder = "";
  45 + private String decoder = "";
  46 + private String language = "en"; // used only with multilingual models
  47 + private String task = "transcribe"; // used only with multilingual models
  48 +
  49 + private int tailPaddings = 1000; // number of frames to pad
  50 +
  51 + public OfflineWhisperModelConfig build() {
  52 + return new OfflineWhisperModelConfig(this);
  53 + }
  54 +
  55 + public Builder setEncoder(String encoder) {
  56 + this.encoder = encoder;
  57 + return this;
  58 + }
  59 +
  60 + public Builder setDecoder(String decoder) {
  61 + this.decoder = decoder;
  62 + return this;
  63 + }
  64 +
  65 + public Builder setLanguage(String language) {
  66 + this.language = language;
  67 + return this;
  68 + }
  69 +
  70 + public Builder setTask(String task) {
  71 + this.task = task;
  72 + return this;
  73 + }
  74 +
  75 + public Builder setTailPaddings(int tailPaddings) {
  76 + this.tailPaddings = tailPaddings;
  77 + return this;
  78 + }
  79 + }
  80 +}
@@ -12,6 +12,7 @@ public class OnlineModelConfig { @@ -12,6 +12,7 @@ public class OnlineModelConfig {
12 private final boolean debug; 12 private final boolean debug;
13 private final String provider; 13 private final String provider;
14 private final String modelType; 14 private final String modelType;
  15 +
15 private OnlineModelConfig(Builder builder) { 16 private OnlineModelConfig(Builder builder) {
16 this.transducer = builder.transducer; 17 this.transducer = builder.transducer;
17 this.paraformer = builder.paraformer; 18 this.paraformer = builder.paraformer;
@@ -15,19 +15,6 @@ public class OnlineRecognizer { @@ -15,19 +15,6 @@ public class OnlineRecognizer {
15 ptr = newFromFile(config); 15 ptr = newFromFile(config);
16 } 16 }
17 17
18 - /*  
19 - public static float[] readWavFile(String fileName) {  
20 - // read data from the filename  
21 - Object[] wavdata = readWave(fileName);  
22 - Object data = wavdata[0]; // data[0] is float data, data[1] sample rate  
23 -  
24 - float[] floatData = (float[]) data;  
25 -  
26 - return floatData;  
27 - }  
28 - */  
29 -  
30 -  
31 public void decode(OnlineStream s) { 18 public void decode(OnlineStream s) {
32 decode(ptr, s.getPtr()); 19 decode(ptr, s.getPtr());
33 } 20 }
@@ -55,7 +42,7 @@ public class OnlineRecognizer { @@ -55,7 +42,7 @@ public class OnlineRecognizer {
55 release(); 42 release();
56 } 43 }
57 44
58 - // recognizer release, you'd better call it manually if not use anymore 45 + // You'd better call it manually if it is not used anymore
59 public void release() { 46 public void release() {
60 if (this.ptr == 0) { 47 if (this.ptr == 0) {
61 return; 48 return;
@@ -12,6 +12,7 @@ public class OnlineRecognizerConfig { @@ -12,6 +12,7 @@ public class OnlineRecognizerConfig {
12 private final int maxActivePaths; 12 private final int maxActivePaths;
13 private final String hotwordsFile; 13 private final String hotwordsFile;
14 private final float hotwordsScore; 14 private final float hotwordsScore;
  15 +
15 private OnlineRecognizerConfig(Builder builder) { 16 private OnlineRecognizerConfig(Builder builder) {
16 this.featConfig = builder.featConfig; 17 this.featConfig = builder.featConfig;
17 this.modelConfig = builder.modelConfig; 18 this.modelConfig = builder.modelConfig;