sS hSpeechRecognition(S jsOnSpeech, bool autoStart) { ret hSpeechRecognition(jsOnSpeech, autoStart, "de-DE", true); } // requires JQuery sS hSpeechRecognition(S jsOnSpeech, bool autoStart, S language, bool autoTurnOn, O... _) { optPar S noWebKit = "No webkit"; optPar S speechUI = ""; ret hjavascript(([[ var bigOn = #BIGON#, pause = false, listening = false; var recognition; var firstStart = true; function resultHTML(html) { if ($("#speechResults")) $("#speechResults").html(html); } function srUpdate() { var btn = $("#speechOnBtn"); if (btn) { btn.prop('disabled', false); btn.html(bigOn ? "Stop listening" : "Listen"); } var should = bigOn && !pause; if (should && !listening) startRecognition(); else if (!should && listening) stopRecognition(); } function stopRecognition() { listening = false; recognition.stop(); srUpdate(); } function startRecognition() { listening = true; recognition.start(); if (firstStart) { firstStart = false; resultHTML("You can talk now"); } srUpdate(); } function startSpeechRecog() { resultHTML("Starting"); console.log("startSpeechRecog"); if (!('webkitSpeechRecognition' in window)) { console.log("No webkit"); document.writeln(]] + jsQuote(noWebKit) + [[); return; } console.log("Have webkit"); document.writeln(]] + jsQuote(speechUI) + [[); recognition = new webkitSpeechRecognition(); resultHTML("Speech recognition available."); recognition.lang = "#LANGUAGE#"; recognition.onerror = function(event) { var s = " "; if (event.error != "no-speech") s = "Error: " + event.error; resultHTML(s); } recognition.onresult = function(event) { var result = event.results[0]; var transcript = result[0].transcript; resultHTML(transcript); #ONSPEECH# if (transcript == "stop listening") stopRecognition(); } recognition.onnomatch = function(event) { resultHTML("-"); } recognition.onend = function(event) { listening = false; setTimeout(srUpdate, 100); } srUpdate(); } function startOrStop() { bigOn = !bigOn; srUpdate(); } ]] + (autoStart ? "startSpeechRecog();" : "")) .replace("#BIGON#", str(autoTurnOn)) .replace("#LANGUAGE#", language) .replace("#ONSPEECH#", jsOnSpeech)); }