1

我正在尝试使用 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 分钟的任何时间,但不可避免地,似乎随机停止。我在这里看到了关于这个问题的评论:

WebkitSpeechRecognition 随机停止录制

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

任何帮助表示赞赏。谢谢!

4

2 回答 2

1

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

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

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

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

于 2018-04-23T18:58:41.343 回答
0

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

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

于 2020-06-25T16:04:06.277 回答