当我做一些事情时,我发现了一个奇怪的问题。 我尝试进行语音识别。条件的第一部分可以正常工作,但不适用于第二部分。
var v;
function test() {
var ses = new webkitSpeechRecognition();
ses.lang = "En"
ses.continuous = true;
ses.start();
ses.onresult = function(event)
if (event.results.length > 0) {
sonuc = event.results[event.results.length - 1];
document.querySelector("input").value = sonuc[0].transcript;
v = sonuc[0].transcript;
console.log(v + " 1");
if (v == "good") {
switchLED('on');
console.log(v + "2");
console.log("OK !");
console.log("LED ok");
}
if (v == "bad") {
switchLED('off');
console.log(v + "2");
console.log("OK !");
console.log("LED off");
}
}
}
我第一次说:good
结果是:
good 1
good 2
OK !
LED OK
这是正确的。
然后第二次,如果我说:bad
结果是:
bad 1
并且它没有满足条件if(v == "bad")
。
只有当bad
是我说的第二个单词时才会发生。如果我第一次刷新页面并直接说“不好”,我将获得所有正确的结果。
答案 0 :(得分:0)
对于连续识别,必要时将包含前导或尾随空白,以便将连续的SpeechRecognitionResults串联在一起可以生成正确的会话记录。
这完全符合您的描述。由于您的语音识别会话是连续的(如ses.continuous = true
中所示),结果是,当您第一次说任何单词时,抄录员将正确地获得该单词。但是,当它识别出下一个单词时,将添加一个前导空格。您可能复制了控制台输出,一定是这样的:
good 1
good 2
OK !
LED OK
bad 1
^ leading space here
实际上," bad"
不等于"bad"
。这就是字符串未通过条件的原因。要解决此问题,只需确保trim您的字符串:
var v;
function test() {
var ses = new webkitSpeechRecognition();
ses.lang = "En"
ses.continuous = true;
ses.start();
ses.onresult = function(event)
if (event.results.length > 0) {
sonuc = event.results[event.results.length - 1];
document.querySelector("input").value = sonuc[0].transcript;
v = sonuc[0].transcript.trim(); // <-- trim here
console.log(v + " 1");
if (v == "good") {
switchLED('on');
console.log(v + "2");
console.log("OK !");
console.log("LED ok");
}
if (v == "bad") {
switchLED('off');
console.log(v + "2");
console.log("OK !");
console.log("LED off");
}
}
}
然后您的代码应该可以按预期工作。希望对您有帮助!