rebreak-monorepo/backend/server/api/coach/speak-deepgram.post.ts

45 lines
1.2 KiB
TypeScript

/**
* POST /api/coach/speak-deepgram
* Deepgram Aura TTS — returns base64 MP3
*/
export default defineEventHandler(async (event) => {
await requireUser(event);
const body = await readBody(event);
const { text } = body as { text: string };
if (!text?.trim()) {
throw createError({ statusCode: 400, message: "text fehlt" });
}
const config = useRuntimeConfig();
const key = config.deepgramApiKey as string | undefined;
if (!key) {
throw createError({ statusCode: 503, message: "Deepgram API Key nicht konfiguriert" });
}
const response = await fetch(
"https://api.deepgram.com/v1/speak?model=aura-asteria-en&encoding=mp3",
{
method: "POST",
headers: {
Authorization: `Token ${key}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ text: text.slice(0, 2000) }),
},
);
if (!response.ok) {
const err = await response.text();
console.error("[speak-deepgram] error:", response.status, err);
throw createError({ statusCode: 502, message: "Deepgram TTS fehlgeschlagen" });
}
const buffer = await response.arrayBuffer();
const base64 = Buffer.from(buffer).toString("base64");
return { audio: `data:audio/mp3;base64,${base64}` };
});