首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebkitSpeechRecognition随机停止录制

WebkitSpeechRecognition随机停止录制
EN

Stack Overflow用户
提问于 2016-01-16 03:14:17
回答 1查看 2.4K关注 0票数 9

我正在尝试做一个连续的从语音到文本的转录,但是似乎不能让webkitSpeechRecognition像广告中那样工作。即使我设置了continuous = true和interimResults = true,它似乎也会随机停止录制(通常是在长时间的静默之后)。我甚至不知道是什么导致了这种随机的停机,因为我在EVERY.SINGLE.EVENT中放了一个简单的日志语句,这个webkitSpeechRecognition基于我能找到的文档。这是我所拥有的脚本(本质上是演示https://www.google.com/intl/en/chrome/demos/speech.html上的一个小mod )

我所知道的:

在记录之前不会记录任何错误。

我使用的是千兆连接,所以与lag无关。

它通常会在长时间暂停后停止,但有时会无缘无故地停止。

它可以在2分钟或仅30秒后发生。

我注释掉了下面的一些,但我已经尝试了所有这些方法,但都没有成功地跟踪这个问题。

代码语言:javascript
复制
    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
    });
EN

回答 1

Stack Overflow用户

发布于 2016-11-18 20:11:59

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

创建一个每隔10秒停止识别的计时器。

代码语言:javascript
复制
    setInterval(resetVoiceRecog, 10000);
    function resetVoiceRecog() {
       recognition.stop();
    }

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

代码语言:javascript
复制
recognition.onend = function(event) {
      recognition.start();
   }

即使我一句话也不说,这种方法对我来说也是有效的。也许能帮上忙。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34818154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档