Skip to content

Commit c1c0f5b

Browse files
authored
return timestamps for WebAssembly (#737)
1 parent dbff2ea commit c1c0f5b

20 files changed

+88
-34
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
22
project(sherpa-onnx)
33

4-
set(SHERPA_ONNX_VERSION "1.9.15")
4+
set(SHERPA_ONNX_VERSION "1.9.16")
55

66
# Disable warning about
77
#

build-aarch64-linux-gnu.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ cmake \
5757
-DSHERPA_ONNX_ENABLE_CHECK=OFF \
5858
-DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
5959
-DSHERPA_ONNX_ENABLE_JNI=OFF \
60-
-DSHERPA_ONNX_ENABLE_C_API=OFF \
60+
-DSHERPA_ONNX_ENABLE_C_API=ON \
6161
-DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \
6262
-DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake \
6363
..

build-arm-linux-gnueabihf.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ cmake \
5252
-DSHERPA_ONNX_ENABLE_CHECK=OFF \
5353
-DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
5454
-DSHERPA_ONNX_ENABLE_JNI=OFF \
55-
-DSHERPA_ONNX_ENABLE_C_API=OFF \
55+
-DSHERPA_ONNX_ENABLE_C_API=ON \
5656
-DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \
5757
-DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-linux-gnueabihf.toolchain.cmake \
5858
..

build-wasm-simd-nodejs.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ cmake \
5757
-DSHERPA_ONNX_ENABLE_BINARY=OFF \
5858
-DSHERPA_ONNX_LINK_LIBSTDCPP_STATICALLY=OFF \
5959
..
60-
make -j10
60+
make -j3
6161
make install
6262

6363
ls -lh install/bin/wasm/nodejs

nodejs-examples/test-offline-nemo-ctc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ fs.createReadStream(waveFilename, {highWaterMark: 4096})
100100

101101
stream.acceptWaveform(recognizer.config.featConfig.sampleRate, flattened);
102102
recognizer.decode(stream);
103-
const text = recognizer.getResult(stream);
103+
const text = recognizer.getResult(stream).text;
104104
console.log(text);
105105

106106
stream.free();

nodejs-examples/test-offline-paraformer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ fs.createReadStream(waveFilename, {'highWaterMark': 4096})
100100

101101
stream.acceptWaveform(recognizer.config.featConfig.sampleRate, flattened);
102102
recognizer.decode(stream);
103-
const text = recognizer.getResult(stream);
103+
const text = recognizer.getResult(stream).text;
104104
console.log(text);
105105

106106
stream.free();

nodejs-examples/test-offline-transducer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ fs.createReadStream(waveFilename, {'highWaterMark': 4096})
101101

102102
stream.acceptWaveform(recognizer.config.featConfig.sampleRate, flattened);
103103
recognizer.decode(stream);
104-
const text = recognizer.getResult(stream);
104+
const text = recognizer.getResult(stream).text;
105105
console.log(text);
106106

107107
stream.free();

nodejs-examples/test-offline-whisper.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ fs.createReadStream(waveFilename, {'highWaterMark': 4096})
100100

101101
stream.acceptWaveform(recognizer.config.featConfig.sampleRate, flattened);
102102
recognizer.decode(stream);
103-
const text = recognizer.getResult(stream);
103+
const text = recognizer.getResult(stream).text;
104104
console.log(text);
105105

106106
stream.free();

nodejs-examples/test-online-paraformer-microphone.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ ai.on('data', data => {
8686
}
8787

8888
const isEndpoint = recognizer.isEndpoint(stream);
89-
const text = recognizer.getResult(stream);
89+
const text = recognizer.getResult(stream).text;
9090

9191
if (text.length > 0 && lastText != text) {
9292
lastText = text;

nodejs-examples/test-online-paraformer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function decode(samples) {
7575
while (recognizer.isReady(stream)) {
7676
recognizer.decode(stream);
7777
}
78-
const text = recognizer.getResult(stream);
78+
const text = recognizer.getResult(stream).text;
7979
console.log(text);
8080
}
8181

nodejs-examples/test-online-transducer-microphone.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ ai.on('data', data => {
8888
}
8989

9090
const isEndpoint = recognizer.isEndpoint(stream);
91-
const text = recognizer.getResult(stream);
91+
const text = recognizer.getResult(stream).text;
9292

9393
if (text.length > 0 && lastText != text) {
9494
lastText = text;

nodejs-examples/test-online-transducer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ function decode(samples) {
7777
while (recognizer.isReady(stream)) {
7878
recognizer.decode(stream);
7979
}
80-
const text = recognizer.getResult(stream);
80+
const text = recognizer.getResult(stream).text;
8181
console.log(text);
8282
}
8383

nodejs-examples/test-online-zipformer2-ctc-hlg.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ function decode(samples) {
7474
while (recognizer.isReady(stream)) {
7575
recognizer.decode(stream);
7676
}
77-
const text = recognizer.getResult(stream);
77+
const text = recognizer.getResult(stream).text;
7878
console.log(text);
7979
}
8080

nodejs-examples/test-online-zipformer2-ctc.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function decode(samples) {
7575
while (recognizer.isReady(stream)) {
7676
recognizer.decode(stream);
7777
}
78-
const text = recognizer.getResult(stream);
78+
const text = recognizer.getResult(stream).text;
7979
console.log(text);
8080
}
8181

sherpa-onnx/c-api/c-api.cc

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,20 @@ void DestroyOnlineRecognizerResult(const SherpaOnnxOnlineRecognizerResult *r) {
243243
}
244244
}
245245

246+
const char *GetOnlineStreamResultAsJson(
247+
const SherpaOnnxOnlineRecognizer *recognizer,
248+
const SherpaOnnxOnlineStream *stream) {
249+
sherpa_onnx::OnlineRecognizerResult result =
250+
recognizer->impl->GetResult(stream->impl.get());
251+
std::string json = result.AsJsonString();
252+
char *pJson = new char[json.size() + 1];
253+
std::copy(json.begin(), json.end(), pJson);
254+
pJson[json.size()] = 0;
255+
return pJson;
256+
}
257+
258+
void DestroyOnlineStreamResultJson(const char *s) { delete[] s; }
259+
246260
void Reset(const SherpaOnnxOnlineRecognizer *recognizer,
247261
const SherpaOnnxOnlineStream *stream) {
248262
recognizer->impl->Reset(stream->impl.get());
@@ -409,7 +423,7 @@ void DecodeMultipleOfflineStreams(SherpaOnnxOfflineRecognizer *recognizer,
409423
}
410424

411425
const SherpaOnnxOfflineRecognizerResult *GetOfflineStreamResult(
412-
SherpaOnnxOfflineStream *stream) {
426+
const SherpaOnnxOfflineStream *stream) {
413427
const sherpa_onnx::OfflineRecognitionResult &result =
414428
stream->impl->GetResult();
415429
const auto &text = result.text;
@@ -444,6 +458,19 @@ void DestroyOfflineRecognizerResult(
444458
}
445459
}
446460

461+
const char *GetOfflineStreamResultAsJson(
462+
const SherpaOnnxOfflineStream *stream) {
463+
const sherpa_onnx::OfflineRecognitionResult &result =
464+
stream->impl->GetResult();
465+
std::string json = result.AsJsonString();
466+
char *pJson = new char[json.size() + 1];
467+
std::copy(json.begin(), json.end(), pJson);
468+
pJson[json.size()] = 0;
469+
return pJson;
470+
}
471+
472+
void DestroyOfflineStreamResultJson(const char *s) { delete[] s; }
473+
447474
// ============================================================
448475
// For Keyword Spot
449476
// ============================================================

sherpa-onnx/c-api/c-api.h

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,16 @@ SHERPA_ONNX_API const SherpaOnnxOnlineRecognizerResult *GetOnlineStreamResult(
286286
SHERPA_ONNX_API void DestroyOnlineRecognizerResult(
287287
const SherpaOnnxOnlineRecognizerResult *r);
288288

289+
/// Return the result as a json string.
290+
/// The user has to invoke
291+
/// DestroyOnlineStreamResultJson()
292+
/// to free the returned pointer to avoid memory leak
293+
SHERPA_ONNX_API const char *GetOnlineStreamResultAsJson(
294+
const SherpaOnnxOnlineRecognizer *recognizer,
295+
const SherpaOnnxOnlineStream *stream);
296+
297+
SHERPA_ONNX_API void DestroyOnlineStreamResultJson(const char *s);
298+
289299
/// Reset an OnlineStream , which clears the neural network model state
290300
/// and the state for decoding.
291301
///
@@ -482,14 +492,22 @@ SHERPA_ONNX_API typedef struct SherpaOnnxOfflineRecognizerResult {
482492
/// DestroyOnlineRecognizerResult() to free the returned pointer to
483493
/// avoid memory leak.
484494
SHERPA_ONNX_API const SherpaOnnxOfflineRecognizerResult *GetOfflineStreamResult(
485-
SherpaOnnxOfflineStream *stream);
495+
const SherpaOnnxOfflineStream *stream);
486496

487497
/// Destroy the pointer returned by GetOfflineStreamResult().
488498
///
489499
/// @param r A pointer returned by GetOfflineStreamResult()
490500
SHERPA_ONNX_API void DestroyOfflineRecognizerResult(
491501
const SherpaOnnxOfflineRecognizerResult *r);
492502

503+
/// Return the result as a json string.
504+
/// The user has to use DestroyOfflineStreamResultJson()
505+
/// to free the returned pointer to avoid memory leak
506+
SHERPA_ONNX_API const char *GetOfflineStreamResultAsJson(
507+
const SherpaOnnxOfflineStream *stream);
508+
509+
SHERPA_ONNX_API void DestroyOfflineStreamResultJson(const char *s);
510+
493511
// ============================================================
494512
// For Keyword Spot
495513
// ============================================================

wasm/asr/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@ set(exported_functions
1313
CreateOnlineRecognizer
1414
CreateOnlineStream
1515
DecodeOnlineStream
16+
DestroyOfflineStreamResultJson
1617
DestroyOnlineRecognizer
1718
DestroyOnlineRecognizerResult
1819
DestroyOnlineStream
20+
DestroyOnlineStreamResultJson
21+
GetOfflineStreamResultAsJson
1922
GetOnlineStreamResult
23+
GetOnlineStreamResultAsJson
2024
InputFinished
2125
IsEndpoint
2226
IsOnlineStreamReady

wasm/asr/app-asr.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ if (navigator.mediaDevices.getUserMedia) {
108108
}
109109

110110
let isEndpoint = recognizer.isEndpoint(recognizer_stream);
111-
let result = recognizer.getResult(recognizer_stream);
111+
let result = recognizer.getResult(recognizer_stream).text;
112112

113113

114114
if (result.length > 0 && lastResult != result) {

wasm/asr/sherpa-onnx-asr.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -661,13 +661,12 @@ class OfflineRecognizer {
661661
}
662662

663663
getResult(stream) {
664-
const r = this.Module._GetOfflineStreamResult(stream.handle);
664+
const r = this.Module._GetOfflineStreamResultAsJson(stream.handle);
665+
const jsonStr = this.Module.UTF8ToString(r);
666+
const ans = JSON.parse(jsonStr);
667+
this.Module._DestroyOfflineStreamResultJson(r);
665668

666-
const textPtr = this.Module.getValue(r, 'i8*');
667-
const text = this.Module.UTF8ToString(textPtr);
668-
669-
this.Module._DestroyOfflineRecognizerResult(r);
670-
return text;
669+
return ans;
671670
}
672671
};
673672

@@ -750,11 +749,13 @@ class OnlineRecognizer {
750749
}
751750

752751
getResult(stream) {
753-
const r = this.Module._GetOnlineStreamResult(this.handle, stream.handle);
754-
const textPtr = this.Module.getValue(r, 'i8*');
755-
const text = this.Module.UTF8ToString(textPtr);
756-
this.Module._DestroyOnlineRecognizerResult(r);
757-
return text;
752+
const r =
753+
this.Module._GetOnlineStreamResultAsJson(this.handle, stream.handle);
754+
const jsonStr = this.Module.UTF8ToString(r);
755+
const ans = JSON.parse(jsonStr);
756+
this.Module._DestroyOnlineStreamResultJson(r);
757+
758+
return ans;
758759
}
759760
}
760761

wasm/nodejs/CMakeLists.txt

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,26 @@ set(exported_functions
2121
DestroyOnlineRecognizer
2222
DestroyOnlineRecognizerResult
2323
DestroyOnlineStream
24+
DestroyOnlineStreamResultJson
2425
GetOnlineStreamResult
26+
GetOnlineStreamResultAsJson
2527
InputFinished
2628
IsEndpoint
2729
IsOnlineStreamReady
2830
Reset
2931
# non-streaming ASR
30-
PrintOfflineRecognizerConfig
32+
AcceptWaveformOffline
3133
CreateOfflineRecognizer
32-
DestroyOfflineRecognizer
3334
CreateOfflineStream
34-
DestroyOfflineStream
35-
AcceptWaveformOffline
36-
DecodeOfflineStream
3735
DecodeMultipleOfflineStreams
38-
GetOfflineStreamResult
36+
DecodeOfflineStream
37+
DestroyOfflineRecognizer
3938
DestroyOfflineRecognizerResult
39+
DestroyOfflineStream
40+
DestroyOfflineStreamResultJson
41+
GetOfflineStreamResult
42+
GetOfflineStreamResultAsJson
43+
PrintOfflineRecognizerConfig
4044
# online kws
4145
CreateKeywordSpotter
4246
DestroyKeywordSpotter

0 commit comments

Comments
 (0)