Files
echoes/client/js/guideVoice.js

70 lines
1.8 KiB
JavaScript

/*
guideVoice.js
Vocalise les instructions recues du serveur via la synthese vocale du navigateur
*/
let currentUtterance = null;
let voixChoisie = null;
let voixPretes = false;
let texteEnAttente = null;
const NOM_VOIX_PREFERE = "French (France)+female1";
function resoudreVoix() {
if (voixPretes) return; // deja fait, evite le travail en double
const voix = speechSynthesis.getVoices();
if (voix.length === 0) return; // toujours pas chargees
voixChoisie =
voix.find(v => v.name === NOM_VOIX_PREFERE) ||
voix.find(v => v.lang.startsWith("fr")) ||
voix[0];
voixPretes = true;
console.log("Voix sélectionnée:", voixChoisie?.name);
if (texteEnAttente) {
const texte = texteEnAttente;
texteEnAttente = null;
jouer(texte);
}
}
// Piste 1 : l'event, au cas ou il se declenche sur d'autres navigateurs
speechSynthesis.onvoiceschanged = resoudreVoix;
// Piste 2 : sondage en secours, car onvoiceschanged n'est pas fiable sur Firefox/LibreWolf
const intervalleSondage = setInterval(() => {
resoudreVoix();
if (voixPretes) clearInterval(intervalleSondage);
}, 200);
resoudreVoix(); // au cas ou les voix sont deja dispo au chargement du module
function jouer(texte) {
if (speechSynthesis.speaking) {
speechSynthesis.cancel();
}
currentUtterance = new SpeechSynthesisUtterance(texte);
currentUtterance.voice = voixChoisie;
currentUtterance.lang = "fr-FR";
currentUtterance.onstart = () => console.log("Lecture démarrée");
currentUtterance.onend = () => console.log("Lecture terminée");
currentUtterance.onerror = (e) => console.error("Erreur synthèse:", e.error, e);
speechSynthesis.speak(currentUtterance);
}
export function speakInstruction(texte) {
if (!voixPretes) {
console.log("Voix pas encore prêtes, mise en attente:", texte);
texteEnAttente = texte;
return;
}
jouer(texte);
}