5

很想尝试Web Speech API。我完全从文章中复制了代码,我遇到了你说话的问题,但是在你再次说话之前什么都没有发生。

[小提琴:http: //jsfiddle.net/w75v2tm5/ ]

JS:

if (!('webkitSpeechRecognition' in window)) {
    //handle error stuff here...
} else {
    var recognition = new webkitSpeechRecognition();
    recognition.continuous = true;
    recognition.interimResults = false;

    recognition.start();

    var final_transcript = '';

    recognition.onresult = function (event) {
        var interim_transcript = '';
        if (typeof (event.results) == 'undefined') {
            recognition.onend = null;
            recognition.stop();
            upgrade();
            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;
            }
        }
        document.getElementsByTagName('div')[0].innerText = final_transcript;
    };

}

例如,如果我说“Hello world”,我设置的显示结果的 <div> 不会显示“Hello world”,直到我说其他话或发出声音。但是,如果我说其他话,直到我再次说其他话时才会显示。

变量“final_transcript”保存的是 PREVIOUS 结果,而不是我刚才所说的。只差1点。

为了给你一个更好的主意...

我:“你好世界”

final_transcript = '';

[等待...]

我:“测试”

final_transcript = '你好世界'

这只是继续。代码无法按照我所说的那样转录我所说的内容。很奇怪。

关于为什么会这样的任何想法?

4

1 回答 1

6

有某种内置超时,之后即使没有更多输入,您也会得到结果(似乎大约 5-10 秒)。

在这种情况下,您将获得最终onresult事件以及onend事件。recognition.start()如果您希望继续接受输入,则必须再次致电。

另外,如果你设置

recognition.interimResults = true;

您将获得onresult非最终结果的事件,并且您可以在获得最终结果之前决定是否要显示它们。

另一种选择是关闭连续

recognition.continuous = false;

您将在输入(音频)停止后不久得到结果。您还将获得该onend事件。
如果您想继续识别,您将不得不再次致电

recognition.start();

onend事件处理程序中。
在非 HTTPS 页面上,这将导致权限栏再次弹出。

例子

于 2014-08-20T21:14:41.990 回答