webkitSpeechRecognition отстает при сборе результатов

Не терпелось попробовать 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;
    };

}

Например, если я скажу «Привет, мир», ‹div›, который я настроил для отображения результатов, не будет отображать «Привет, мир», пока я не скажу что-нибудь еще или не издам звук. Но если бы я сказал что-то еще, ЭТО не отображалось бы, пока я СНОВА не сказал бы что-то еще.

Переменная "final_transcript" содержит ПРЕДЫДУЩИЙ результат, а не то, что я только что сказал. Отклонение всего на 1.

Чтобы дать вам лучшее представление...

Я: "Привет мир"

финал_транскрипт = '';

[Ждать...]

Я: "Тест"

final_transcript = 'Привет, мир'

И это просто продолжается. Код не может расшифровать то, что я говорю, КАК я это говорю. Очень странно.

Есть мысли, почему это может быть?


person RickyAYoder    schedule 10.08.2014    source источник


Ответы (1)


Есть какой-то встроенный тайм-аут, после которого вы получите результат, даже если больше не будет ввода (кажется, около 5-10 секунд).

В этом случае вы получите финальное событие onresult, а также событие onend. Вам придется позвонить recognition.start() еще раз, если вы хотите продолжать принимать входные данные.

Кроме того, если вы установите

recognition.interimResults = true;

вы получите onresult событий с не окончательными результатами, и вы можете решить, хотите ли вы отображать их, прежде чем получите окончательные.

Другой вариант — отключить непрерывную работу с помощью

recognition.continuous = false;

вы получите результат вскоре после прекращения ввода (аудио). Вы также получите событие onend.
Если вы хотите продолжить распознавание, вам придется позвонить снова.

recognition.start();

в обработчике событий onend.
На странице, отличной от HTTPS, панель разрешений снова появится.

см. пример

person Ron Harlev    schedule 20.08.2014
comment
У меня тот же опыт, что и у Рона Харлева: результаты без задержек лучше всего достигаются, если установить распознавание.continuous = false и перезапустить распознавание при возникновении события onend. - person michaelpoltorak; 26.08.2014