// ============================================== // WebSpeech.jslib - Text-to-Speech fuer WebGL // ============================================== // Kopiere diese Datei nach Assets/Plugins/WebGL/ // um TTS im Browser zu aktivieren. mergeInto(LibraryManager.library, { // Spricht den Text sofort SpeakWebGL: function(textPtr) { var text = UTF8ToString(textPtr); if ('speechSynthesis' in window) { // Vorherige Sprache stoppen window.speechSynthesis.cancel(); var utterance = new SpeechSynthesisUtterance(text); utterance.lang = 'de-DE'; utterance.rate = 0.9; utterance.pitch = 1.0; utterance.volume = 1.0; // Deutsche Stimme suchen var voices = window.speechSynthesis.getVoices(); var germanVoice = voices.find(function(voice) { return voice.lang.startsWith('de'); }); if (germanVoice) { utterance.voice = germanVoice; } window.speechSynthesis.speak(utterance); } else { console.warn('Text-to-Speech wird von diesem Browser nicht unterstuetzt.'); } }, // Spricht den Text nach einer Verzoegerung SpeakDelayedWebGL: function(textPtr, delaySeconds) { var text = UTF8ToString(textPtr); setTimeout(function() { if ('speechSynthesis' in window) { var utterance = new SpeechSynthesisUtterance(text); utterance.lang = 'de-DE'; utterance.rate = 0.9; utterance.pitch = 1.0; utterance.volume = 1.0; var voices = window.speechSynthesis.getVoices(); var germanVoice = voices.find(function(voice) { return voice.lang.startsWith('de'); }); if (germanVoice) { utterance.voice = germanVoice; } window.speechSynthesis.speak(utterance); } }, delaySeconds * 1000); }, // Stoppt alle laufenden Sprach-Ausgaben StopSpeakingWebGL: function() { if ('speechSynthesis' in window) { window.speechSynthesis.cancel(); } }, // Prueft ob TTS verfuegbar ist IsTTSAvailableWebGL: function() { return 'speechSynthesis' in window; }, // Gibt verfuegbare Stimmen zurueck (als JSON) GetAvailableVoicesWebGL: function() { if ('speechSynthesis' in window) { var voices = window.speechSynthesis.getVoices(); var germanVoices = voices.filter(function(voice) { return voice.lang.startsWith('de'); }).map(function(voice) { return { name: voice.name, lang: voice.lang, local: voice.localService }; }); var json = JSON.stringify(germanVoices); var bufferSize = lengthBytesUTF8(json) + 1; var buffer = _malloc(bufferSize); stringToUTF8(json, buffer, bufferSize); return buffer; } return null; } });