diff --git a/bun.lockb b/bun.lockb index 794f9fb..e0ee5d7 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/components/TTSProvider.tsx b/components/TTSProvider.tsx index c00ddff..7b85e16 100644 --- a/components/TTSProvider.tsx +++ b/components/TTSProvider.tsx @@ -10,6 +10,7 @@ import React, { } from "react"; import removeMarkdown from "remove-markdown"; import { toast } from "sonner"; +import * as Echogarden from "echogarden"; // More robust sentence splitter using Intl.Segmenter for better accuracy. function splitIntoSentences(text: string): string[] { @@ -64,18 +65,28 @@ export const TTSProvider = ({ async function generateTTS(sentence: string, index: number): Promise { try { - const { data, error } = await supabase.functions.invoke("generate-tts", { - body: { - text: sentence, - voice: selectedSpeaker, - index, - }, + // const { data, error } = await supabase.functions.invoke("generate-tts", { + // body: { + // text: sentence, + // voice: selectedSpeaker, + // index, + // }, + // }); + + const { audio } = await Echogarden.synthesize(sentence, { + engine: "kokoro", + voice: selectedSpeaker, }); setStatus("running"); - const { audioUrl } = data as { audioUrl: string }; - return audioUrl; + if (!Buffer.isBuffer(audio)) { + throw new Error("Audio data is not a buffer"); + } + + const blob = new Blob([audio], { type: "audio/wav" }); + + return URL.createObjectURL(blob); } catch (error) { console.error("Error generating TTS:", error); toast.error("Failed to generate TTS. Please try again."); diff --git a/package.json b/package.json index 0b6d7a6..3e662aa 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "autoprefixer": "10.4.20", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "echogarden": "^2.7.0", "kokoro-js": "^1.2.0", "lucide-react": "^0.486.0", "next": "latest",