我正在尝试使用HTML5语音识别API来记录我在屏幕上说的内容。我有一个关键字必须首先说明,以便其他单词被选中,所以它有点像Apple的Siri。当你说“好的,谷歌”时,它会再听两个单词,当它听到它们时,它会在屏幕上打印出来。代码的工作方式如下:
当我只能退出第一个函数时,我无法退出两个if语句。当你说“完成”这个词时,你仍然可以说“15”或“30”并将它们打印到屏幕上,但我不希望你能说“完成”后将这两个数字打印到屏幕上。我想让你在说出这两个号码之前再说“好吧,谷歌”。
这是代码,我希望有人可以提供帮助。 提前谢谢。
recognition.onresult = function(event){
var resultsLength = event.results.length -1 ;
var ArrayLength = event.results[resultsLength].length -1;
var Word = event.results[resultsLength][ArrayLength].transcript;
console.log(Word);
if (Word.indexOf('okay', 'google') != -1) {
test.style.borderColor = "white";
recognition.onresult = function(event){
var resultsLength = event.results.length -1 ;
var ArrayLength = event.results[resultsLength].length -1;
var Word = event.results[resultsLength][ArrayLength].transcript;
console.log(Word);
document.getElementById('test').value = Word;
if (Word.indexOf('15') != -1) {
test.innerHTML = '15';
}
if (Word.indexOf('30') != -1) {
test.innerHTML = '30';
}
if (Word.indexOf('finished') != -1) {
test.style.borderColor = "black";
return;
}
}
}
}
答案 0 :(得分:0)
在您发布的代码的第8行,您将处理函数分配给recognition.onresult:
recognition.onresult = function(event){
// content removed
}
问题在于,当您听到"已完成"时,您根本不会删除或替换此处理程序。下次触发事件时,完全相同的处理程序再次启动并打印单词。
你需要做的是,当你听到"完成"这个词时,将onresult处理程序设置为其他东西:
if (Word.indexOf('finished') != -1) {
recognition.onresult = function(event){
// do something different now that we've heard "Finished"
}
test.style.borderColor = "black";
return;
}
请注意,根据您的描述,您想要的是将初始函数(您在第1行中分配的整个代码)重新分配给处理程序。这开始变得非常复杂和困难,因为你现在处理两个匿名函数,一个嵌套在另一个中,并且你想从内部函数中分配外部函数。
在这种情况下,如果你打破这些匿名函数并给它们命名,你的代码将更容易阅读,这样你就可以重复地将它们分配/重新分配给recognition.onresult。
这绝不是一个完整的实现,我还没有对以下内容进行测试,但看看以下是否有意义:
recognition.onresult = listenForOkayGoogle;
function listenForOkayGoogle(event) {
var Word = ...;
if (Word.indexOf('okay', 'google') != -1) {
recognition.onresult = listenForNumbersUntilFinished;
}
}
function listenForNumbersUntilFinished(event) {
var Word = ...;
if (Word.indexOf('15') != -1) {
// print it
}
if (Word.indexOf('30') != -1) {
// print it
}
if (Word.indexOf('finished') != -1) {
recognition.onresult = listenForOkayGoogle;
}
}
首先,将listenForOkayGoogle指定为处理程序。每当事件被触发时,这个处理程序就会启动并检查是否已经说出了一个神奇的单词,如果是,它用listenForNumbersUntilFinished替换处理程序。现在,每次触发事件时,该处理程序都会启动。如果单词与相关数字之一匹配,则打印出来;如果它匹配单词' finished',则再次分配listenForOkayGoogle处理程序。您在此处使用Strategy Pattern生效。
答案 1 :(得分:0)
在嵌套'if'执行之前,'top-level if'已经完成。要解决您的问题,您不应该在收到'okay google'时设置新的事件处理程序。相反,你应该实现某种状态机。例如:
function setup(recognition) {
var isListeningOkayGoogle = true;
recognition.onresult = function(event) {
var resultsLength = event.results.length -1 ;
var ArrayLength = event.results[resultsLength].length -1;
var Word = event.results[resultsLength][ArrayLength].transcript;
console.log(Word);
if (isListeningOkayGoogle) {
if (Word.indexOf('okay', 'google') != -1) {
test.style.borderColor = "white";
isListeningOkayGoogle = false;
}
} else {
document.getElementById('test').value = Word;
if (Word.indexOf('15') != -1) {
test.innerHTML = '15';
}
if (Word.indexOf('30') != -1) {
test.innerHTML = '30';
}
if (Word.indexOf('finished') != -1) {
test.style.borderColor = "black";
isListeningOkayGoogle = true; // start listening 'Okay Google' again
}
}
}
}