From c1e9e5c87f9e23620928fc6d5ab2f32cf8d24f3c Mon Sep 17 00:00:00 2001 From: Fangjun Kuang Date: Sun, 6 Jul 2025 19:20:26 +0800 Subject: [PATCH] Fix TTS for Unreal Engine (#2349) Unreal Engine has its own memory management, so we cannot return a struct containing a std::vector object. --- sherpa-onnx/c-api/cxx-api.cc | 13 +++++++++++++ sherpa-onnx/c-api/cxx-api.h | 8 ++++++++ 2 files changed, 21 insertions(+) diff --git a/sherpa-onnx/c-api/cxx-api.cc b/sherpa-onnx/c-api/cxx-api.cc index 98a167a5..866dec0b 100644 --- a/sherpa-onnx/c-api/cxx-api.cc +++ b/sherpa-onnx/c-api/cxx-api.cc @@ -419,6 +419,19 @@ GeneratedAudio OfflineTts::Generate(const std::string &text, return ans; } +std::shared_ptr OfflineTts::Generate2( + const std::string &text, int32_t sid /*= 0*/, float speed /*= 1.0*/, + OfflineTtsCallback callback /*= nullptr*/, void *arg /*= nullptr*/) const { + auto audio = Generate(text, sid, speed, callback, arg); + + GeneratedAudio *ans = new GeneratedAudio; + ans->samples = std::move(audio.samples); + ans->sample_rate = audio.sample_rate; + + return std::shared_ptr(ans, + [](GeneratedAudio *p) { delete p; }); +} + KeywordSpotter KeywordSpotter::Create(const KeywordSpotterConfig &config) { struct SherpaOnnxKeywordSpotterConfig c; memset(&c, 0, sizeof(c)); diff --git a/sherpa-onnx/c-api/cxx-api.h b/sherpa-onnx/c-api/cxx-api.h index 1ca0231f..ea1c5961 100644 --- a/sherpa-onnx/c-api/cxx-api.h +++ b/sherpa-onnx/c-api/cxx-api.h @@ -6,6 +6,7 @@ #ifndef SHERPA_ONNX_C_API_CXX_API_H_ #define SHERPA_ONNX_C_API_CXX_API_H_ +#include #include #include @@ -433,6 +434,13 @@ class SHERPA_ONNX_API OfflineTts OfflineTtsCallback callback = nullptr, void *arg = nullptr) const; + // Like Generate, but return a smart pointer. + // + // See also https://github.com/k2-fsa/sherpa-onnx/issues/2347 + std::shared_ptr Generate2( + const std::string &text, int32_t sid = 0, float speed = 1.0, + OfflineTtsCallback callback = nullptr, void *arg = nullptr) const; + private: explicit OfflineTts(const SherpaOnnxOfflineTts *p); };