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 | +// 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; |
-
请 注册 或 登录 后发表评论