Fangjun Kuang
Committed by GitHub

Fix TTS for Unreal Engine (#2349)

Unreal Engine has its own memory management, so we cannot return a struct containing a std::vector object.
@@ -419,6 +419,19 @@ GeneratedAudio OfflineTts::Generate(const std::string &text, @@ -419,6 +419,19 @@ GeneratedAudio OfflineTts::Generate(const std::string &text,
419 return ans; 419 return ans;
420 } 420 }
421 421
  422 +std::shared_ptr<GeneratedAudio> OfflineTts::Generate2(
  423 + const std::string &text, int32_t sid /*= 0*/, float speed /*= 1.0*/,
  424 + OfflineTtsCallback callback /*= nullptr*/, void *arg /*= nullptr*/) const {
  425 + auto audio = Generate(text, sid, speed, callback, arg);
  426 +
  427 + GeneratedAudio *ans = new GeneratedAudio;
  428 + ans->samples = std::move(audio.samples);
  429 + ans->sample_rate = audio.sample_rate;
  430 +
  431 + return std::shared_ptr<GeneratedAudio>(ans,
  432 + [](GeneratedAudio *p) { delete p; });
  433 +}
  434 +
422 KeywordSpotter KeywordSpotter::Create(const KeywordSpotterConfig &config) { 435 KeywordSpotter KeywordSpotter::Create(const KeywordSpotterConfig &config) {
423 struct SherpaOnnxKeywordSpotterConfig c; 436 struct SherpaOnnxKeywordSpotterConfig c;
424 memset(&c, 0, sizeof(c)); 437 memset(&c, 0, sizeof(c));
@@ -6,6 +6,7 @@ @@ -6,6 +6,7 @@
6 #ifndef SHERPA_ONNX_C_API_CXX_API_H_ 6 #ifndef SHERPA_ONNX_C_API_CXX_API_H_
7 #define SHERPA_ONNX_C_API_CXX_API_H_ 7 #define SHERPA_ONNX_C_API_CXX_API_H_
8 8
  9 +#include <memory>
9 #include <string> 10 #include <string>
10 #include <vector> 11 #include <vector>
11 12
@@ -433,6 +434,13 @@ class SHERPA_ONNX_API OfflineTts @@ -433,6 +434,13 @@ class SHERPA_ONNX_API OfflineTts
433 OfflineTtsCallback callback = nullptr, 434 OfflineTtsCallback callback = nullptr,
434 void *arg = nullptr) const; 435 void *arg = nullptr) const;
435 436
  437 + // Like Generate, but return a smart pointer.
  438 + //
  439 + // See also https://github.com/k2-fsa/sherpa-onnx/issues/2347
  440 + std::shared_ptr<GeneratedAudio> Generate2(
  441 + const std::string &text, int32_t sid = 0, float speed = 1.0,
  442 + OfflineTtsCallback callback = nullptr, void *arg = nullptr) const;
  443 +
436 private: 444 private:
437 explicit OfflineTts(const SherpaOnnxOfflineTts *p); 445 explicit OfflineTts(const SherpaOnnxOfflineTts *p);
438 }; 446 };