Add VAD example for Dart API (#996)

This commit is contained in:
Fangjun Kuang
2024-06-14 10:37:16 +08:00
committed by GitHub
parent c214d8fb74
commit d08cc04567
33 changed files with 883 additions and 142 deletions

View File

@@ -0,0 +1,11 @@
## 0.0.3
* Fix path separator on Windows.
## 0.0.2
* Support specifying lib path.
## 0.0.1
* Initial release.

View File

@@ -14,24 +14,40 @@ export 'src/wave_writer.dart';
import 'src/sherpa_onnx_bindings.dart';
String? _path;
final DynamicLibrary _dylib = () {
if (Platform.isIOS) {
throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}');
}
if (Platform.isMacOS) {
return DynamicLibrary.open('libsherpa-onnx-c-api.dylib');
if (_path == null) {
return DynamicLibrary.open('libsherpa-onnx-c-api.dylib');
} else {
return DynamicLibrary.open('${_path}/libsherpa-onnx-c-api.dylib');
}
}
if (Platform.isAndroid || Platform.isLinux) {
return DynamicLibrary.open('libsherpa-onnx-c-api.so');
if (_path == null) {
return DynamicLibrary.open('libsherpa-onnx-c-api.so');
} else {
return DynamicLibrary.open('${_path}/libsherpa-onnx-c-api.so');
}
}
if (Platform.isWindows) {
return DynamicLibrary.open('sherpa-onnx-c-api.dll');
if (_path == null) {
return DynamicLibrary.open('sherpa-onnx-c-api.dll');
} else {
return DynamicLibrary.open('${_path}\\sherpa-onnx-c-api.dll');
}
}
throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}');
}();
void initBindings() {
void initBindings([String? p]) {
_path ??= p;
SherpaOnnxBindings.init(_dylib);
}

View File

@@ -1,7 +1,6 @@
// Copyright (c) 2024 Xiaomi Corporation
import 'dart:convert';
import 'dart:ffi';
import 'dart:typed_data';
import 'package:ffi/ffi.dart';
@@ -262,7 +261,7 @@ class OfflineRecognizer {
final json =
SherpaOnnxBindings.getOfflineStreamResultAsJson?.call(stream.ptr) ??
nullptr;
if (json == null) {
if (json == nullptr) {
return OfflineRecognizerResult(text: '', tokens: [], timestamps: []);
}

View File

@@ -28,7 +28,7 @@ class OfflineStream {
final pList = p.asTypedList(n);
pList.setAll(0, samples);
SherpaOnnxBindings.acceptWaveformOffline?.call(this.ptr, sampleRate, p, n);
SherpaOnnxBindings.acceptWaveformOffline?.call(ptr, sampleRate, p, n);
calloc.free(p);
}

View File

@@ -1,7 +1,6 @@
// Copyright (c) 2024 Xiaomi Corporation
import 'dart:convert';
import 'dart:ffi';
import 'dart:typed_data';
import 'package:ffi/ffi.dart';
@@ -247,7 +246,7 @@ class OnlineRecognizer {
final json =
SherpaOnnxBindings.getOnlineStreamResultAsJson?.call(ptr, stream.ptr) ??
nullptr;
if (json == null) {
if (json == nullptr) {
return OnlineRecognizerResult(text: '', tokens: [], timestamps: []);
}

View File

@@ -28,8 +28,7 @@ class OnlineStream {
final pList = p.asTypedList(n);
pList.setAll(0, samples);
SherpaOnnxBindings.onlineStreamAcceptWaveform
?.call(this.ptr, sampleRate, p, n);
SherpaOnnxBindings.onlineStreamAcceptWaveform?.call(ptr, sampleRate, p, n);
calloc.free(p);
}

View File

@@ -553,13 +553,10 @@ typedef DestroyOnlineStreamNative = Void Function(
typedef DestroyOnlineStream = void Function(Pointer<SherpaOnnxOnlineStream>);
typedef OnlineStreamAcceptWaveformNative = Void Function(
Pointer<SherpaOnnxOnlineStream>,
Int32 sample_rate,
Pointer<Float>,
Int32 n);
Pointer<SherpaOnnxOnlineStream>, Int32, Pointer<Float>, Int32);
typedef OnlineStreamAcceptWaveform = void Function(
Pointer<SherpaOnnxOnlineStream>, int sample_rate, Pointer<Float>, int n);
Pointer<SherpaOnnxOnlineStream>, int, Pointer<Float>, int);
typedef OnlineStreamInputFinishedNative = Void Function(
Pointer<SherpaOnnxOnlineStream>);

View File

@@ -106,8 +106,8 @@ class CircularBuffer {
SherpaOnnxBindings.circularBufferReset?.call(this.ptr);
}
int get size => SherpaOnnxBindings.circularBufferSize?.call(this.ptr) ?? 0;
int get head => SherpaOnnxBindings.circularBufferHead?.call(this.ptr) ?? 0;
int get size => SherpaOnnxBindings.circularBufferSize?.call(ptr) ?? 0;
int get head => SherpaOnnxBindings.circularBufferHead?.call(ptr) ?? 0;
Pointer<SherpaOnnxCircularBuffer> ptr;
}
@@ -159,38 +159,36 @@ class VoiceActivityDetector {
final pList = p.asTypedList(n);
pList.setAll(0, samples);
SherpaOnnxBindings.voiceActivityDetectorAcceptWaveform
?.call(this.ptr, p, n);
SherpaOnnxBindings.voiceActivityDetectorAcceptWaveform?.call(ptr, p, n);
calloc.free(p);
}
bool isEmpty() {
final int empty =
SherpaOnnxBindings.voiceActivityDetectorEmpty?.call(this.ptr) ?? 0;
SherpaOnnxBindings.voiceActivityDetectorEmpty?.call(ptr) ?? 0;
return empty == 1;
}
bool isDetected() {
final int detected =
SherpaOnnxBindings.voiceActivityDetectorDetected?.call(this.ptr) ?? 0;
SherpaOnnxBindings.voiceActivityDetectorDetected?.call(ptr) ?? 0;
return detected == 1;
}
void pop() {
SherpaOnnxBindings.voiceActivityDetectorPop?.call(this.ptr);
SherpaOnnxBindings.voiceActivityDetectorPop?.call(ptr);
}
void clear() {
SherpaOnnxBindings.voiceActivityDetectorClear?.call(this.ptr);
SherpaOnnxBindings.voiceActivityDetectorClear?.call(ptr);
}
SpeechSegment front() {
final Pointer<SherpaOnnxSpeechSegment> segment =
SherpaOnnxBindings.voiceActivityDetectorFront?.call(this.ptr) ??
nullptr;
SherpaOnnxBindings.voiceActivityDetectorFront?.call(ptr) ?? nullptr;
if (segment == nullptr) {
return SpeechSegment(samples: Float32List(0), start: 0);
}
@@ -206,7 +204,7 @@ class VoiceActivityDetector {
}
void reset() {
SherpaOnnxBindings.voiceActivityDetectorReset?.call(this.ptr);
SherpaOnnxBindings.voiceActivityDetectorReset?.call(ptr);
}
Pointer<SherpaOnnxVoiceActivityDetector> ptr;

View File

@@ -43,3 +43,20 @@ dart analyze
FLUTTER_XCODE_ARCHS=arm64
FLUTTER_XCODE_ARCHS=x86_64
```
## Examples
- https://dart.dev/tools/pub/automated-publishing
Use GitHub actions to publish
- https://dart.dev/tools/pub/pubspec
It describes the format of ./pubspec.yaml
- https://github.com/folksable/blurhash_ffi/
It supports ios, android, linux, macos, and windows.
- https://github.com/alexmercerind/dart_vlc
- https://github.com/dart-lang/native/tree/main/pkgs/jni

View File

@@ -1,17 +1,24 @@
name: sherpa_onnx
description: >
Dart bindings for sherpa-onnx.
repository: https://github.com/k2-fsa/sherpa-onnx/tree/main/sherpa-onnx/flutter
Speech recognition, speech synthesis, and speaker recognition using next-gen Kaldi
with onnxruntime without Internet connection.
repository: https://github.com/k2-fsa/sherpa-onnx/tree/master/sherpa-onnx/flutter
issue_tracker: https://github.com/k2-fsa/sherpa-onnx/issues
documentation: https://k2-fsa.github.io/sherpa/onnx/
topics:
- speech-to-text
- text-to-speech
- speech-recognition
- speech-synthesis
- speaker-identification
- spoken-language-identification
- audio-tagging
- voice-activity-detection
# remember to change the version in macos/sherpa_onnx.podspec
version: 0.0.1
version: 0.0.2
homepage: https://github.com/k2-fsa/sherpa-onnx
environment:
@@ -22,30 +29,14 @@ dependencies:
ffi: ^2.1.0
flutter:
sdk: flutter
plugin_platform_interface: ^2.0.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^3.0.0
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# The following section is specific to Flutter packages.
flutter:
# This section identifies this Flutter project as a plugin project.
# The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.)
# which should be registered in the plugin registry. This is required for
# using method channels.
# The Android 'package' specifies package in which the registered class is.
# This is required for using method channels on Android.
# The 'ffiPlugin' specifies that native code should be built and bundled.
# This is required for using `dart:ffi`.
# All these are used by the tooling to maintain consistency when
# adding or updating assets for this project.
#
# Please refer to README.md for a detailed explanation.
plugin:
platforms:
macos:
@@ -54,34 +45,3 @@ flutter:
ffiPlugin: true
linux:
ffiPlugin: true
# To add assets to your plugin package, add an assets section, like this:
# assets:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
#
# For details regarding assets in packages, see
# https://flutter.dev/assets-and-images/#from-packages
#
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware
# To add custom fonts to your plugin package, add a fonts section here,
# in this "flutter" section. Each entry in this list should have a
# "family" key with the font family name, and a "fonts" key with a
# list giving the asset and other descriptors for the font. For
# example:
# fonts:
# - family: Schyler
# fonts:
# - asset: fonts/Schyler-Regular.ttf
# - asset: fonts/Schyler-Italic.ttf
# style: italic
# - family: Trajan Pro
# fonts:
# - asset: fonts/TrajanPro.ttf
# - asset: fonts/TrajanPro_Bold.ttf
# weight: 700
#
# For details regarding fonts in packages, see
# https://flutter.dev/custom-fonts/#from-packages

View File

@@ -19,9 +19,9 @@ set(sherpa_onnx_bundled_libraries
"${CMAKE_CURRENT_SOURCE_DIR}/sherpa-onnx-c-api.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/sherpa-onnx-core.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/kaldi-decoder-core.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/sherpa-onnx-kaldifst-core.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/sherpa-onnx-fstfar.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/sherpa-onnx-fst.lib"
"${CMAKE_CURRENT_SOURCE_DIR}/sherpa-onnx-kaldifst-core.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/sherpa-onnx-fstfar.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/sherpa-onnx-fst.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/kaldi-native-fbank-core.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/piper_phonemize.dll"
"${CMAKE_CURRENT_SOURCE_DIR}/espeak-ng.dll"