Add JavaScript (node-addon) API for speech enhancement GTCRN models (#1996)
This commit is contained in:
@@ -44,6 +44,7 @@ add_library(sherpa_onnx SHARED
|
||||
keyword-spotting.cc
|
||||
non-streaming-asr.cc
|
||||
non-streaming-speaker-diarization.cc
|
||||
non-streaming-speech-denoiser.cc
|
||||
non-streaming-tts.cc
|
||||
punctuation.cc
|
||||
sherpa-onnx-node-addon-api.cc
|
||||
|
||||
@@ -121,7 +121,7 @@ AudioTaggingCreateOfflineStreamWrapper(const Napi::CallbackInfo &info) {
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxAudioTagging *at =
|
||||
const SherpaOnnxAudioTagging *at =
|
||||
info[0].As<Napi::External<SherpaOnnxAudioTagging>>().Data();
|
||||
|
||||
const SherpaOnnxOfflineStream *stream =
|
||||
@@ -169,10 +169,10 @@ static Napi::Object AudioTaggingComputeWrapper(const Napi::CallbackInfo &info) {
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxAudioTagging *at =
|
||||
const SherpaOnnxAudioTagging *at =
|
||||
info[0].As<Napi::External<SherpaOnnxAudioTagging>>().Data();
|
||||
|
||||
SherpaOnnxOfflineStream *stream =
|
||||
const SherpaOnnxOfflineStream *stream =
|
||||
info[1].As<Napi::External<SherpaOnnxOfflineStream>>().Data();
|
||||
|
||||
int32_t top_k = info[2].As<Napi::Number>().Int32Value();
|
||||
|
||||
@@ -341,7 +341,7 @@ static Napi::External<SherpaOnnxOfflineStream> CreateOfflineStreamWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOfflineRecognizer *recognizer =
|
||||
const SherpaOnnxOfflineRecognizer *recognizer =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineRecognizer>>().Data();
|
||||
|
||||
const SherpaOnnxOfflineStream *stream =
|
||||
@@ -373,7 +373,7 @@ static void AcceptWaveformOfflineWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxOfflineStream *stream =
|
||||
const SherpaOnnxOfflineStream *stream =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineStream>>().Data();
|
||||
|
||||
if (!info[1].IsObject()) {
|
||||
@@ -454,10 +454,10 @@ static void DecodeOfflineStreamWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxOfflineRecognizer *recognizer =
|
||||
const SherpaOnnxOfflineRecognizer *recognizer =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineRecognizer>>().Data();
|
||||
|
||||
SherpaOnnxOfflineStream *stream =
|
||||
const SherpaOnnxOfflineStream *stream =
|
||||
info[1].As<Napi::External<SherpaOnnxOfflineStream>>().Data();
|
||||
|
||||
SherpaOnnxDecodeOfflineStream(recognizer, stream);
|
||||
@@ -482,7 +482,7 @@ static Napi::String GetOfflineStreamResultAsJsonWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOfflineStream *stream =
|
||||
const SherpaOnnxOfflineStream *stream =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineStream>>().Data();
|
||||
|
||||
const char *json = SherpaOnnxGetOfflineStreamResultAsJson(stream);
|
||||
|
||||
@@ -0,0 +1,278 @@
|
||||
// scripts/node-addon-api/src/non-streaming-speech-denoiser.cc
|
||||
//
|
||||
// Copyright (c) 2025 Xiaomi Corporation
|
||||
#include <sstream>
|
||||
|
||||
#include "macros.h" // NOLINT
|
||||
#include "napi.h" // NOLINT
|
||||
#include "sherpa-onnx/c-api/c-api.h"
|
||||
|
||||
static SherpaOnnxOfflineSpeechDenoiserGtcrnModelConfig
|
||||
GetOfflineSpeechDenoiserGtcrnModelConfig(Napi::Object obj) {
|
||||
SherpaOnnxOfflineSpeechDenoiserGtcrnModelConfig c;
|
||||
memset(&c, 0, sizeof(c));
|
||||
|
||||
if (!obj.Has("gtcrn") || !obj.Get("gtcrn").IsObject()) {
|
||||
return c;
|
||||
}
|
||||
|
||||
Napi::Object o = obj.Get("gtcrn").As<Napi::Object>();
|
||||
|
||||
SHERPA_ONNX_ASSIGN_ATTR_STR(model, model);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
static SherpaOnnxOfflineSpeechDenoiserModelConfig
|
||||
GetOfflineSpeechDenoiserModelConfig(Napi::Object obj) {
|
||||
SherpaOnnxOfflineSpeechDenoiserModelConfig c;
|
||||
memset(&c, 0, sizeof(c));
|
||||
|
||||
if (!obj.Has("model") || !obj.Get("model").IsObject()) {
|
||||
return c;
|
||||
}
|
||||
|
||||
Napi::Object o = obj.Get("model").As<Napi::Object>();
|
||||
|
||||
c.gtcrn = GetOfflineSpeechDenoiserGtcrnModelConfig(o);
|
||||
|
||||
SHERPA_ONNX_ASSIGN_ATTR_INT32(num_threads, numThreads);
|
||||
|
||||
if (o.Has("debug") &&
|
||||
(o.Get("debug").IsNumber() || o.Get("debug").IsBoolean())) {
|
||||
if (o.Get("debug").IsBoolean()) {
|
||||
c.debug = o.Get("debug").As<Napi::Boolean>().Value();
|
||||
} else {
|
||||
c.debug = o.Get("debug").As<Napi::Number>().Int32Value();
|
||||
}
|
||||
}
|
||||
|
||||
SHERPA_ONNX_ASSIGN_ATTR_STR(provider, provider);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
static Napi::External<SherpaOnnxOfflineSpeechDenoiser>
|
||||
CreateOfflineSpeechDenoiserWrapper(const Napi::CallbackInfo &info) {
|
||||
Napi::Env env = info.Env();
|
||||
#if __OHOS__
|
||||
// the last argument is the NativeResourceManager
|
||||
if (info.Length() != 2) {
|
||||
std::ostringstream os;
|
||||
os << "Expect only 2 arguments. Given: " << info.Length();
|
||||
|
||||
Napi::TypeError::New(env, os.str()).ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
#else
|
||||
if (info.Length() != 1) {
|
||||
std::ostringstream os;
|
||||
os << "Expect only 1 argument. Given: " << info.Length();
|
||||
|
||||
Napi::TypeError::New(env, os.str()).ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!info[0].IsObject()) {
|
||||
Napi::TypeError::New(env, "Expect an object as the argument")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
Napi::Object o = info[0].As<Napi::Object>();
|
||||
|
||||
SherpaOnnxOfflineSpeechDenoiserConfig c;
|
||||
memset(&c, 0, sizeof(c));
|
||||
c.model = GetOfflineSpeechDenoiserModelConfig(o);
|
||||
|
||||
#if __OHOS__
|
||||
std::unique_ptr<NativeResourceManager,
|
||||
decltype(&OH_ResourceManager_ReleaseNativeResourceManager)>
|
||||
mgr(OH_ResourceManager_InitNativeResourceManager(env, info[1]),
|
||||
&OH_ResourceManager_ReleaseNativeResourceManager);
|
||||
|
||||
const SherpaOnnxOfflineSpeechDenoiser *sd =
|
||||
SherpaOnnxCreateOfflineSpeechDenoiserOHOS(&c, mgr.get());
|
||||
#else
|
||||
const SherpaOnnxOfflineSpeechDenoiser *sd =
|
||||
SherpaOnnxCreateOfflineSpeechDenoiser(&c);
|
||||
#endif
|
||||
|
||||
SHERPA_ONNX_DELETE_C_STR(c.model.gtcrn.model);
|
||||
SHERPA_ONNX_DELETE_C_STR(c.model.provider);
|
||||
|
||||
if (!sd) {
|
||||
Napi::TypeError::New(env, "Please check your config!")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
return Napi::External<SherpaOnnxOfflineSpeechDenoiser>::New(
|
||||
env, const_cast<SherpaOnnxOfflineSpeechDenoiser *>(sd),
|
||||
[](Napi::Env env, SherpaOnnxOfflineSpeechDenoiser *sd) {
|
||||
SherpaOnnxDestroyOfflineSpeechDenoiser(sd);
|
||||
});
|
||||
}
|
||||
|
||||
static Napi::Object OfflineSpeechDenoiserRunWrapper(
|
||||
const Napi::CallbackInfo &info) {
|
||||
Napi::Env env = info.Env();
|
||||
|
||||
if (info.Length() != 2) {
|
||||
std::ostringstream os;
|
||||
os << "Expect only 2 arguments. Given: " << info.Length();
|
||||
|
||||
Napi::TypeError::New(env, os.str()).ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
if (!info[0].IsExternal()) {
|
||||
Napi::TypeError::New(
|
||||
env, "Argument 0 should be an offline speech denoiser pointer.")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
const SherpaOnnxOfflineSpeechDenoiser *sd =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineSpeechDenoiser>>().Data();
|
||||
|
||||
if (!info[1].IsObject()) {
|
||||
Napi::TypeError::New(env, "Argument 1 should be an object")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
Napi::Object obj = info[1].As<Napi::Object>();
|
||||
|
||||
if (!obj.Has("samples")) {
|
||||
Napi::TypeError::New(env, "The argument object should have a field samples")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
if (!obj.Get("samples").IsTypedArray()) {
|
||||
Napi::TypeError::New(env, "The object['samples'] should be a typed array")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
if (!obj.Has("sampleRate")) {
|
||||
Napi::TypeError::New(env,
|
||||
"The argument object should have a field sampleRate")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
if (!obj.Get("sampleRate").IsNumber()) {
|
||||
Napi::TypeError::New(env, "The object['samples'] should be a number")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
Napi::Float32Array samples = obj.Get("samples").As<Napi::Float32Array>();
|
||||
int32_t sample_rate = obj.Get("sampleRate").As<Napi::Number>().Int32Value();
|
||||
|
||||
const SherpaOnnxDenoisedAudio *audio;
|
||||
|
||||
#if __OHOS__
|
||||
// Note(fangjun): For unknown reasons on HarmonyOS, we need to divide it by
|
||||
// sizeof(float) here
|
||||
audio = SherpaOnnxOfflineSpeechDenoiserRun(
|
||||
sd, samples.Data(), samples.ElementLength() / sizeof(float), sample_rate);
|
||||
#else
|
||||
audio = SherpaOnnxOfflineSpeechDenoiserRun(
|
||||
sd, samples.Data(), samples.ElementLength(), sample_rate);
|
||||
#endif
|
||||
|
||||
bool enable_external_buffer = true;
|
||||
if (obj.Has("enableExternalBuffer") &&
|
||||
obj.Get("enableExternalBuffer").IsBoolean()) {
|
||||
enable_external_buffer =
|
||||
obj.Get("enableExternalBuffer").As<Napi::Boolean>().Value();
|
||||
}
|
||||
|
||||
if (enable_external_buffer) {
|
||||
Napi::ArrayBuffer arrayBuffer = Napi::ArrayBuffer::New(
|
||||
env, const_cast<float *>(audio->samples), sizeof(float) * audio->n,
|
||||
[](Napi::Env /*env*/, void * /*data*/,
|
||||
const SherpaOnnxDenoisedAudio *hint) {
|
||||
SherpaOnnxDestroyDenoisedAudio(hint);
|
||||
},
|
||||
audio);
|
||||
Napi::Float32Array float32Array =
|
||||
Napi::Float32Array::New(env, audio->n, arrayBuffer, 0);
|
||||
|
||||
Napi::Object ans = Napi::Object::New(env);
|
||||
ans.Set(Napi::String::New(env, "samples"), float32Array);
|
||||
ans.Set(Napi::String::New(env, "sampleRate"), audio->sample_rate);
|
||||
return ans;
|
||||
} else {
|
||||
// don't use external buffer
|
||||
Napi::ArrayBuffer arrayBuffer =
|
||||
Napi::ArrayBuffer::New(env, sizeof(float) * audio->n);
|
||||
|
||||
Napi::Float32Array float32Array =
|
||||
Napi::Float32Array::New(env, audio->n, arrayBuffer, 0);
|
||||
|
||||
std::copy(audio->samples, audio->samples + audio->n, float32Array.Data());
|
||||
|
||||
Napi::Object ans = Napi::Object::New(env);
|
||||
ans.Set(Napi::String::New(env, "samples"), float32Array);
|
||||
ans.Set(Napi::String::New(env, "sampleRate"), audio->sample_rate);
|
||||
SherpaOnnxDestroyDenoisedAudio(audio);
|
||||
return ans;
|
||||
}
|
||||
}
|
||||
|
||||
static Napi::Number OfflineSpeechDenoiserGetSampleRateWrapper(
|
||||
const Napi::CallbackInfo &info) {
|
||||
Napi::Env env = info.Env();
|
||||
|
||||
if (info.Length() != 1) {
|
||||
std::ostringstream os;
|
||||
os << "Expect only 1 argument. Given: " << info.Length();
|
||||
|
||||
Napi::TypeError::New(env, os.str()).ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
if (!info[0].IsExternal()) {
|
||||
Napi::TypeError::New(
|
||||
env, "Argument 0 should be an offline speech denoiser pointer.")
|
||||
.ThrowAsJavaScriptException();
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
const SherpaOnnxOfflineSpeechDenoiser *sd =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineSpeechDenoiser>>().Data();
|
||||
|
||||
int32_t sample_rate = SherpaOnnxOfflineSpeechDenoiserGetSampleRate(sd);
|
||||
|
||||
return Napi::Number::New(env, sample_rate);
|
||||
}
|
||||
|
||||
void InitNonStreamingSpeechDenoiser(Napi::Env env, Napi::Object exports) {
|
||||
exports.Set(Napi::String::New(env, "createOfflineSpeechDenoiser"),
|
||||
Napi::Function::New(env, CreateOfflineSpeechDenoiserWrapper));
|
||||
|
||||
exports.Set(Napi::String::New(env, "offlineSpeechDenoiserRunWrapper"),
|
||||
Napi::Function::New(env, OfflineSpeechDenoiserRunWrapper));
|
||||
|
||||
exports.Set(
|
||||
Napi::String::New(env, "offlineSpeechDenoiserGetSampleRateWrapper"),
|
||||
Napi::Function::New(env, OfflineSpeechDenoiserGetSampleRateWrapper));
|
||||
}
|
||||
@@ -217,7 +217,7 @@ static Napi::Number OfflineTtsSampleRateWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOfflineTts *tts =
|
||||
const SherpaOnnxOfflineTts *tts =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineTts>>().Data();
|
||||
|
||||
int32_t sample_rate = SherpaOnnxOfflineTtsSampleRate(tts);
|
||||
@@ -245,7 +245,7 @@ static Napi::Number OfflineTtsNumSpeakersWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOfflineTts *tts =
|
||||
const SherpaOnnxOfflineTts *tts =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineTts>>().Data();
|
||||
|
||||
int32_t num_speakers = SherpaOnnxOfflineTtsNumSpeakers(tts);
|
||||
@@ -273,7 +273,7 @@ static Napi::Object OfflineTtsGenerateWrapper(const Napi::CallbackInfo &info) {
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOfflineTts *tts =
|
||||
const SherpaOnnxOfflineTts *tts =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineTts>>().Data();
|
||||
|
||||
if (!info[1].IsObject()) {
|
||||
@@ -418,9 +418,9 @@ using TSFN = Napi::TypedThreadSafeFunction<Napi::Reference<Napi::Value>,
|
||||
|
||||
class TtsGenerateWorker : public Napi::AsyncWorker {
|
||||
public:
|
||||
TtsGenerateWorker(const Napi::Env &env, TSFN tsfn, SherpaOnnxOfflineTts *tts,
|
||||
const std::string &text, float speed, int32_t sid,
|
||||
bool use_external_buffer)
|
||||
TtsGenerateWorker(const Napi::Env &env, TSFN tsfn,
|
||||
const SherpaOnnxOfflineTts *tts, const std::string &text,
|
||||
float speed, int32_t sid, bool use_external_buffer)
|
||||
: tsfn_(tsfn),
|
||||
Napi::AsyncWorker{env, "TtsGenerateWorker"},
|
||||
deferred_(env),
|
||||
@@ -506,7 +506,7 @@ class TtsGenerateWorker : public Napi::AsyncWorker {
|
||||
private:
|
||||
TSFN tsfn_;
|
||||
Napi::Promise::Deferred deferred_;
|
||||
SherpaOnnxOfflineTts *tts_;
|
||||
const SherpaOnnxOfflineTts *tts_;
|
||||
std::string text_;
|
||||
float speed_;
|
||||
int32_t sid_;
|
||||
@@ -537,7 +537,7 @@ static Napi::Object OfflineTtsGenerateAsyncWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOfflineTts *tts =
|
||||
const SherpaOnnxOfflineTts *tts =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflineTts>>().Data();
|
||||
|
||||
if (!info[1].IsObject()) {
|
||||
|
||||
@@ -108,7 +108,7 @@ static Napi::String OfflinePunctuationAddPunctWraper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOfflinePunctuation *punct =
|
||||
const SherpaOnnxOfflinePunctuation *punct =
|
||||
info[0].As<Napi::External<SherpaOnnxOfflinePunctuation>>().Data();
|
||||
Napi::String js_text = info[1].As<Napi::String>();
|
||||
std::string text = js_text.Utf8Value();
|
||||
|
||||
@@ -27,6 +27,8 @@ void InitKeywordSpotting(Napi::Env env, Napi::Object exports);
|
||||
|
||||
void InitNonStreamingSpeakerDiarization(Napi::Env env, Napi::Object exports);
|
||||
|
||||
void InitNonStreamingSpeechDenoiser(Napi::Env env, Napi::Object exports);
|
||||
|
||||
#if __OHOS__
|
||||
void InitUtils(Napi::Env env, Napi::Object exports);
|
||||
#endif
|
||||
@@ -44,6 +46,7 @@ Napi::Object Init(Napi::Env env, Napi::Object exports) {
|
||||
InitPunctuation(env, exports);
|
||||
InitKeywordSpotting(env, exports);
|
||||
InitNonStreamingSpeakerDiarization(env, exports);
|
||||
InitNonStreamingSpeechDenoiser(env, exports);
|
||||
|
||||
#if __OHOS__
|
||||
InitUtils(env, exports);
|
||||
|
||||
@@ -108,7 +108,7 @@ static Napi::Number SpeakerEmbeddingExtractorDimWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingExtractor *extractor =
|
||||
const SherpaOnnxSpeakerEmbeddingExtractor *extractor =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingExtractor>>().Data();
|
||||
|
||||
int32_t dim = SherpaOnnxSpeakerEmbeddingExtractorDim(extractor);
|
||||
@@ -137,7 +137,7 @@ SpeakerEmbeddingExtractorCreateStreamWrapper(const Napi::CallbackInfo &info) {
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingExtractor *extractor =
|
||||
const SherpaOnnxSpeakerEmbeddingExtractor *extractor =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingExtractor>>().Data();
|
||||
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
@@ -177,10 +177,10 @@ static Napi::Boolean SpeakerEmbeddingExtractorIsReadyWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingExtractor *extractor =
|
||||
const SherpaOnnxSpeakerEmbeddingExtractor *extractor =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingExtractor>>().Data();
|
||||
|
||||
SherpaOnnxOnlineStream *stream =
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
info[1].As<Napi::External<SherpaOnnxOnlineStream>>().Data();
|
||||
|
||||
int32_t is_ready =
|
||||
@@ -226,10 +226,10 @@ static Napi::Float32Array SpeakerEmbeddingExtractorComputeEmbeddingWrapper(
|
||||
}
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingExtractor *extractor =
|
||||
const SherpaOnnxSpeakerEmbeddingExtractor *extractor =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingExtractor>>().Data();
|
||||
|
||||
SherpaOnnxOnlineStream *stream =
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
info[1].As<Napi::External<SherpaOnnxOnlineStream>>().Data();
|
||||
|
||||
const float *v =
|
||||
@@ -329,7 +329,7 @@ static Napi::Boolean SpeakerEmbeddingManagerAddWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
const SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingManager>>().Data();
|
||||
|
||||
Napi::Object obj = info[1].As<Napi::Object>();
|
||||
@@ -399,7 +399,7 @@ static Napi::Boolean SpeakerEmbeddingManagerAddListFlattenedWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
const SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingManager>>().Data();
|
||||
|
||||
Napi::Object obj = info[1].As<Napi::Object>();
|
||||
@@ -486,7 +486,7 @@ static Napi::Boolean SpeakerEmbeddingManagerRemoveWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
const SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingManager>>().Data();
|
||||
|
||||
Napi::String js_name = info[1].As<Napi::String>();
|
||||
@@ -525,7 +525,7 @@ static Napi::String SpeakerEmbeddingManagerSearchWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
const SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingManager>>().Data();
|
||||
|
||||
Napi::Object obj = info[1].As<Napi::Object>();
|
||||
@@ -603,7 +603,7 @@ static Napi::Boolean SpeakerEmbeddingManagerVerifyWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
const SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingManager>>().Data();
|
||||
|
||||
Napi::Object obj = info[1].As<Napi::Object>();
|
||||
@@ -691,7 +691,7 @@ static Napi::Boolean SpeakerEmbeddingManagerContainsWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
const SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingManager>>().Data();
|
||||
|
||||
Napi::String js_name = info[1].As<Napi::String>();
|
||||
@@ -724,7 +724,7 @@ static Napi::Number SpeakerEmbeddingManagerNumSpeakersWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
const SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingManager>>().Data();
|
||||
|
||||
int32_t num_speakers = SherpaOnnxSpeakerEmbeddingManagerNumSpeakers(manager);
|
||||
@@ -753,7 +753,7 @@ static Napi::Array SpeakerEmbeddingManagerGetAllSpeakersWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
const SherpaOnnxSpeakerEmbeddingManager *manager =
|
||||
info[0].As<Napi::External<SherpaOnnxSpeakerEmbeddingManager>>().Data();
|
||||
|
||||
int32_t num_speakers = SherpaOnnxSpeakerEmbeddingManagerNumSpeakers(manager);
|
||||
|
||||
@@ -106,16 +106,17 @@ SpokenLanguageIdentificationCreateOfflineStreamWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpokenLanguageIdentification *slid =
|
||||
const SherpaOnnxSpokenLanguageIdentification *slid =
|
||||
info[0]
|
||||
.As<Napi::External<SherpaOnnxSpokenLanguageIdentification>>()
|
||||
.Data();
|
||||
|
||||
SherpaOnnxOfflineStream *stream =
|
||||
const SherpaOnnxOfflineStream *stream =
|
||||
SherpaOnnxSpokenLanguageIdentificationCreateOfflineStream(slid);
|
||||
|
||||
return Napi::External<SherpaOnnxOfflineStream>::New(
|
||||
env, stream, [](Napi::Env env, SherpaOnnxOfflineStream *stream) {
|
||||
env, const_cast<SherpaOnnxOfflineStream *>(stream),
|
||||
[](Napi::Env env, SherpaOnnxOfflineStream *stream) {
|
||||
SherpaOnnxDestroyOfflineStream(stream);
|
||||
});
|
||||
}
|
||||
@@ -147,12 +148,12 @@ static Napi::String SpokenLanguageIdentificationComputeWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxSpokenLanguageIdentification *slid =
|
||||
const SherpaOnnxSpokenLanguageIdentification *slid =
|
||||
info[0]
|
||||
.As<Napi::External<SherpaOnnxSpokenLanguageIdentification>>()
|
||||
.Data();
|
||||
|
||||
SherpaOnnxOfflineStream *stream =
|
||||
const SherpaOnnxOfflineStream *stream =
|
||||
info[1].As<Napi::External<SherpaOnnxOfflineStream>>().Data();
|
||||
|
||||
const SherpaOnnxSpokenLanguageIdentificationResult *r =
|
||||
|
||||
@@ -278,7 +278,7 @@ static Napi::External<SherpaOnnxOnlineStream> CreateOnlineStreamWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOnlineRecognizer *recognizer =
|
||||
const SherpaOnnxOnlineRecognizer *recognizer =
|
||||
info[0].As<Napi::External<SherpaOnnxOnlineRecognizer>>().Data();
|
||||
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
@@ -310,7 +310,7 @@ static void AcceptWaveformWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxOnlineStream *stream =
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
info[0].As<Napi::External<SherpaOnnxOnlineStream>>().Data();
|
||||
|
||||
if (!info[1].IsObject()) {
|
||||
@@ -390,10 +390,10 @@ static Napi::Boolean IsOnlineStreamReadyWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOnlineRecognizer *recognizer =
|
||||
const SherpaOnnxOnlineRecognizer *recognizer =
|
||||
info[0].As<Napi::External<SherpaOnnxOnlineRecognizer>>().Data();
|
||||
|
||||
SherpaOnnxOnlineStream *stream =
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
info[1].As<Napi::External<SherpaOnnxOnlineStream>>().Data();
|
||||
|
||||
int32_t is_ready = SherpaOnnxIsOnlineStreamReady(recognizer, stream);
|
||||
@@ -427,10 +427,10 @@ static void DecodeOnlineStreamWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxOnlineRecognizer *recognizer =
|
||||
const SherpaOnnxOnlineRecognizer *recognizer =
|
||||
info[0].As<Napi::External<SherpaOnnxOnlineRecognizer>>().Data();
|
||||
|
||||
SherpaOnnxOnlineStream *stream =
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
info[1].As<Napi::External<SherpaOnnxOnlineStream>>().Data();
|
||||
|
||||
SherpaOnnxDecodeOnlineStream(recognizer, stream);
|
||||
@@ -463,10 +463,10 @@ static Napi::String GetOnlineStreamResultAsJsonWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOnlineRecognizer *recognizer =
|
||||
const SherpaOnnxOnlineRecognizer *recognizer =
|
||||
info[0].As<Napi::External<SherpaOnnxOnlineRecognizer>>().Data();
|
||||
|
||||
SherpaOnnxOnlineStream *stream =
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
info[1].As<Napi::External<SherpaOnnxOnlineStream>>().Data();
|
||||
|
||||
const char *json = SherpaOnnxGetOnlineStreamResultAsJson(recognizer, stream);
|
||||
@@ -496,7 +496,7 @@ static void InputFinishedWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxOnlineStream *stream =
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
info[0].As<Napi::External<SherpaOnnxOnlineStream>>().Data();
|
||||
|
||||
SherpaOnnxOnlineStreamInputFinished(stream);
|
||||
@@ -528,10 +528,10 @@ static void ResetOnlineStreamWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxOnlineRecognizer *recognizer =
|
||||
const SherpaOnnxOnlineRecognizer *recognizer =
|
||||
info[0].As<Napi::External<SherpaOnnxOnlineRecognizer>>().Data();
|
||||
|
||||
SherpaOnnxOnlineStream *stream =
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
info[1].As<Napi::External<SherpaOnnxOnlineStream>>().Data();
|
||||
|
||||
SherpaOnnxOnlineStreamReset(recognizer, stream);
|
||||
@@ -563,10 +563,10 @@ static Napi::Boolean IsEndpointWrapper(const Napi::CallbackInfo &info) {
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxOnlineRecognizer *recognizer =
|
||||
const SherpaOnnxOnlineRecognizer *recognizer =
|
||||
info[0].As<Napi::External<SherpaOnnxOnlineRecognizer>>().Data();
|
||||
|
||||
SherpaOnnxOnlineStream *stream =
|
||||
const SherpaOnnxOnlineStream *stream =
|
||||
info[1].As<Napi::External<SherpaOnnxOnlineStream>>().Data();
|
||||
|
||||
int32_t is_endpoint = SherpaOnnxOnlineStreamIsEndpoint(recognizer, stream);
|
||||
@@ -636,7 +636,7 @@ static void PrintWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxDisplay *display =
|
||||
const SherpaOnnxDisplay *display =
|
||||
info[0].As<Napi::External<SherpaOnnxDisplay>>().Data();
|
||||
|
||||
int32_t idx = info[1].As<Napi::Number>().Int32Value();
|
||||
|
||||
@@ -28,11 +28,12 @@ static Napi::External<SherpaOnnxCircularBuffer> CreateCircularBufferWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxCircularBuffer *buf =
|
||||
const SherpaOnnxCircularBuffer *buf =
|
||||
SherpaOnnxCreateCircularBuffer(info[0].As<Napi::Number>().Int32Value());
|
||||
|
||||
return Napi::External<SherpaOnnxCircularBuffer>::New(
|
||||
env, buf, [](Napi::Env env, SherpaOnnxCircularBuffer *p) {
|
||||
env, const_cast<SherpaOnnxCircularBuffer *>(buf),
|
||||
[](Napi::Env env, SherpaOnnxCircularBuffer *p) {
|
||||
SherpaOnnxDestroyCircularBuffer(p);
|
||||
});
|
||||
}
|
||||
@@ -56,7 +57,7 @@ static void CircularBufferPushWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxCircularBuffer *buf =
|
||||
const SherpaOnnxCircularBuffer *buf =
|
||||
info[0].As<Napi::External<SherpaOnnxCircularBuffer>>().Data();
|
||||
|
||||
if (!info[1].IsTypedArray()) {
|
||||
@@ -101,7 +102,7 @@ static Napi::Float32Array CircularBufferGetWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxCircularBuffer *buf =
|
||||
const SherpaOnnxCircularBuffer *buf =
|
||||
info[0].As<Napi::External<SherpaOnnxCircularBuffer>>().Data();
|
||||
|
||||
if (!info[1].IsNumber()) {
|
||||
@@ -179,7 +180,7 @@ static void CircularBufferPopWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxCircularBuffer *buf =
|
||||
const SherpaOnnxCircularBuffer *buf =
|
||||
info[0].As<Napi::External<SherpaOnnxCircularBuffer>>().Data();
|
||||
|
||||
if (!info[1].IsNumber()) {
|
||||
@@ -213,7 +214,7 @@ static Napi::Number CircularBufferSizeWrapper(const Napi::CallbackInfo &info) {
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxCircularBuffer *buf =
|
||||
const SherpaOnnxCircularBuffer *buf =
|
||||
info[0].As<Napi::External<SherpaOnnxCircularBuffer>>().Data();
|
||||
|
||||
int32_t size = SherpaOnnxCircularBufferSize(buf);
|
||||
@@ -240,7 +241,7 @@ static Napi::Number CircularBufferHeadWrapper(const Napi::CallbackInfo &info) {
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxCircularBuffer *buf =
|
||||
const SherpaOnnxCircularBuffer *buf =
|
||||
info[0].As<Napi::External<SherpaOnnxCircularBuffer>>().Data();
|
||||
|
||||
int32_t size = SherpaOnnxCircularBufferHead(buf);
|
||||
@@ -267,7 +268,7 @@ static void CircularBufferResetWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxCircularBuffer *buf =
|
||||
const SherpaOnnxCircularBuffer *buf =
|
||||
info[0].As<Napi::External<SherpaOnnxCircularBuffer>>().Data();
|
||||
|
||||
SherpaOnnxCircularBufferReset(buf);
|
||||
@@ -360,18 +361,19 @@ CreateVoiceActivityDetectorWrapper(const Napi::CallbackInfo &info) {
|
||||
mgr(OH_ResourceManager_InitNativeResourceManager(env, info[2]),
|
||||
&OH_ResourceManager_ReleaseNativeResourceManager);
|
||||
|
||||
SherpaOnnxVoiceActivityDetector *vad =
|
||||
const SherpaOnnxVoiceActivityDetector *vad =
|
||||
SherpaOnnxCreateVoiceActivityDetectorOHOS(&c, buffer_size_in_seconds,
|
||||
mgr.get());
|
||||
#else
|
||||
SherpaOnnxVoiceActivityDetector *vad =
|
||||
const SherpaOnnxVoiceActivityDetector *vad =
|
||||
SherpaOnnxCreateVoiceActivityDetector(&c, buffer_size_in_seconds);
|
||||
#endif
|
||||
SHERPA_ONNX_DELETE_C_STR(c.silero_vad.model);
|
||||
SHERPA_ONNX_DELETE_C_STR(c.provider);
|
||||
|
||||
return Napi::External<SherpaOnnxVoiceActivityDetector>::New(
|
||||
env, vad, [](Napi::Env env, SherpaOnnxVoiceActivityDetector *p) {
|
||||
env, const_cast<SherpaOnnxVoiceActivityDetector *>(vad),
|
||||
[](Napi::Env env, SherpaOnnxVoiceActivityDetector *p) {
|
||||
SherpaOnnxDestroyVoiceActivityDetector(p);
|
||||
});
|
||||
}
|
||||
@@ -396,7 +398,7 @@ static void VoiceActivityDetectorAcceptWaveformWrapper(
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxVoiceActivityDetector *vad =
|
||||
const SherpaOnnxVoiceActivityDetector *vad =
|
||||
info[0].As<Napi::External<SherpaOnnxVoiceActivityDetector>>().Data();
|
||||
|
||||
if (!info[1].IsTypedArray()) {
|
||||
@@ -440,7 +442,7 @@ static Napi::Boolean VoiceActivityDetectorEmptyWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxVoiceActivityDetector *vad =
|
||||
const SherpaOnnxVoiceActivityDetector *vad =
|
||||
info[0].As<Napi::External<SherpaOnnxVoiceActivityDetector>>().Data();
|
||||
|
||||
int32_t is_empty = SherpaOnnxVoiceActivityDetectorEmpty(vad);
|
||||
@@ -468,7 +470,7 @@ static Napi::Boolean VoiceActivityDetectorDetectedWrapper(
|
||||
return {};
|
||||
}
|
||||
|
||||
SherpaOnnxVoiceActivityDetector *vad =
|
||||
const SherpaOnnxVoiceActivityDetector *vad =
|
||||
info[0].As<Napi::External<SherpaOnnxVoiceActivityDetector>>().Data();
|
||||
|
||||
int32_t is_detected = SherpaOnnxVoiceActivityDetectorDetected(vad);
|
||||
@@ -495,7 +497,7 @@ static void VoiceActivityDetectorPopWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxVoiceActivityDetector *vad =
|
||||
const SherpaOnnxVoiceActivityDetector *vad =
|
||||
info[0].As<Napi::External<SherpaOnnxVoiceActivityDetector>>().Data();
|
||||
|
||||
SherpaOnnxVoiceActivityDetectorPop(vad);
|
||||
@@ -520,7 +522,7 @@ static void VoiceActivityDetectorClearWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxVoiceActivityDetector *vad =
|
||||
const SherpaOnnxVoiceActivityDetector *vad =
|
||||
info[0].As<Napi::External<SherpaOnnxVoiceActivityDetector>>().Data();
|
||||
|
||||
SherpaOnnxVoiceActivityDetectorClear(vad);
|
||||
@@ -556,7 +558,7 @@ static Napi::Object VoiceActivityDetectorFrontWrapper(
|
||||
}
|
||||
}
|
||||
|
||||
SherpaOnnxVoiceActivityDetector *vad =
|
||||
const SherpaOnnxVoiceActivityDetector *vad =
|
||||
info[0].As<Napi::External<SherpaOnnxVoiceActivityDetector>>().Data();
|
||||
|
||||
const SherpaOnnxSpeechSegment *segment =
|
||||
@@ -618,7 +620,7 @@ static void VoiceActivityDetectorResetWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxVoiceActivityDetector *vad =
|
||||
const SherpaOnnxVoiceActivityDetector *vad =
|
||||
info[0].As<Napi::External<SherpaOnnxVoiceActivityDetector>>().Data();
|
||||
|
||||
SherpaOnnxVoiceActivityDetectorReset(vad);
|
||||
@@ -643,7 +645,7 @@ static void VoiceActivityDetectorFlushWrapper(const Napi::CallbackInfo &info) {
|
||||
return;
|
||||
}
|
||||
|
||||
SherpaOnnxVoiceActivityDetector *vad =
|
||||
const SherpaOnnxVoiceActivityDetector *vad =
|
||||
info[0].As<Napi::External<SherpaOnnxVoiceActivityDetector>>().Data();
|
||||
|
||||
SherpaOnnxVoiceActivityDetectorFlush(vad);
|
||||
|
||||
Reference in New Issue
Block a user