Skip to content

Commit

Permalink
Add more streaming ASR methods for node-addon-api (#860)
Browse files Browse the repository at this point in the history
  • Loading branch information
csukuangfj committed May 10, 2024
1 parent 46e4e5b commit 65f5161
Show file tree
Hide file tree
Showing 6 changed files with 398 additions and 13 deletions.
4 changes: 4 additions & 0 deletions nodejs-addon-examples/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,13 @@ export LD_LIBRARY_PATH=$PWD/node_modules/sherpa-onnx-linux-arm64:$LD_LIBRARY_PAT
```

## Streaming speech recognition with zipformer transducer

```bash
wget 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

node ./test_asr_streaming_transducer.js

node ./test_asr_streaming_transducer_microphone.js
```
5 changes: 3 additions & 2 deletions nodejs-addon-examples/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"dependencies": {
"sherpa-onnx-node": "*",
"perf_hooks": "*"
"naudiodon2": "^2.4.0",
"perf_hooks": "*",
"sherpa-onnx-node": "*"
}
}
92 changes: 92 additions & 0 deletions nodejs-addon-examples/test_asr_streaming_transducer_microphone.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
// Copyright (c) 2023-2024 Xiaomi Corporation (authors: Fangjun Kuang)
//
const portAudio = require('naudiodon2');
// console.log(portAudio.getDevices());

const sherpa_onnx = require('sherpa-onnx-node');

function createOnlineRecognizer() {
const config = {
'featConfig': {
'sampleRate': 16000,
'featureDim': 80,
},
'modelConfig': {
'transducer': {
'encoder':
'./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.onnx',
'decoder':
'./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/decoder-epoch-99-avg-1.onnx',
'joiner':
'./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/joiner-epoch-99-avg-1.onnx',
},
'tokens':
'./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/tokens.txt',
'numThreads': 2,
'provider': 'cpu',
'debug': 1,
'modelType': 'zipformer',
},
'decodingMethod': 'greedy_search',
'maxActivePaths': 4,
'enableEndpoint': true,
'rule1MinTrailingSilence': 2.4,
'rule2MinTrailingSilence': 1.2,
'rule3MinUtteranceLength': 20
};

return new sherpa_onnx.OnlineRecognizer(config);
}

const recognizer = createOnlineRecognizer();
const stream = recognizer.createStream();

let lastText = '';
let segmentIndex = 0;

const ai = new portAudio.AudioIO({
inOptions: {
channelCount: 1,
closeOnError: true, // Close the stream if an audio error is detected, if
// set false then just log the error
deviceId: -1, // Use -1 or omit the deviceId to select the default device
sampleFormat: portAudio.SampleFormatFloat32,
sampleRate: recognizer.config.featConfig.sampleRate
}
});

const display = new sherpa_onnx.Display(50);

ai.on('data', data => {
const samples = new Float32Array(data.buffer);

stream.acceptWaveform(samples, recognizer.config.featConfig.sampleRate);

while (recognizer.isReady(stream)) {
recognizer.decode(stream);
}

const isEndpoint = recognizer.isEndpoint(stream);
const text = recognizer.getResult(stream).text;

if (text.length > 0 && lastText != text) {
lastText = text;
display.print(segmentIndex, lastText);
}
if (isEndpoint) {
if (text.length > 0) {
lastText = text;
segmentIndex += 1;
}
recognizer.reset(stream)
}
});

ai.on('close', () => {
console.log('Free resources');
stream.free();
recognizer.free();
});

ai.start();
console.log('Started! Please speak')
1 change: 1 addition & 0 deletions scripts/node-addon-api/lib/sherpa-onnx.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ const streaming_asr = require('./streaming-asr.js');
module.exports = {
OnlineRecognizer: streaming_asr.OnlineRecognizer,
readWave: addon.readWave,
Display: streaming_asr.Display,
}
28 changes: 27 additions & 1 deletion scripts/node-addon-api/lib/streaming-asr.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
const addon = require('./addon.js');

class Display {
constructor(maxWordPerline) {
this.handle = addon.createDisplay(maxWordPerline);
}

print(idx, text) {
addon.print(this.handle, idx, text)
}
}

class OnlineStream {
constructor(handle) {
this.handle = handle;
Expand All @@ -10,11 +20,16 @@ class OnlineStream {
addon.acceptWaveformOnline(
this.handle, {samples: samples, sampleRate: sampleRate})
}

inputFinished() {
addon.inputFinished(this.handle)
}
}

class OnlineRecognizer {
constructor(config) {
this.handle = addon.createOnlineRecognizer(config);
this.config = config
}

createStream() {
Expand All @@ -30,6 +45,14 @@ class OnlineRecognizer {
addon.decodeOnlineStream(this.handle, stream.handle);
}

isEndpoint(stream) {
return addon.isEndpoint(this.handle, stream.handle);
}

reset(stream) {
addon.reset(this.handle, stream.handle);
}

getResult(stream) {
const jsonStr =
addon.getOnlineStreamResultAsJson(this.handle, stream.handle);
Expand All @@ -38,4 +61,7 @@ class OnlineRecognizer {
}
}

module.exports = {OnlineRecognizer}
module.exports = {
OnlineRecognizer,
Display
}
Loading

0 comments on commit 65f5161

Please sign in to comment.