diff --git a/.github/scripts/test-dart.sh b/.github/scripts/test-dart.sh index 35c0fa951..0599864c0 100755 --- a/.github/scripts/test-dart.sh +++ b/.github/scripts/test-dart.sh @@ -4,6 +4,30 @@ set -ex cd dart-api-examples +pushd streaming-asr + +echo '----------streaming zipformer ctc HLG----------' +./run-zipformer-ctc-hlg.sh +rm -rf sherpa-onnx-* + +echo '----------streaming zipformer ctc----------' +./run-zipformer-ctc.sh +rm -rf sherpa-onnx-* + +echo '----------streaming zipformer transducer----------' +./run-zipformer-transducer.sh +rm -rf sherpa-onnx-* + +echo '----------streaming NeMo transducer----------' +./run-nemo-transducer.sh +rm -rf sherpa-onnx-* + +echo '----------streaming paraformer----------' +./run-paraformer.sh +rm -rf sherpa-onnx-* + +popd # streaming-asr + pushd non-streaming-asr echo '----------VAD with paraformer----------' @@ -34,7 +58,7 @@ echo '----------zipformer transducer----------' ./run-zipformer-transducer.sh rm -rf sherpa-onnx-* -popd +popd # non-streaming-asr pushd vad ./run.sh diff --git a/.github/workflows/test-dart.yaml b/.github/workflows/test-dart.yaml index ae01373b3..c1605a382 100644 --- a/.github/workflows/test-dart.yaml +++ b/.github/workflows/test-dart.yaml @@ -6,12 +6,14 @@ on: - master paths: - '.github/workflows/test-dart.yaml' + - '.github/scripts/test-dart.sh' - 'dart-api-examples/**' pull_request: branches: - master paths: - '.github/workflows/test-dart.yaml' + - '.github/scripts/test-dart.sh' - 'dart-api-examples/**' workflow_dispatch: @@ -89,5 +91,6 @@ jobs: run: | cp scripts/dart/vad-pubspec.yaml dart-api-examples/vad/pubspec.yaml cp scripts/dart/non-streaming-asr-pubspec.yaml dart-api-examples/non-streaming-asr/pubspec.yaml + cp scripts/dart/streaming-asr-pubspec.yaml dart-api-examples/streaming-asr/pubspec.yaml .github/scripts/test-dart.sh diff --git a/dart-api-examples/non-streaming-asr/bin/nemo-ctc.dart b/dart-api-examples/non-streaming-asr/bin/nemo-ctc.dart index fa90635fd..2565862bb 100644 --- a/dart-api-examples/non-streaming-asr/bin/nemo-ctc.dart +++ b/dart-api-examples/non-streaming-asr/bin/nemo-ctc.dart @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Xiaomi Corporation import 'dart:io'; import 'dart:typed_data'; diff --git a/dart-api-examples/non-streaming-asr/bin/nemo-transducer.dart b/dart-api-examples/non-streaming-asr/bin/nemo-transducer.dart index 881487455..3df8095c6 100644 --- a/dart-api-examples/non-streaming-asr/bin/nemo-transducer.dart +++ b/dart-api-examples/non-streaming-asr/bin/nemo-transducer.dart @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Xiaomi Corporation import 'dart:io'; import 'dart:typed_data'; diff --git a/dart-api-examples/non-streaming-asr/bin/paraformer.dart b/dart-api-examples/non-streaming-asr/bin/paraformer.dart index fd3886788..15f45a1c5 100644 --- a/dart-api-examples/non-streaming-asr/bin/paraformer.dart +++ b/dart-api-examples/non-streaming-asr/bin/paraformer.dart @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Xiaomi Corporation import 'dart:io'; import 'dart:typed_data'; diff --git a/dart-api-examples/non-streaming-asr/bin/telespeech-ctc.dart b/dart-api-examples/non-streaming-asr/bin/telespeech-ctc.dart index b9d21a0d0..633baabef 100644 --- a/dart-api-examples/non-streaming-asr/bin/telespeech-ctc.dart +++ b/dart-api-examples/non-streaming-asr/bin/telespeech-ctc.dart @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Xiaomi Corporation import 'dart:io'; import 'dart:typed_data'; diff --git a/dart-api-examples/non-streaming-asr/bin/vad-with-paraformer.dart b/dart-api-examples/non-streaming-asr/bin/vad-with-paraformer.dart index 1f03ed3e8..5e7cfb485 100644 --- a/dart-api-examples/non-streaming-asr/bin/vad-with-paraformer.dart +++ b/dart-api-examples/non-streaming-asr/bin/vad-with-paraformer.dart @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Xiaomi Corporation import 'dart:io'; import 'dart:typed_data'; diff --git a/dart-api-examples/non-streaming-asr/bin/whisper.dart b/dart-api-examples/non-streaming-asr/bin/whisper.dart index 0e4e0f3d7..1fffcd835 100644 --- a/dart-api-examples/non-streaming-asr/bin/whisper.dart +++ b/dart-api-examples/non-streaming-asr/bin/whisper.dart @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Xiaomi Corporation import 'dart:io'; import 'dart:typed_data'; diff --git a/dart-api-examples/non-streaming-asr/bin/zipformer-transducer.dart b/dart-api-examples/non-streaming-asr/bin/zipformer-transducer.dart index 881487455..3df8095c6 100644 --- a/dart-api-examples/non-streaming-asr/bin/zipformer-transducer.dart +++ b/dart-api-examples/non-streaming-asr/bin/zipformer-transducer.dart @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Xiaomi Corporation import 'dart:io'; import 'dart:typed_data'; diff --git a/dart-api-examples/streaming-asr/.gitignore b/dart-api-examples/streaming-asr/.gitignore new file mode 100644 index 000000000..3a8579040 --- /dev/null +++ b/dart-api-examples/streaming-asr/.gitignore @@ -0,0 +1,3 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ diff --git a/dart-api-examples/streaming-asr/CHANGELOG.md b/dart-api-examples/streaming-asr/CHANGELOG.md new file mode 100644 index 000000000..effe43c82 --- /dev/null +++ b/dart-api-examples/streaming-asr/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 + +- Initial version. diff --git a/dart-api-examples/streaming-asr/README.md b/dart-api-examples/streaming-asr/README.md new file mode 100644 index 000000000..357b5f154 --- /dev/null +++ b/dart-api-examples/streaming-asr/README.md @@ -0,0 +1,11 @@ +# Introduction + +This folder contains examples for streaming ASR with Dart API. +| File | Description| +|------|------------| +|[./bin/nemo-transducer.dart](./bin/nemo-transducer.dart)| Use a NeMo transducer model for speech recognition. See [./run-nemo-transducer.sh](./run-nemo-transducer.sh)| +|[./bin/paraformer.dart](./bin/paraformer.dart)| Use a Paraformer model for speech recognition. See [./run-paraformer.sh](./run-paraformer.sh)| +|[./bin/zipformer-ctc-hlg.dart](./bin/zipformer-ctc-hlg.dart)| Use a Zipformer CTC model with HLG graph for speech recognition. See [./run-zipformer-ctc-hlg.sh](./run-zipformer-ctc-hlg.sh)| +|[./bin/zipformer-ctc.dart](./bin/zipformer-ctc.dart)| Use a Zipformer CTC model for speech recognition. See [./run-zipformer-ctc.sh](./run-zipformer-ctc.sh)| +|[./bin/zipformer-transducer.dart](./bin/zipformer-transducer.dart)| Use a Zipformer transducer model for speech recognition. See [./run-zipformer-transducer.sh](./run-zipformer-transducer.sh)| + diff --git a/dart-api-examples/streaming-asr/analysis_options.yaml b/dart-api-examples/streaming-asr/analysis_options.yaml new file mode 100644 index 000000000..dee8927aa --- /dev/null +++ b/dart-api-examples/streaming-asr/analysis_options.yaml @@ -0,0 +1,30 @@ +# This file configures the static analysis results for your project (errors, +# warnings, and lints). +# +# This enables the 'recommended' set of lints from `package:lints`. +# This set helps identify many issues that may lead to problems when running +# or consuming Dart code, and enforces writing Dart using a single, idiomatic +# style and format. +# +# If you want a smaller set of lints you can change this to specify +# 'package:lints/core.yaml'. These are just the most critical lints +# (the recommended set includes the core lints). +# The core lints are also what is used by pub.dev for scoring packages. + +include: package:lints/recommended.yaml + +# Uncomment the following section to specify additional rules. + +# linter: +# rules: +# - camel_case_types + +# analyzer: +# exclude: +# - path/to/excluded/files/** + +# For more information about the core and recommended set of lints, see +# https://dart.dev/go/core-lints + +# For additional information about configuring this file, see +# https://dart.dev/guides/language/analysis-options diff --git a/dart-api-examples/streaming-asr/bin/init.dart b/dart-api-examples/streaming-asr/bin/init.dart new file mode 120000 index 000000000..48508cfd3 --- /dev/null +++ b/dart-api-examples/streaming-asr/bin/init.dart @@ -0,0 +1 @@ +../../vad/bin/init.dart \ No newline at end of file diff --git a/dart-api-examples/streaming-asr/bin/nemo-transducer.dart b/dart-api-examples/streaming-asr/bin/nemo-transducer.dart new file mode 120000 index 000000000..6e2a04343 --- /dev/null +++ b/dart-api-examples/streaming-asr/bin/nemo-transducer.dart @@ -0,0 +1 @@ +zipformer-transducer.dart \ No newline at end of file diff --git a/dart-api-examples/streaming-asr/bin/paraformer.dart b/dart-api-examples/streaming-asr/bin/paraformer.dart new file mode 100644 index 000000000..5781407df --- /dev/null +++ b/dart-api-examples/streaming-asr/bin/paraformer.dart @@ -0,0 +1,92 @@ +// Copyright (c) 2024 Xiaomi Corporation +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:args/args.dart'; +import 'package:sherpa_onnx/sherpa_onnx.dart' as sherpa_onnx; + +import './init.dart'; + +void main(List arguments) async { + await initSherpaOnnx(); + + final parser = ArgParser() + ..addOption('encoder', help: 'Path to the encoder model') + ..addOption('decoder', help: 'Path to decoder model') + ..addOption('tokens', help: 'Path to tokens.txt') + ..addOption('input-wav', help: 'Path to input.wav to transcribe'); + + final res = parser.parse(arguments); + if (res['encoder'] == null || + res['decoder'] == null || + res['tokens'] == null || + res['input-wav'] == null) { + print(parser.usage); + exit(1); + } + + final encoder = res['encoder'] as String; + final decoder = res['decoder'] as String; + final tokens = res['tokens'] as String; + final inputWav = res['input-wav'] as String; + + final paraformer = sherpa_onnx.OnlineParaformerModelConfig( + encoder: encoder, + decoder: decoder, + ); + + final modelConfig = sherpa_onnx.OnlineModelConfig( + paraformer: paraformer, + tokens: tokens, + debug: true, + numThreads: 1, + ); + final config = sherpa_onnx.OnlineRecognizerConfig(model: modelConfig); + final recognizer = sherpa_onnx.OnlineRecognizer(config); + + final waveData = sherpa_onnx.readWave(inputWav); + final stream = recognizer.createStream(); + + // simulate streaming. You can choose an arbitrary chunk size. + // chunkSize of a single sample is also ok, i.e, chunkSize = 1 + final chunkSize = 1600; // 0.1 second for 16kHz + final numChunks = waveData.samples.length ~/ chunkSize; + + var last = ''; + for (int i = 0; i != numChunks; ++i) { + int start = i * chunkSize; + stream.acceptWaveform( + samples: + Float32List.sublistView(waveData.samples, start, start + chunkSize), + sampleRate: waveData.sampleRate, + ); + while (recognizer.isReady(stream)) { + recognizer.decode(stream); + } + final result = recognizer.getResult(stream); + if (result.text != last && result.text != '') { + last = result.text; + print(last); + } + } + + // 0.5 seconds, assume sampleRate is 16kHz + final tailPaddings = Float32List(8000); + stream.acceptWaveform( + samples: tailPaddings, + sampleRate: waveData.sampleRate, + ); + + while (recognizer.isReady(stream)) { + recognizer.decode(stream); + } + + final result = recognizer.getResult(stream); + + if (result.text != '') { + print(result.text); + } + + stream.free(); + recognizer.free(); +} diff --git a/dart-api-examples/streaming-asr/bin/zipformer-ctc-hlg.dart b/dart-api-examples/streaming-asr/bin/zipformer-ctc-hlg.dart new file mode 100644 index 000000000..6dd95c12b --- /dev/null +++ b/dart-api-examples/streaming-asr/bin/zipformer-ctc-hlg.dart @@ -0,0 +1,94 @@ +// Copyright (c) 2024 Xiaomi Corporation +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:args/args.dart'; +import 'package:sherpa_onnx/sherpa_onnx.dart' as sherpa_onnx; + +import './init.dart'; + +void main(List arguments) async { + await initSherpaOnnx(); + + final parser = ArgParser() + ..addOption('model', help: 'Path to the model') + ..addOption('hlg', help: 'Path to HLG.fst') + ..addOption('tokens', help: 'Path to tokens.txt') + ..addOption('input-wav', help: 'Path to input.wav to transcribe'); + + final res = parser.parse(arguments); + if (res['model'] == null || + res['hlg'] == null || + res['tokens'] == null || + res['input-wav'] == null) { + print(parser.usage); + exit(1); + } + + final model = res['model'] as String; + final hlg = res['hlg'] as String; + final tokens = res['tokens'] as String; + final inputWav = res['input-wav'] as String; + + final ctc = sherpa_onnx.OnlineZipformer2CtcModelConfig( + model: model, + ); + + final modelConfig = sherpa_onnx.OnlineModelConfig( + zipformer2Ctc: ctc, + tokens: tokens, + debug: true, + numThreads: 1, + ); + final config = sherpa_onnx.OnlineRecognizerConfig( + model: modelConfig, + ctcFstDecoderConfig: sherpa_onnx.OnlineCtcFstDecoderConfig(graph: hlg), + ); + final recognizer = sherpa_onnx.OnlineRecognizer(config); + + final waveData = sherpa_onnx.readWave(inputWav); + final stream = recognizer.createStream(); + + // simulate streaming. You can choose an arbitrary chunk size. + // chunkSize of a single sample is also ok, i.e, chunkSize = 1 + final chunkSize = 1600; // 0.1 second for 16kHz + final numChunks = waveData.samples.length ~/ chunkSize; + + var last = ''; + for (int i = 0; i != numChunks; ++i) { + int start = i * chunkSize; + stream.acceptWaveform( + samples: + Float32List.sublistView(waveData.samples, start, start + chunkSize), + sampleRate: waveData.sampleRate, + ); + while (recognizer.isReady(stream)) { + recognizer.decode(stream); + } + final result = recognizer.getResult(stream); + if (result.text != last && result.text != '') { + last = result.text; + print(last); + } + } + + // 0.5 seconds, assume sampleRate is 16kHz + final tailPaddings = Float32List(8000); + stream.acceptWaveform( + samples: tailPaddings, + sampleRate: waveData.sampleRate, + ); + + while (recognizer.isReady(stream)) { + recognizer.decode(stream); + } + + final result = recognizer.getResult(stream); + + if (result.text != '') { + print(result.text); + } + + stream.free(); + recognizer.free(); +} diff --git a/dart-api-examples/streaming-asr/bin/zipformer-ctc.dart b/dart-api-examples/streaming-asr/bin/zipformer-ctc.dart new file mode 100644 index 000000000..f00d66fec --- /dev/null +++ b/dart-api-examples/streaming-asr/bin/zipformer-ctc.dart @@ -0,0 +1,88 @@ +// Copyright (c) 2024 Xiaomi Corporation +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:args/args.dart'; +import 'package:sherpa_onnx/sherpa_onnx.dart' as sherpa_onnx; + +import './init.dart'; + +void main(List arguments) async { + await initSherpaOnnx(); + + final parser = ArgParser() + ..addOption('model', help: 'Path to the model') + ..addOption('tokens', help: 'Path to tokens.txt') + ..addOption('input-wav', help: 'Path to input.wav to transcribe'); + + final res = parser.parse(arguments); + if (res['model'] == null || + res['tokens'] == null || + res['input-wav'] == null) { + print(parser.usage); + exit(1); + } + + final model = res['model'] as String; + final tokens = res['tokens'] as String; + final inputWav = res['input-wav'] as String; + + final ctc = sherpa_onnx.OnlineZipformer2CtcModelConfig( + model: model, + ); + + final modelConfig = sherpa_onnx.OnlineModelConfig( + zipformer2Ctc: ctc, + tokens: tokens, + debug: true, + numThreads: 1, + ); + final config = sherpa_onnx.OnlineRecognizerConfig(model: modelConfig); + final recognizer = sherpa_onnx.OnlineRecognizer(config); + + final waveData = sherpa_onnx.readWave(inputWav); + final stream = recognizer.createStream(); + + // simulate streaming. You can choose an arbitrary chunk size. + // chunkSize of a single sample is also ok, i.e, chunkSize = 1 + final chunkSize = 1600; // 0.1 second for 16kHz + final numChunks = waveData.samples.length ~/ chunkSize; + + var last = ''; + for (int i = 0; i != numChunks; ++i) { + int start = i * chunkSize; + stream.acceptWaveform( + samples: + Float32List.sublistView(waveData.samples, start, start + chunkSize), + sampleRate: waveData.sampleRate, + ); + while (recognizer.isReady(stream)) { + recognizer.decode(stream); + } + final result = recognizer.getResult(stream); + if (result.text != last && result.text != '') { + last = result.text; + print(last); + } + } + + // 0.5 seconds, assume sampleRate is 16kHz + final tailPaddings = Float32List(8000); + stream.acceptWaveform( + samples: tailPaddings, + sampleRate: waveData.sampleRate, + ); + + while (recognizer.isReady(stream)) { + recognizer.decode(stream); + } + + final result = recognizer.getResult(stream); + + if (result.text != '') { + print(result.text); + } + + stream.free(); + recognizer.free(); +} diff --git a/dart-api-examples/streaming-asr/bin/zipformer-transducer.dart b/dart-api-examples/streaming-asr/bin/zipformer-transducer.dart new file mode 100644 index 000000000..438af31e5 --- /dev/null +++ b/dart-api-examples/streaming-asr/bin/zipformer-transducer.dart @@ -0,0 +1,96 @@ +// Copyright (c) 2024 Xiaomi Corporation +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:args/args.dart'; +import 'package:sherpa_onnx/sherpa_onnx.dart' as sherpa_onnx; + +import './init.dart'; + +void main(List arguments) async { + await initSherpaOnnx(); + + final parser = ArgParser() + ..addOption('encoder', help: 'Path to the encoder model') + ..addOption('decoder', help: 'Path to decoder model') + ..addOption('joiner', help: 'Path to joiner model') + ..addOption('tokens', help: 'Path to tokens.txt') + ..addOption('input-wav', help: 'Path to input.wav to transcribe'); + + final res = parser.parse(arguments); + if (res['encoder'] == null || + res['decoder'] == null || + res['joiner'] == null || + res['tokens'] == null || + res['input-wav'] == null) { + print(parser.usage); + exit(1); + } + + final encoder = res['encoder'] as String; + final decoder = res['decoder'] as String; + final joiner = res['joiner'] as String; + final tokens = res['tokens'] as String; + final inputWav = res['input-wav'] as String; + + final transducer = sherpa_onnx.OnlineTransducerModelConfig( + encoder: encoder, + decoder: decoder, + joiner: joiner, + ); + + final modelConfig = sherpa_onnx.OnlineModelConfig( + transducer: transducer, + tokens: tokens, + debug: true, + numThreads: 1, + ); + final config = sherpa_onnx.OnlineRecognizerConfig(model: modelConfig); + final recognizer = sherpa_onnx.OnlineRecognizer(config); + + final waveData = sherpa_onnx.readWave(inputWav); + final stream = recognizer.createStream(); + + // simulate streaming. You can choose an arbitrary chunk size. + // chunkSize of a single sample is also ok, i.e, chunkSize = 1 + final chunkSize = 1600; // 0.1 second for 16kHz + final numChunks = waveData.samples.length ~/ chunkSize; + + var last = ''; + for (int i = 0; i != numChunks; ++i) { + int start = i * chunkSize; + stream.acceptWaveform( + samples: + Float32List.sublistView(waveData.samples, start, start + chunkSize), + sampleRate: waveData.sampleRate, + ); + while (recognizer.isReady(stream)) { + recognizer.decode(stream); + } + final result = recognizer.getResult(stream); + if (result.text != last && result.text != '') { + last = result.text; + print(last); + } + } + + // 0.5 seconds, assume sampleRate is 16kHz + final tailPaddings = Float32List(8000); + stream.acceptWaveform( + samples: tailPaddings, + sampleRate: waveData.sampleRate, + ); + + while (recognizer.isReady(stream)) { + recognizer.decode(stream); + } + + final result = recognizer.getResult(stream); + + if (result.text != '') { + print(result.text); + } + + stream.free(); + recognizer.free(); +} diff --git a/dart-api-examples/streaming-asr/pubspec.lock b/dart-api-examples/streaming-asr/pubspec.lock new file mode 100644 index 000000000..349b3b461 --- /dev/null +++ b/dart-api-examples/streaming-asr/pubspec.lock @@ -0,0 +1,432 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" + url: "https://pub.dev" + source: hosted + version: "67.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" + url: "https://pub.dev" + source: hosted + version: "6.4.1" + args: + dependency: "direct main" + description: + name: args + sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a" + url: "https://pub.dev" + source: hosted + version: "2.5.0" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + coverage: + dependency: transitive + description: + name: coverage + sha256: "3945034e86ea203af7a056d98e98e42a5518fff200d6e8e6647e1886b07e936e" + url: "https://pub.dev" + source: hosted + version: "1.8.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + ffi: + dependency: transitive + description: + name: ffi + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + flutter: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 + url: "https://pub.dev" + source: hosted + version: "4.0.0" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf + url: "https://pub.dev" + source: hosted + version: "0.7.1" + lints: + dependency: "direct dev" + description: + name: lints + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 + url: "https://pub.dev" + source: hosted + version: "3.0.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + meta: + dependency: transitive + description: + name: meta + sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + url: "https://pub.dev" + source: hosted + version: "1.12.0" + mime: + dependency: transitive + description: + name: mime + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: "direct main" + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + url: "https://pub.dev" + source: hosted + version: "1.1.2" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + sherpa_onnx: + dependency: "direct main" + description: + name: sherpa_onnx + sha256: e45894f81e7c854ca96d678bcab5303036e884a7c90e9a6c4ec04c7b1ee215a8 + url: "https://pub.dev" + source: hosted + version: "1.9.29" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" + source: hosted + version: "0.10.12" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test: + dependency: "direct dev" + description: + name: test + sha256: "7ee446762c2c50b3bd4ea96fe13ffac69919352bd3b4b17bac3f3465edc58073" + url: "https://pub.dev" + source: hosted + version: "1.25.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + test_core: + dependency: transitive + description: + name: test_core + sha256: "2bc4b4ecddd75309300d8096f781c0e3280ca1ef85beda558d33fcbedc2eead4" + url: "https://pub.dev" + source: hosted + version: "0.6.0" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: f652077d0bdf60abe4c1f6377448e8655008eef28f128bc023f7b5e8dfeb48fc + url: "https://pub.dev" + source: hosted + version: "14.2.4" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42" + url: "https://pub.dev" + source: hosted + version: "2.4.5" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.4.0 <4.0.0" + flutter: ">=3.3.0" diff --git a/dart-api-examples/streaming-asr/pubspec.yaml b/dart-api-examples/streaming-asr/pubspec.yaml new file mode 100644 index 000000000..372fbf6e3 --- /dev/null +++ b/dart-api-examples/streaming-asr/pubspec.yaml @@ -0,0 +1,20 @@ +name: streaming_asr + +description: > + This example demonstrates how to use the Dart API for streaming speech recognition. + +version: 1.0.0 +# repository: https://github.com/my_org/my_repo + +environment: + sdk: ^3.4.0 + +# Add regular dependencies here. +dependencies: + sherpa_onnx: ^1.9.29 + path: ^1.9.0 + args: ^2.5.0 + +dev_dependencies: + lints: ^3.0.0 + test: ^1.24.0 diff --git a/dart-api-examples/streaming-asr/run-nemo-transducer.sh b/dart-api-examples/streaming-asr/run-nemo-transducer.sh new file mode 100755 index 000000000..5f2f50de6 --- /dev/null +++ b/dart-api-examples/streaming-asr/run-nemo-transducer.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +set -ex + +dart pub get + +if [ ! -f ./sherpa-onnx-nemo-streaming-fast-conformer-transducer-en-80ms/tokens.txt ]; then + curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-nemo-streaming-fast-conformer-transducer-en-80ms.tar.bz2 + tar xvf sherpa-onnx-nemo-streaming-fast-conformer-transducer-en-80ms.tar.bz2 + rm sherpa-onnx-nemo-streaming-fast-conformer-transducer-en-80ms.tar.bz2 +fi + +dart run \ + ./bin/zipformer-transducer.dart \ + --encoder ./sherpa-onnx-nemo-streaming-fast-conformer-transducer-en-80ms/encoder.onnx \ + --decoder ./sherpa-onnx-nemo-streaming-fast-conformer-transducer-en-80ms/decoder.onnx \ + --joiner ./sherpa-onnx-nemo-streaming-fast-conformer-transducer-en-80ms/joiner.onnx \ + --tokens ./sherpa-onnx-nemo-streaming-fast-conformer-transducer-en-80ms/tokens.txt \ + --input-wav ./sherpa-onnx-nemo-streaming-fast-conformer-transducer-en-80ms/test_wavs/0.wav diff --git a/dart-api-examples/streaming-asr/run-paraformer.sh b/dart-api-examples/streaming-asr/run-paraformer.sh new file mode 100755 index 000000000..95a8588ef --- /dev/null +++ b/dart-api-examples/streaming-asr/run-paraformer.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -ex + +dart pub get + +if [ ! -f ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/tokens.txt ]; then + curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-paraformer-bilingual-zh-en.tar.bz2 + tar xvf sherpa-onnx-streaming-paraformer-bilingual-zh-en.tar.bz2 + rm sherpa-onnx-streaming-paraformer-bilingual-zh-en.tar.bz2 +fi + +dart run \ + ./bin/paraformer.dart \ + --encoder ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/encoder.int8.onnx \ + --decoder ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/decoder.int8.onnx \ + --tokens ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/tokens.txt \ + --input-wav ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/0.wav diff --git a/dart-api-examples/streaming-asr/run-zipformer-ctc-hlg.sh b/dart-api-examples/streaming-asr/run-zipformer-ctc-hlg.sh new file mode 100755 index 000000000..2e55406f8 --- /dev/null +++ b/dart-api-examples/streaming-asr/run-zipformer-ctc-hlg.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +set -ex + +dart pub get + +if [ ! -f ./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/tokens.txt ]; then + curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18.tar.bz2 + tar xvf sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18.tar.bz2 + rm sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18.tar.bz2 +fi + +dart run \ + ./bin/zipformer-ctc-hlg.dart \ + --model ./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/ctc-epoch-30-avg-3-chunk-16-left-128.int8.onnx \ + --hlg ./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/HLG.fst \ + --tokens ./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/tokens.txt \ + --input-wav ./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/test_wavs/1.wav diff --git a/dart-api-examples/streaming-asr/run-zipformer-ctc.sh b/dart-api-examples/streaming-asr/run-zipformer-ctc.sh new file mode 100755 index 000000000..26fa00546 --- /dev/null +++ b/dart-api-examples/streaming-asr/run-zipformer-ctc.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash + +set -ex + +dart pub get + +if [ ! -f ./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/tokens.txt ]; then + curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18.tar.bz2 + tar xvf sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18.tar.bz2 + rm sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18.tar.bz2 +fi + +dart run \ + ./bin/zipformer-ctc.dart \ + --model ./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/ctc-epoch-30-avg-3-chunk-16-left-128.int8.onnx \ + --tokens ./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/tokens.txt \ + --input-wav ./sherpa-onnx-streaming-zipformer-ctc-small-2024-03-18/test_wavs/1.wav diff --git a/dart-api-examples/streaming-asr/run-zipformer-transducer.sh b/dart-api-examples/streaming-asr/run-zipformer-transducer.sh new file mode 100755 index 000000000..767d90a8d --- /dev/null +++ b/dart-api-examples/streaming-asr/run-zipformer-transducer.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +set -ex + +dart pub get + +if [ ! -f ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/tokens.txt ]; then + curl -SL -O 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 +fi + +dart run \ + ./bin/zipformer-transducer.dart \ + --encoder ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/encoder-epoch-99-avg-1.int8.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.int8.onnx \ + --tokens ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/tokens.txt \ + --input-wav ./sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20/test_wavs/0.wav diff --git a/dart-api-examples/vad/bin/init.dart b/dart-api-examples/vad/bin/init.dart index 072ff29b8..09f24793c 100644 --- a/dart-api-examples/vad/bin/init.dart +++ b/dart-api-examples/vad/bin/init.dart @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Xiaomi Corporation import 'dart:io'; import 'dart:isolate'; import 'package:path/path.dart' as p; diff --git a/dart-api-examples/vad/bin/vad.dart b/dart-api-examples/vad/bin/vad.dart index 3ef9f66da..01618cc19 100644 --- a/dart-api-examples/vad/bin/vad.dart +++ b/dart-api-examples/vad/bin/vad.dart @@ -1,3 +1,4 @@ +// Copyright (c) 2024 Xiaomi Corporation import 'dart:io'; import 'dart:typed_data'; diff --git a/nodejs-addon-examples/package.json b/nodejs-addon-examples/package.json index 5fb5743af..55298ec94 100644 --- a/nodejs-addon-examples/package.json +++ b/nodejs-addon-examples/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "sherpa-onnx-node": "^1.0.27" + "sherpa-onnx-node": "^1.9.29" } } diff --git a/scripts/dart/streaming-asr-pubspec.yaml b/scripts/dart/streaming-asr-pubspec.yaml new file mode 100644 index 000000000..c9ee9e3ce --- /dev/null +++ b/scripts/dart/streaming-asr-pubspec.yaml @@ -0,0 +1,21 @@ +name: streaming_asr + +description: > + This example demonstrates how to use the Dart API for streaming speech recognition. + +version: 1.0.0 +# repository: https://github.com/my_org/my_repo + +environment: + sdk: ^3.4.0 + +# Add regular dependencies here. +dependencies: + sherpa_onnx: + path: ../../sherpa-onnx/flutter + path: ^1.9.0 + args: ^2.5.0 + +dev_dependencies: + lints: ^3.0.0 + test: ^1.24.0