diff --git a/ui/src/hooks/usePiperTts.ts b/ui/src/hooks/usePiperTts.ts index b2d67488..4baf985d 100644 --- a/ui/src/hooks/usePiperTts.ts +++ b/ui/src/hooks/usePiperTts.ts @@ -1,5 +1,5 @@ import { useState, useCallback, useRef } from "react"; -import { tts } from "@mintplex-labs/piper-tts-web"; +import * as tts from "@mintplex-labs/piper-tts-web"; const DEFAULT_VOICE = "en_US-hfc_female-medium"; @@ -36,20 +36,25 @@ export function usePiperTts() { audioRef.current = null; } setStatus("speaking"); + let objectUrl: string | null = null; try { const wav = await tts.predict({ text, voiceId: DEFAULT_VOICE }); - const audio = new Audio(wav); + objectUrl = URL.createObjectURL(wav); + const audio = new Audio(objectUrl); audioRef.current = audio; - audio.onended = () => { - audioRef.current = null; - setStatus("ready"); - }; - audio.onerror = () => { + const cleanup = () => { audioRef.current = null; + if (objectUrl) { + URL.revokeObjectURL(objectUrl); + objectUrl = null; + } setStatus("ready"); }; + audio.onended = cleanup; + audio.onerror = cleanup; await audio.play(); } catch { + if (objectUrl) URL.revokeObjectURL(objectUrl); setStatus("ready"); } }, [status]);