LYD LYD TEST

// GOOGLE TEXT-TO-SPEECH INTEGRATION // VIGTIGT: Udskift med din RIGTIGE API key fra Google Cloud Console const GOOGLE_TTS_API_KEY = ‘DIN-RIGTIGE-API-KEY-HER’; // <-- UDSKIFT DENNE! // Tilgængelige danske stemmer const availableDanishVoices = { // Standard stemmer 'da-DK-Standard-A': { gender: 'FEMALE', type: 'Standard' }, 'da-DK-Standard-C': { gender: 'MALE', type: 'Standard' }, 'da-DK-Standard-D': { gender: 'FEMALE', type: 'Standard' }, 'da-DK-Standard-E': { gender: 'FEMALE', type: 'Standard' }, // WaveNet stemmer (højere kvalitet) 'da-DK-Wavenet-A': { gender: 'FEMALE', type: 'WaveNet' }, 'da-DK-Wavenet-C': { gender: 'MALE', type: 'WaveNet' }, 'da-DK-Wavenet-D': { gender: 'FEMALE', type: 'WaveNet' }, 'da-DK-Wavenet-E': { gender: 'FEMALE', type: 'WaveNet' }, // Chirp3 stemmer (nyeste og bedste kvalitet) 'da-DK-Chirp3-HD-Achernar': { gender: 'FEMALE', type: 'Chirp3' }, 'da-DK-Chirp3-HD-Leda': { gender: 'FEMALE', type: 'Chirp3' }, 'da-DK-Chirp3-HD-Ophelia': { gender: 'FEMALE', type: 'Chirp3' }, 'da-DK-Chirp3-HD-Perseus': { gender: 'MALE', type: 'Chirp3' } }; // Global voice selection let selectedVoiceName = 'da-DK-Chirp3-HD-Achernar'; async function playAudioGoogle(text) { const isExercise = text.includes('øvelse') || text.includes('Gentag') || text.includes('Spænd') || text.includes('tæl') || text.includes('Læg mærke til fem') || text.includes('Ånd') || text.includes('vejrtrækningsøvelse') || text.includes('Arbejd dig langsomt'); try { console.log(`Bruger Google TTS med stemme: ${selectedVoiceName}`); const url = `https://texttospeech.googleapis.com/v1/text:synthesize?key=${GOOGLE_TTS_API_KEY}`; const requestBody = { input: { text: text }, voice: { languageCode: "da-DK", name: selectedVoiceName }, audioConfig: { audioEncoding: "MP3", speakingRate: 0.85, pitch: 0.0 } }; console.log('Sender request til Google TTS:', requestBody); const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(requestBody) }); if (!response.ok) { const errorText = await response.text(); console.error('Google TTS API fejl:', response.status, errorText); throw new Error(`API fejl: ${response.status} - ${errorText}`); } const data = await response.json(); if (data.audioContent) { console.log('Audio content modtaget, afspiller nu...'); const audio = new Audio(); audio.src = "data:audio/mp3;base64," + data.audioContent; audio.onended = () => { console.log(‘Audio afspilning færdig’); if (!isPaused) { if (isExercise) { showExerciseComplete(); } else { setTimeout(() => handleSessionEnd(), 1000); } } }; audio.onerror = (e) => { console.error(‘Audio playback error:’, e); console.log(‘Falder tilbage til browser speech’); playAudioFallback(text); }; await audio.play(); console.log(`Audio afspillet succesfuldt med stemme: ${selectedVoiceName}`); } else { console.error(“Google TTS fejl – ingen audioContent:”, data); throw new Error(“Ingen audioContent modtaget”); } } catch (error) { console.error(‘Google TTS fejlede:’, error); console.log(‘Bruger browser speech fallback’); playAudioFallback(text); } } // Main audio function function playAudio(text) { // Check hvis API key er sat (og ikke er placeholder) if (GOOGLE_TTS_API_KEY && GOOGLE_TTS_API_KEY !== ‘DIN-RIGTIGE-API-KEY-HER’) { console.log(‘Bruger Google TTS’); playAudioGoogle(text); } else { console.log(‘API key ikke sat – bruger fallback’); playAudioFallback(text); } } // Voice change function function changeVoice(voiceName) { if (availableDanishVoices[voiceName]) { selectedVoiceName = voiceName; console.log(`Stemme ændret til: ${voiceName}`); localStorage.setItem(‘selectedVoice’, voiceName); return true; } else { console.error(`Ugyldig stemme: ${voiceName}`); console.log(‘Tilgængelige stemmer:’, Object.keys(availableDanishVoices)); return false; } } // Test function med bedre fejlhåndtering async function testVoice(voiceName) { console.log(`=== TESTER STEMME: ${voiceName} ===`); if (!changeVoice(voiceName)) { return; } const testText = “Hej, jeg er en test af denne danske stemme. Hvordan lyder jeg?”; try { await playAudioGoogle(testText); console.log(`✅ Test af ${voiceName} gennemført succesfuldt`); } catch (error) { console.error(`❌ Test af stemme ${voiceName} fejlede:`, error); } } // Debug function med mere info function debugTTS() { console.log(‘=== TTS Debug Info ===’); console.log(‘API Key sat:’, GOOGLE_TTS_API_KEY !== ‘DIN-RIGTIGE-API-KEY-HER’ ? ‘✅ JA’ : ‘❌ NEJ’); console.log(‘API Key værdi:’, GOOGLE_TTS_API_KEY ? ‘(skjult af sikkerhedshensyn)’ : ‘IKKE SAT’); console.log(‘Nuværende stemme:’, selectedVoiceName); console.log(‘Stemme type:’, availableDanishVoices[selectedVoiceName]?.type || ‘UKENDT’); console.log(‘Tilgængelige stemmer:’, Object.keys(availableDanishVoices)); console.log(‘=====================’); } // Quick test med Chirp3 function quickTest() { console.log(‘=== HURTIG TEST AF CHIRP3 ===’); testVoice(‘da-DK-Chirp3-HD-Achernar’); }