webkitSpeechRecognition "отстает" при сборе результатов
Пришлось испытать желание испытать API Web Speech. Я скопировал код именно из статьи, и у меня возникла проблема, когда вы говорите, но ничего не происходит, пока вы говорите СНОВА.
[Fiddle: 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",
Переменная "final_transcript" содержит ПРЕДЫДУЩИЙ результат, а не то, что я только что сказал. Это только на 1.
Чтобы дать вам лучшую идею...
Я: "Привет, мир"
final_transcript = '';
[Подождите...]
Я: "Тест"
final_transcript = 'Привет, мир'
И это только продолжается. Код не может расшифровать то, что я говорю, как я это говорю. Очень странно.
Есть мысли, почему это может быть?
1 ответ
Существует некоторый встроенный тайм-аут, по истечении которого вы получите результат, даже если ввода больше нет (кажется, около 5-10 секунд).
В этом случае вы получите финал onresult
событие, а также onend
событие. Вам придется позвонить recognition.start()
еще раз, если вы хотите продолжать принимать ввод.
Кроме того, если вы установите
recognition.interimResults = true;
ты получишь onresult
события с не конечными результатами, и вы можете решить, хотите ли вы отображать их, прежде чем получить окончательные.
Другой вариант - отключить непрерывно с
recognition.continuous = false;
вы получите результат вскоре после того, как вход (аудио) остановится. Вы также получите onend
событие.
Если вы хотите продолжить распознавание, вам придется позвонить снова
recognition.start();
в onend
обработчик события.
На не HTTPS-странице это снова вызовет всплывающую панель разрешений.
смотри пример