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’);
}
