WebkitSpeechRecognition随机停止录制 [英] WebkitSpeechRecognition stops recording randomly

查看:137
本文介绍了WebkitSpeechRecognition随机停止录制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对文本转录进行连续发言,但似乎无法让webkitSpeechRecognition像宣传的那样工作。它似乎随机停止录制(通常在长时间的静音之后),即使我设置了continuous = true和interimResults = true。我甚至无法弄清楚导致这种随机停止的原因,因为我在EVERY.SINGLE.EVENT中添加了一个简单的日志语句。 webkitSpeechRecognition基于我能找到的文档。这是我所拥有的脚本(基本上是演示 https ://www.google.com/intl/zh-CN/chrome/demos/speech.html

I'm trying to do a continuous speech to text transcription but can't seem to get webkitSpeechRecognition working as advertised. It seems to stop recording randomly (typically after a long duration of silence) even though I set continuous = true and interimResults = true. I can't even figure out what is causing this random stoppage as I put a simple log statement in EVERY.SINGLE.EVENT. that webkitSpeechRecognition has based on the docs I could find. Here is the script of what I have (essentially a slight mod on the demo https://www.google.com/intl/en/chrome/demos/speech.html)

我所知道的:

在录制之前没有记录错误。

No errors are logged prior to the recording.

我正处于千兆位连接,因此没有延迟相关。

I'm on a gigabit connection so not lag related.

长时间暂停后会正常停止,但有时会无故停止。

It stops normally after a long pause but sometimes stops without cause.

可能会在2分钟或30秒后发生。

It can happen after 2 minutes or only 30 seconds.

我已经注释了下面的一些内容,但我已经尝试了所有这些,但没有成功跟踪问题。

I commented out some of the below but I've tried all of them without any success as to tracing the issue.

    var final_transcript = '';
    var recognizing = false;
    var ignore_onend;
    var start_timestamp;
    if (!('webkitSpeechRecognition' in window)) {
        upgrade();
    } else {
        var recognition = new webkitSpeechRecognition();
        recognition.continuous = true;
        recognition.interimResults = true;

        recognition.onstart = function () {
            recognizing = true;
        };

        recognition.onerror = function (event) {
            console.log("ERROR")
            recognizing = false
            recognition.stop()
            recognizing = true
            recognition.start()
            if (event.error == 'no-speech') {
                console.log("NO SPEECH")
            }
            if (event.error == 'audio-capture') {
                console.log("Capture Problem")
            }
            if (event.error == 'not-allowed') {
                if (event.timeStamp - start_timestamp < 100) {
                    console.log("Block")
                } else {
                    console.log("Deny")
                }
            }
        };

        recognition.onend = function () {
            console.log("ONEND")
            recognition.stop()
            recognizing = false
            recognition.start()
        };

        recognition.onresult = function (event) {
            var interim_transcript = '';
            if (typeof(event.results) == 'undefined') {
                  console.log("undefined start")
                  recognition.stop()
                  recognizing = false
                  recognition.start()
                  console.log("undefined end")
                  return;
                }
            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);
            final_span.innerHTML = linebreak(final_transcript);
            interim_span.innerHTML = linebreak(interim_transcript);
        };

{#            recognition.onspeechend = function () {#}
{#                console.log("SpeechEND")#}
{#            };#}
{##}
{#            recognition.onpause = function() {#}
{#                console.log("PAUSE")#}
{#            }#}
{##}
{#            recognition.onsoundend = function() {#}
{#                console.log("Sound")#}
{#            }#}
{##}
{##}
{#            recognition.onaudioend = function() {#}
{#                console.log("AUDIO")#}
{#            }#}
{##}
{##}
{#            recognition.onnomatch = function() {#}
{#                console.log("NOMATCH")#}
{#            }#}
{##}
{#            recognition.onmark = function() {#}
{#                console.log("MARK")#}
{#            }#}
{##}
{#            recognition.onboundary = function(){#}
{#                console.log("BOUNDARY")#}
{#            }#}

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

    $("#start_call").click(function () {
        $("#start_call").addClass('hidden');
        $("#end_call").removeClass('hidden');
        final_transcript = '';
        recognition.lang = 'en-US';
        recognition.start();
        ignore_onend = false;
    });
    $("#end_call").click(function () {
        $("#end_call").addClass('hidden');
        $("#start_call").removeClass('hidden');
        stopwatchClock.addClass('hidden');
        recognition.stop();
        recognizing = false
    });


推荐答案

您可以检查文件player.html中的示例实现我的github页面 https://github.com/pantprateek/genieYT 。逻辑如下:

You can check sample implementation in file player.html in my github page https://github.com/pantprateek/genieYT. The logic is as follows :

创建一个计时器,每10秒后停止识别。

Create a timer which stops recognition after every 10secs .

    setInterval(resetVoiceRecog, 10000);
    function resetVoiceRecog() {
       recognition.stop();
    }

当调用recognition.stop时,它肯定会调用onend然后再次开始识别。

when recognition.stop is called it surely invokes onend and then start recognition again.

recognition.onend = function(event) {
      recognition.start();
   }

即使我不说一句话,这种方法对我有好几个小时的作用。
可能会有帮助。

This method works for me for hours even if I don't speak a word. Might help .

这篇关于WebkitSpeechRecognition随机停止录制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆