Da Ihr Problem darin besteht, dass Sie die SpeechRecognition nicht kontinuierlich für lange Zeiträume ausführen können, wäre eine Möglichkeit, die SpeechRecognition nur zu starten, wenn Sie etwas Input im Mikrofon erhalten.
Nur auf diese Weise starten Sie die SR und suchen nach Ihrem magic_word.
Wenn das magic_word gefunden wird, können Sie das SR normalerweise für Ihre anderen Aufgaben verwenden.
Dies kann von der WebAudioAPI erkannt werden, die nicht von dieser Zeitbeschränkung betroffen ist SR leidet darunter. Sie können es mit einem LocalMediaStream von MediaDevices.getUserMedia
füttern.
Weitere Informationen finden Sie unter folgendem Skript: this answer.
Hier ist, wie Sie es zu einem Spracherkennungs befestigen könnte:
const magic_word = ##YOUR_MAGIC_WORD##;
// initialize our SpeechRecognition object
let recognition = new webkitSpeechRecognition();
recognition.lang = 'en-US';
recognition.interimResults = false;
recognition.maxAlternatives = 1;
recognition.continuous = true;
// detect the magic word
recognition.onresult = e => {
// extract all the transcripts
var transcripts = [].concat.apply([], [...e.results]
.map(res => [...res]
.map(alt => alt.transcript)
)
);
if(transcripts.some(t => t.indexOf(magic_word) > -1)){
//do something awesome, like starting your own command listeners
}
else{
// didn't understood...
}
}
// called when we detect silence
function stopSpeech(){
recognition.stop();
}
// called when we detect sound
function startSpeech(){
try{ // calling it twice will throw...
recognition.start();
}
catch(e){}
}
// request a LocalMediaStream
navigator.mediaDevices.getUserMedia({audio:true})
// add our listeners
.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); // will hold our data
let silence_start = performance.now();
let triggered = false; // trigger only once per silence event
function loop(time) {
requestAnimationFrame(loop); // we'll loop every 60th of a second to check
analyser.getByteFrequencyData(data); // get current data
if (data.some(v => v)) { // if there is data above the given db limit
if(triggered){
triggered = false;
onSoundStart();
}
silence_start = time; // set it to now
}
if (!triggered && time - silence_start > silence_delay) {
onSoundEnd();
triggered = true;
}
}
loop();
}
Als a plunker, da weder StackSnippets noch iframes der jsfiddle GUM in zwei Versionen erlauben ...
Schweigen ist automatisch entdeckt von 'Web Speech Api'. Es bricht die "Spracherkennung" mit dem Fehlercode "keine Sprache" ab. Meine Frage ist nicht die Stille zu erkennen, es ist etwas, was ich möchte weiter hören wie Android "Ok Google". Unser Handy hört immer zu und wenn es 'Ok Google' entdeckt, aktiviert es es. Ich möchte das gleiche aber mit bestem Ansatz im Browser. –
@ArunRedhu du hast die Antwort dann nicht bekommen. Ihr Problem besteht darin, dass Sie keine langen, kontinuierlichen SpeechRecognitions machen können, oder? Mit dieser Lösung können Sie die SpeechRecognition nur starten, wenn tatsächlich Eingabesounds vorhanden sind. Auf diese Weise können Sie auf Ihr magic_word warten, wenn es gesagt wurde, aktivieren Sie Ihre anderen Listener, ansonsten ignorieren Sie einfach und warten auf das nächste magic_word. Auf diese Weise verwenden Sie die WebSpeechAPI nicht so lange, wie das magic_word nicht gesagt wurde. – Kaiido
@ArunRedhu Ich habe die Antwort neu formuliert und hoffe, dass Sie jetzt sehen, was diese Lösung zu überwinden versucht und wie. – Kaiido