45 lines
1.2 KiB
TypeScript
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}` };
|
|
});
|