Add KWS examples for Java API (#930)

This commit is contained in:
Fangjun Kuang
2024-05-28 15:49:54 +08:00
committed by GitHub
parent bcaa6df389
commit 5860e45b4c
11 changed files with 295 additions and 2 deletions

View File

@@ -0,0 +1,65 @@
// Copyright 2024 Xiaomi Corporation
// This file shows how to use a keyword spotter model to spot keywords from
// a file.
import com.k2fsa.sherpa.onnx.*;
public class KyewordSpotterFromFile {
public static void main(String[] args) {
// please download test files from https://github.com/k2-fsa/sherpa-onnx/releases/tag/kws-models
String encoder =
"./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/encoder-epoch-12-avg-2-chunk-16-left-64.onnx";
String decoder =
"./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/decoder-epoch-12-avg-2-chunk-16-left-64.onnx";
String joiner =
"./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/joiner-epoch-12-avg-2-chunk-16-left-64.onnx";
String tokens = "./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/tokens.txt";
String keywordsFile =
"./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/test_wavs/test_keywords.txt";
String waveFilename = "./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/test_wavs/3.wav";
OnlineTransducerModelConfig transducer =
OnlineTransducerModelConfig.builder()
.setEncoder(encoder)
.setDecoder(decoder)
.setJoiner(joiner)
.build();
OnlineModelConfig modelConfig =
OnlineModelConfig.builder()
.setTransducer(transducer)
.setTokens(tokens)
.setNumThreads(1)
.setDebug(true)
.build();
KeywordSpotterConfig config =
KeywordSpotterConfig.builder()
.setOnlineModelConfig(modelConfig)
.setKeywordsFile(keywordsFile)
.build();
KeywordSpotter kws = new KeywordSpotter(config);
OnlineStream stream = kws.createStream();
WaveReader reader = new WaveReader(waveFilename);
stream.acceptWaveform(reader.getSamples(), reader.getSampleRate());
float[] tailPaddings = new float[(int) (0.8 * reader.getSampleRate())];
stream.acceptWaveform(tailPaddings, reader.getSampleRate());
while (kws.isReady(stream)) {
kws.decode(stream);
String keyword = kws.getResult(stream).getKeyword();
if (!keyword.isEmpty()) {
System.out.printf("Detected keyword: %s\n", keyword);
}
}
kws.release();
}
}

View File

@@ -68,3 +68,9 @@ The punctuation model supports both English and Chinese.
```bash
./run-vad-non-streaming-paraformer.sh
```
## Keyword spotter
```bash
./run-kws-from-file.sh
```

View File

@@ -91,6 +91,7 @@ public class VadNonStreamingParaformer {
stream.acceptWaveform(segment.getSamples(), 16000);
recognizer.decode(stream);
String text = recognizer.getResult(stream).getText();
stream.release();
if (!text.isEmpty()) {
System.out.printf("%.3f--%.3f: %s\n", startTime, startTime + duration, text);
@@ -100,5 +101,8 @@ public class VadNonStreamingParaformer {
}
}
}
vad.release();
recognizer.release();
}
}

View File

@@ -75,5 +75,7 @@ public class VadRemoveSilence {
String outFilename = "lei-jun-test-no-silence.wav";
WaveWriter.write(outFilename, allSamples, 16000);
System.out.printf("Saved to %s\n", outFilename);
vad.release();
}
}

View File

@@ -0,0 +1,37 @@
#!/usr/bin/env bash
set -ex
if [[ ! -f ../build/lib/libsherpa-onnx-jni.dylib && ! -f ../build/lib/libsherpa-onnx-jni.so ]]; then
mkdir -p ../build
pushd ../build
cmake \
-DSHERPA_ONNX_ENABLE_PYTHON=OFF \
-DSHERPA_ONNX_ENABLE_TESTS=OFF \
-DSHERPA_ONNX_ENABLE_CHECK=OFF \
-DBUILD_SHARED_LIBS=ON \
-DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
-DSHERPA_ONNX_ENABLE_JNI=ON \
..
make -j4
ls -lh lib
popd
fi
if [ ! -f ../sherpa-onnx/java-api/build/sherpa-onnx.jar ]; then
pushd ../sherpa-onnx/java-api
make
popd
fi
if [ ! -f ./sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01/tokens.txt ]; then
curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/kws-models/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2
tar xvf sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2
rm sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01.tar.bz2
fi
java \
-Djava.library.path=$PWD/../build/lib \
-cp ../sherpa-onnx/java-api/build/sherpa-onnx.jar \
./KeywordSpotterFromFile.java