Select Git revision
voice.js 12.75 KiB
var voiceBtn = document.getElementById("voiceBtn");
var voiceDiv = document.getElementById("voiceDiv");
var voiceSpan = document.getElementById("voiceSpan");
var heardSpan = document.getElementById("heardSpan");
var commandSpan = document.getElementById("commandSpan");
const voiceSelect = document.getElementById("selectVoice");
let voices = [];
const synth = window.speechSynthesis;
var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
var SpeechGrammarList = SpeechGrammarList || webkitSpeechGrammarList;
var SpeechRecognitionEvent = SpeechRecognitionEvent || webkitSpeechRecognitionEvent;
function populateVoiceList() {
voices = synth.getVoices().sort(function (a, b) {
const aname = a.name.toUpperCase();
const bname = b.name.toUpperCase();
if (aname < bname) {
return -1;
} else if (aname == bname) {
return 0;
} else {
return +1;
}
});
const selectedIndex = voiceSelect.selectedIndex < 0 ? 0 : voiceSelect.selectedIndex;
for (let i = 0; i < voices.length; i++) {
const option = document.createElement("option");
option.textContent = `${voices[i].name} (${voices[i].lang})`;
if (voices[i].default) {
option.textContent += " -- DEFAULT";
}
option.setAttribute("data-lang", voices[i].lang);
option.setAttribute("data-name", voices[i].name);
voiceSelect.appendChild(option);
}
voiceSelect.selectedIndex = selectedIndex;
}
voiceBtn.addEventListener("click", startListening);
if ('speechSynthesis' in window) {
}else{
// Speech Synthesis Not Supported
alert("Sorry, your browser doesn't support text to speech!");
}
function startListening(){
voiceBtn.disabled = true;
voiceSpan.innerText = 'Dites "Cristo !" pour commencer a donner votre requete';
voiceSpan.style.display = "";
heardSpan.innerText = "";
heardSpan.style.display = "none";
commandSpan.innerText = "";
commandSpan.style.display = "none";
voiceBtn.innerText = "Ecoute en cours";
listenForCristo();
}
function listenForCristo(){
var cristo = [
'Cristo',
'cristo',
'crist',
'risto'
];
var grammar = '#JSGF V1.0; grammar phrase; public <phrase> = cristaux;';
var recognition = new SpeechRecognition();
var speechRecognitionList = new SpeechGrammarList();
speechRecognitionList.addFromString(grammar, 1);
recognition.grammars = speechRecognitionList;
recognition.lang = 'fr-FR';
recognition.interimResults = false;
recognition.maxAlternatives = 1;
speak("Dites cristeaux pour donner votre requete");
recognition.start();
console.log('Started first listening');
recognition.onresult = function(event) {
console.log('Listened');
var speechResult = event.results[0][0].transcript.toLowerCase();
console.log(speechResult);
heardSpan.innerText = " A entendu = " + speechResult;
heardSpan.style.display = "";
voiceSpan.style.display = "none";
console.log('Confidence: ' + event.results[0][0].confidence);
if(speechResult.toLowerCase().includes("cristaux")){
speak("Veuillez me donner votre requete");
console.log('Heard Cristo ! (or Cristaux)');
listenForCommand();
} else {
speak("Je n'ai pas entendu Cristeaux");
console.log('Heard nothing');
enableBtn();
}
}
recognition.onspeechend = function() {
recognition.stop();
}
recognition.onerror = function(event) {
voiceBtn.disabled = false;
voiceBtn.textContent = 'Ecouter a nouveau';
console.log('Error occurred in recognition: ' + event.error);
voiceSpan.style.display = "none";
heardSpan.innerText = " Erreur ";
heardSpan.style.display = "";
}
recognition.onaudiostart = function(event) {
//Fired when the user agent has started to capture audio.
console.log('SpeechRecognition.onaudiostart');
}
recognition.onaudioend = function(event) {
//Fired when the user agent has finished capturing audio.
console.log('SpeechRecognition.onaudioend');
}
recognition.onend = function(event) {
//Fired when the speech recognition service has disconnected.
/* console.log('SpeechRecognition.onend'); */
/* console.log("A entendu = " + event.results); */
voiceSpan.style.display = "none";
}
recognition.onnomatch = function(event) {
//Fired when the speech recognition service returns a final result with no significant recognition. This may involve some degree of recognition, which doesn't meet or exceed the confidence threshold.
console.log('SpeechRecognition.onnomatch');
}
recognition.onsoundstart = function(event) {
//Fired when any sound — recognisable speech or not — has been detected.
console.log('SpeechRecognition.onsoundstart');
}
recognition.onsoundend = function(event) {
//Fired when any sound — recognisable speech or not — has stopped being detected.
/* console.log('SpeechRecognition.onsoundend'); */
}
recognition.onspeechstart = function (event) {
//Fired when sound that is recognised by the speech recognition service as speech has been detected.
console.log('SpeechRecognition.onspeechstart');
}
recognition.onstart = function(event) {
//Fired when the speech recognition service has begun listening to incoming audio with intent to recognize grammars associated with the current SpeechRecognition.
console.log('SpeechRecognition.onstart');
}
}
function listenForCommand(){
var grammar = '#JSGF V1.0; grammar phrase; public <phrase> = descends | descend | remonte | monte | recette | aleatoire | suivante | precedente;';
var recognition = new SpeechRecognition();
var speechRecognitionList = new SpeechGrammarList();
speechRecognitionList.addFromString(grammar, 1);
recognition.grammars = speechRecognitionList;
recognition.lang = 'fr-FR';
recognition.interimResults = false;
recognition.maxAlternatives = 1;
recognition.start();
console.log('Started first listening');
recognition.onresult = function(event) {
console.log('Listened');
var speechResult = event.results[0][0].transcript.toLowerCase();
console.log(speechResult);
heardSpan.innerText = " A entendu = " + speechResult;
heardSpan.style.display = "";
voiceSpan.style.display = "none";
console.log('Confidence: ' + event.results[0][0].confidence);
if(speechResult.toLowerCase().includes("descend")){
speak("Je vais descendre dans la page");
pageScrollDown();
}
else if(speechResult.toLowerCase().includes("monte")){
speak("Je vais monter dans la page");
pageScrollUp();
}
else if(speechResult.toLowerCase().includes("recette")){
if(speechResult.toLowerCase().includes("précédente")){
speak("Voici la recette precedente");
}
else if(speechResult.toLowerCase().includes("suivante")){
speak("Voici la prochaine recette");
}
else if(speechResult.toLowerCase().includes("aléatoire")){
speak("Voici une recette aleatoire");
recetteAleatoire();
}
}
else {
speak("Je n'ai rien entendu ou je n'ai pas reconnu la requete");
}
enableBtn();
}
recognition.onspeechend = function() {
recognition.stop();
}
recognition.onerror = function(event) {
enableBtn();
diagnosticPara.textContent = 'Error occurred in recognition: ' + event.error;
heardSpan.innerText += " Erreur ";
heardSpan.style.display = "";
}
recognition.onaudiostart = function(event) {
//Fired when the user agent has started to capture audio.
console.log('SpeechRecognition.onaudiostart');
}
recognition.onaudioend = function(event) {
//Fired when the user agent has finished capturing audio.
console.log('SpeechRecognition.onaudioend');
}
recognition.onend = function(event) {
//Fired when the speech recognition service has disconnected.
/* console.log('SpeechRecognition.onend'); */
/* console.log("A entendu = " + event.results); */
voiceSpan.style.display = "none";
}
recognition.onnomatch = function(event) {
//Fired when the speech recognition service returns a final result with no significant recognition. This may involve some degree of recognition, which doesn't meet or exceed the confidence threshold.
console.log('SpeechRecognition.onnomatch');
}
recognition.onsoundstart = function(event) {
//Fired when any sound — recognisable speech or not — has been detected.
console.log('SpeechRecognition.onsoundstart');
}
recognition.onsoundend = function(event) {
//Fired when any sound — recognisable speech or not — has stopped being detected.
/* console.log('SpeechRecognition.onsoundend'); */
}
recognition.onspeechstart = function (event) {
//Fired when sound that is recognised by the speech recognition service as speech has been detected.
console.log('SpeechRecognition.onspeechstart');
}
recognition.onstart = function(event) {
//Fired when the speech recognition service has begun listening to incoming audio with intent to recognize grammars associated with the current SpeechRecognition.
console.log('SpeechRecognition.onstart');
}
}
function listenForStop(){
var grammar = '#JSGF V1.0; grammar phrase; public <phrase> = stop | arrete;';
var recognition = new SpeechRecognition();
var speechRecognitionList = new SpeechGrammarList();
speechRecognitionList.addFromString(grammar, 1);
recognition.grammars = speechRecognitionList;
recognition.lang = 'fr-FR';
recognition.interimResults = false;
recognition.maxAlternatives = 1;
recognition.start();
console.log('Started first listening');
recognition.onresult = function(event) {
console.log('Listened');
var speechResult = event.results[0][0].transcript.toLowerCase();
console.log(speechResult);
heardSpan.innerText += " A entendu = " + speechResult;
heardSpan.style.display = "";
voiceSpan.style.display = "none";
console.log('Confidence: ' + event.results[0][0].confidence);
if(speechResult.toLowerCase().includes("stop")){
speak("Je vais arreter de descendre dans la page");
return true;
}
else if(speechResult.toLowerCase().includes("arrete")){
speak("Je vais arreter de descendre dans la page");
return true;
}
else {
return false;
}
}
}
function speak(text){
if (synth.speaking) {
console.error("speechSynthesis.speaking");
return;
}
const utterThis = new SpeechSynthesisUtterance(text);
utterThis.onend = function (event) {
console.log("SpeechSynthesisUtterance.onend");
};
utterThis.onerror = function (event) {
console.error("SpeechSynthesisUtterance.onerror");
};
for (let i = 0; i < voices.length; i++) {
if (voices[i].name === voiceSelect.selectedOptions[0].getAttribute("data-name")) {
utterThis.voice = voices[i];
break;
}
}
utterThis.pitch = 1;
utterThis.rate = 1;
synth.speak(utterThis);
}
function enableBtn(){
voiceBtn.disabled = false;
voiceBtn.textContent = 'Ecouter a nouveau';
voiceSpan.style.display = "none";
}
function pageScrollDown() {
window.scrollBy(0,1);
if ((window.innerHeight + Math.round(window.scrollY)) >= document.body.offsetHeight) {
speak("Bas de page atteind, j'arrete de descendre");
}
else{
scrolldelay = setTimeout(pageScrollDown,5);
}
}
function pageScrollUp() {
window.scrollBy(0,-1);
if (window.scrollY <= 1) {
speak("Haut de page atteind, j'arrete de monter");
}
else{
scrolldelay = setTimeout(pageScrollUp,5);
}
}
function getRandomInt(max) {
return Math.floor(Math.random() * max);
}
function recetteAleatoire(){
let recettes = ["cookie-au-chocolat", "soupe-au-potiron", "pain-perdu", "quiche-lorraine"]
let number = getRandomInt(recettes.length);
url = window.location;
window.location.href = url.origin+'/recette/'+recettes[number];
}
function scrollDown(){
}
docReady(function() {
populateVoiceList();
voiceSelect.value= "Microsoft Paul - French (France) (fr-FR)";
});
navigator.mediaDevices.getUserMedia({ audio: true })
.then(function(stream) {
console.log('You let me use your mic!')
})
.catch(function(err) {
console.log('No mic for you!')
});