/** * POST /api/coach/speak-google * Test endpoint for Google Cloud TTS */ 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 trimmed = text.slice(0, 4096); const config = useRuntimeConfig(); if (!config.googleApiKey) { throw createError({ statusCode: 503, message: "Google API Key nicht konfiguriert" }); } try { const response = await fetch( `https://texttospeech.googleapis.com/v1/text:synthesize?key=${config.googleApiKey}`, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ input: { text: trimmed }, voice: { languageCode: "de-DE", name: "de-DE-Neural2-F", ssmlGender: "FEMALE", }, audioConfig: { audioEncoding: "MP3", speakingRate: 1.0, pitch: 0, }, }), } ); const result = await response.json(); if (!response.ok) { console.error("[speak-google] Google TTS error:", result); throw createError({ statusCode: response.status, message: result.error?.message || "Google TTS fehlgeschlagen", }); } if (!result.audioContent) { console.error("[speak-google] No audioContent:", result); throw createError({ statusCode: 502, message: "Google TTS: kein Audio zurückgegeben" }); } return { audio: `data:audio/mp3;base64,${result.audioContent}` }; } catch (err: any) { console.error("[speak-google] Error:", err); throw createError({ statusCode: 502, message: err?.message || "Google TTS fehlgeschlagen", }); } });