【问题标题】:WebkitSpeechRecognition stops, doesn't fire onend, at randomWebkitSpeechRecognition 停止,不触发,随机
【发布时间】:2024-01-10 20:45:01
【问题描述】:

我正在尝试使用 webkitSpeechRecognition 转录文本。我找到了这个例子:

https://developers.google.com/web/updates/2013/01/Voice-Driven-Web-Apps-Introduction-to-the-Web-Speech-API?hl=en

并已将其应用到我自己的网站中。这在某些条件下效果很好。但是,我基本上只是想在人们进行讨论时让转录保持“开启”状态。

出于我的目的,我已将代码简化如下:

//Speech Transcription
var recognition = new webkitSpeechRecognition();
recognition.continuous = true;
recognition.interimResults = true;

// initiated text recognition
recognition.onstart = function() {
    recognizing = true;
    ignore_onend = false;

}

//
recognition.onresult = function(event) {
    var interim_transcript = '';


    for (var i = event.resultIndex; i < event.results.length; ++i) {
        if (event.results[i].isFinal) {
            final_transcript += event.results[i][0].transcript;
        } else {
            interim_transcript += event.results[i][0].transcript;
        }
    }

    final_transcript = capitalize(final_transcript);

    // update final transcript
    enter.innerHTML = linebreak(final_transcript);

    // update temp transcript
    interim_enter.innerHTML = linebreak(interim_transcript);


}

recognition.onerror = function(event) { }

recognition.onend = function() {
    recognizing = false;
    if (ignore_onend) {
        return;
    }
}


// formatting the text
var two_line = /\n\n/g;
var one_line = /\n/g;
function linebreak(s) {
  return s.replace(two_line, '<p></p>').replace(one_line, '<br>');
}

var first_char = /\S/;
function capitalize(s) {
  return s.replace(first_char, function(m) { return m.toUpperCase(); });
}

// trigger the transcription
function startButton(event) {
    final_transcript = '';
    recognition.start();    
}

它在 2 秒到 5 分钟的任何时间都可以正常工作,但不可避免地会随机停止。我在这里看到了有关问题的 cmets:

WebkitSpeechRecognition stops recording randomly

这意味着Obj3ctiv3_C_88 找到了解决方案。但是我无法弄清楚如何实现所描述的内容。

感谢任何帮助。谢谢!

【问题讨论】:

    标签: javascript webkit speech-recognition speech-to-text webkitspeechrecognition


    【解决方案1】:

    我知道这有点晚了,但我也遇到了语音输入会随机停止工作的问题。希望您的问题得到解决,但这可能会在将来对其他人有所帮助。

    我正在使用它来填写语音输入表单。 Obj3ctiv3_C_88 提供的您链接的解决方案可以处理它 - 您基本上可以将他的代码剪切并粘贴到您现有的 js 中。 setInterval 每 10000 次调用一次 resetVoiceRecog 函数。该函数强制停止识别。然后在您的.onend 函数中,您可以调用.start。在我的应用程序中,我调用start,除非用户单击了暂停按钮:

    if ($("#pauseClicked").html() !=1) {
      recognition.start();
    }
    

    我最初是在等待 onend 事件,然后执行 .start,但即使它“说”它重新启动,它也会偶尔不接受语音输入。谁知道onend/start 的背面正在发生这种情况,但设置间隔计时器以强制停止/启动似乎已经解决了我的问题。

    【讨论】:

      【解决方案2】:

      我也注意到了上面提到的行为。语音识别引擎似乎有些扭结,可能是为了减少流量?

      但是,我的解决方案可能是处理这种麻烦的更优雅的方式;是在识别开始方法中将一个名为noReason 的变量设置为true,在errorresult 方法中我将其设置为false,因为这是有原因的(错误或结果)。然后在onEnd方法中,我只检查if(noReason),如果是,则调用recognition.start();

      【讨论】: