const magic_word = ##YOUR_MAGIC_WORD##;
let recognition = new webkitSpeechRecognition();
recognition.lang = 'en-US';
recognition.interimResults = false;
recognition.maxAlternatives = 1;
recognition.continuous = true;
recognition.onresult = e => {
var transcripts = [].concat.apply([], [...e.results]
.map(res => [...res]
.map(alt => alt.transcript)
)
);
if(transcripts.some(t => t.indexOf(magic_word) > -1)){
}
else{
}
}
function stopSpeech(){
recognition.stop();
}
function startSpeech(){
try{
recognition.start();
}
catch(e){}
}
navigator.mediaDevices.getUserMedia({audio:true})
.then(stream => detectSilence(stream, stopSpeech, startSpeech))
.catch(e => log(e.message));
function detectSilence(
stream,
onSoundEnd = _=>{},
onSoundStart = _=>{},
silence_delay = 500,
min_decibels = -80
) {
const ctx = new AudioContext();
const analyser = ctx.createAnalyser();
const streamNode = ctx.createMediaStreamSource(stream);
streamNode.connect(analyser);
analyser.minDecibels = min_decibels;
const data = new Uint8Array(analyser.frequencyBinCount);
let silence_start = performance.now();
let triggered = false;
function loop(time) {
requestAnimationFrame(loop);
analyser.getByteFrequencyData(data);
if (data.some(v => v)) {
if(triggered){
triggered = false;
onSoundStart();
}
silence_start = time;
}
if (!triggered && time - silence_start > silence_delay) {
onSoundEnd();
triggered = true;
}
}
loop();
}