0

当我在做一些事情时,我发现了一个奇怪的问题。我尝试进行语音识别。条件的第一部分正常工作,但不适用于第二部分。

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只有当我说第二个字时才会发生。如果我第一次刷新页面并直接说“不好”,我会得到所有正确的结果。

4

1 回答 1

1

根据Mozzila 的文档

对于连续识别,将在必要时包含前导或尾随空格,以便连续的 SpeechRecognitionResults 的连接产生正确的会话记录。

这与您描述的完全一致。由于您的语音识别会话是连续的(如 中所示ses.continuous = true),因此当您第一次说出任何单词时,转录器会正确识别该单词。但是当它识别出下一个单词时,会添加一个前导空格。您可能错误地复制了控制台输出,它一定是这样的:

good 1 
good 2
OK ! 
LED OK

 bad 1 
^ leading space here

确实," bad"不等于"bad"。这就是字符串没有通过条件的原因。要解决这个问题,只需确保修剪你的字符串:

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");
      }
    }
  }

然后您的代码应该按预期工作。希望能帮助到你!

于 2019-06-19T03:36:25.457 回答