Add VAD example for Dart API (#996)
This commit is contained in:
11
sherpa-onnx/flutter/CHANGELOG.md
Normal file
11
sherpa-onnx/flutter/CHANGELOG.md
Normal 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.
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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: []);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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: []);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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>);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user