2
2
//
3
3
// Copyright (c) 2024 Xiaomi Corporation
4
4
5
+ #include < algorithm>
5
6
#include < sstream>
6
7
7
8
#include " macros.h" // NOLINT
@@ -265,6 +266,13 @@ static Napi::Object OfflineTtsGenerateWrapper(const Napi::CallbackInfo &info) {
265
266
return {};
266
267
}
267
268
269
+ bool enable_external_buffer = true ;
270
+ if (obj.Has (" enableExternalBuffer" ) &&
271
+ obj.Get (" enableExternalBuffer" ).IsBoolean ()) {
272
+ enable_external_buffer =
273
+ obj.Get (" enableExternalBuffer" ).As <Napi::Boolean >().Value ();
274
+ }
275
+
268
276
Napi::String _text = obj.Get (" text" ).As <Napi::String>();
269
277
std::string text = _text.Utf8Value ();
270
278
int32_t sid = obj.Get (" sid" ).As <Napi::Number>().Int32Value ();
@@ -273,20 +281,37 @@ static Napi::Object OfflineTtsGenerateWrapper(const Napi::CallbackInfo &info) {
273
281
const SherpaOnnxGeneratedAudio *audio =
274
282
SherpaOnnxOfflineTtsGenerate (tts, text.c_str (), sid, speed);
275
283
276
- Napi::ArrayBuffer arrayBuffer = Napi::ArrayBuffer::New (
277
- env, const_cast <float *>(audio->samples ), sizeof (float ) * audio->n ,
278
- [](Napi::Env /* env*/ , void * /* data*/ ,
279
- const SherpaOnnxGeneratedAudio *hint) {
280
- SherpaOnnxDestroyOfflineTtsGeneratedAudio (hint);
281
- },
282
- audio);
283
- Napi::Float32Array float32Array =
284
- Napi::Float32Array::New (env, audio->n , arrayBuffer, 0 );
285
-
286
- Napi::Object ans = Napi::Object::New (env);
287
- ans.Set (Napi::String::New (env, " samples" ), float32Array);
288
- ans.Set (Napi::String::New (env, " sampleRate" ), audio->sample_rate );
289
- return ans;
284
+ if (enable_external_buffer) {
285
+ Napi::ArrayBuffer arrayBuffer = Napi::ArrayBuffer::New (
286
+ env, const_cast <float *>(audio->samples ), sizeof (float ) * audio->n ,
287
+ [](Napi::Env /* env*/ , void * /* data*/ ,
288
+ const SherpaOnnxGeneratedAudio *hint) {
289
+ SherpaOnnxDestroyOfflineTtsGeneratedAudio (hint);
290
+ },
291
+ audio);
292
+ Napi::Float32Array float32Array =
293
+ Napi::Float32Array::New (env, audio->n , arrayBuffer, 0 );
294
+
295
+ Napi::Object ans = Napi::Object::New (env);
296
+ ans.Set (Napi::String::New (env, " samples" ), float32Array);
297
+ ans.Set (Napi::String::New (env, " sampleRate" ), audio->sample_rate );
298
+ return ans;
299
+ } else {
300
+ // don't use external buffer
301
+ Napi::ArrayBuffer arrayBuffer =
302
+ Napi::ArrayBuffer::New (env, sizeof (float ) * audio->n );
303
+
304
+ Napi::Float32Array float32Array =
305
+ Napi::Float32Array::New (env, audio->n , arrayBuffer, 0 );
306
+
307
+ std::copy (audio->samples , audio->samples + audio->n , float32Array.Data ());
308
+
309
+ Napi::Object ans = Napi::Object::New (env);
310
+ ans.Set (Napi::String::New (env, " samples" ), float32Array);
311
+ ans.Set (Napi::String::New (env, " sampleRate" ), audio->sample_rate );
312
+ SherpaOnnxDestroyOfflineTtsGeneratedAudio (audio);
313
+ return ans;
314
+ }
290
315
}
291
316
292
317
void InitNonStreamingTts (Napi::Env env, Napi::Object exports) {
0 commit comments