From 5c1e869bc58f24115277640fb59ff573bd1b56e1 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Sat, 4 Apr 2026 23:45:28 +0700 Subject: [PATCH] fix: copy sherpa TTS samples to avoid external buffer crash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same fix as the Silero VAD — sherpa-onnx returns Float32Arrays backed by native memory which Node.js rejects as "External buffers are not allowed". Copy into JS-managed memory before passing to audio pipeline. --- .../src/server/speech/providers/local/sherpa/sherpa-tts.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/server/src/server/speech/providers/local/sherpa/sherpa-tts.ts b/packages/server/src/server/speech/providers/local/sherpa/sherpa-tts.ts index 2388fef0d..89627aee4 100644 --- a/packages/server/src/server/speech/providers/local/sherpa/sherpa-tts.ts +++ b/packages/server/src/server/speech/providers/local/sherpa/sherpa-tts.ts @@ -95,12 +95,15 @@ export class SherpaOnnxTTS implements TextToSpeechProvider { } const audio = this.tts.generate({ text: trimmed, sid: this.speakerId, speed: this.speed }); - const samples: Float32Array | null = + const rawSamples: Float32Array | null = audio && audio.samples instanceof Float32Array ? audio.samples : audio && Array.isArray(audio.samples) ? Float32Array.from(audio.samples as number[]) : null; + // Copy to avoid "External buffers are not allowed" when sherpa-onnx + // returns a Float32Array backed by native memory. + const samples = rawSamples ? Float32Array.from(rawSamples) : null; const sampleRate: number = audio && typeof audio.sampleRate === "number" &&