Распознавание речи - работайте непрерывно

Я пытаюсь создать голосовой редактор на базе HTML5 с помощью API распознавания речи. В настоящее время проблема заключается в том, что когда вы начинаете запись, она длится только определенное время (в основном, пока пользователь не перестанет говорить).

Я могу установить continuous и interimResults на true, но это не будет вести запись вечно. Все равно заканчивается.

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

Есть ли способ, чтобы он работал непрерывно, а пользователю нужно было только один раз спросить?


person samanime    schedule 01.05.2015    source источник


Ответы (4)


Независимо от того, какие настройки вы выберете, Google Chrome через некоторое время остановит механизм распознавания речи... это невозможно обойти.

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

Если вы попробуете подобную технику, имейте в виду следующее:

  1. Если вы не используете HTTPS, пользователю будет предложено дать разрешение снова и снова при каждом перезапуске. По этой и многим другим причинам не ставьте под угрозу HTTP при использовании распознавания речи.

  2. Убедитесь, что вы не перезапускаете распознавание речи немедленно onend() без каких-либо мер безопасности, чтобы убедиться, что вы не запускаете браузер в бесконечный цикл (например, две открытые вкладки с onend(function() {restart()}) могут привести к сбою браузера, как я подробно описал в этой ошибке). отчет: https://code.google.com/p/chromium/issues/detail?id=296690) См. https://github.com/TalAter/annyang/blob/1ee294e2b6cb9953adb9dcccf4d3fcc7eca24c2c/src/annyang.js#L214, как я с этим справляюсь.

  3. Не запускайте автоматический перезапуск, если причиной его завершения является что-то вроде service-not-allowed или not-allowed. См. ">https://github.com/TalAter/annyang/blob/1ee294e2b6cb9953adb9dcccf4d3fcc7eca24c2c/src/annyang.js#L196

Вы можете увидеть, как я справился с этим в своем коде — https://github.com/TalAter/annyang/blob/master/src/annyang.js

person Tal Ater    schedule 02.05.2015
comment
@samanime Если вы считаете, что это самый точный ответ, отметьте его как правильный. - person Tal Ater; 03.06.2015
comment
Просто обновление. Ссылки на github, кажется, не работают. Вот текущая ссылка, которую я нашел. github.com/TalAter/annyang - person jkw4703; 10.08.2018
comment
Все ссылки были исправлены на те, которые не должны прерываться в будущих версиях annyang. - person Tal Ater; 15.08.2018
comment
Этот ответ великолепен! знайте, что следующий раздел очень полезен и выходит за рамки того, о чем спрашивал ОП. - person Brian Risk; 30.05.2020

Пожалуйста, попробуйте этот код, я думаю, он делает то, что вам нужно:

<!DOCTYPE html>
<html>
    <head>
        <title>Speech recognition</title>
        <style>
            #result{
                border: 2px solid black;
                height: 200px;
                border-radius: 3px;
                font-size: 14px;
            }
            button{
                position: absolute;
                top: 240px;
                left: 50%;
            }
        </style>
        <script type="application/javascript">
            function start(){
                var r = document.getElementById("result");
            if("webkitSpeechRecognition" in window){
                var speechRecognizer = new webkitSpeechRecognition();
                speechRecognizer.continuous = true;
                speechRecognizer.interimResults = true;
                speechRecognizer.lang = "en-US";
                speechRecognizer.start();
                
                var finalTranscripts = "";
                speechRecognizer.onresult = function(event){
                    var interimTranscripts = "";
                    for(var i=event.resultIndex; i<event.results.length; i++){
                        var transcript = event.results[i][0].transcript;
                        transcript.replace("\n", "<br>");
                        if(event.results[i].isFinal){
                            finalTranscripts += transcript;
                        }
                        else{
                            interimTranscripts += transcript;
                        }
                        r.innerHTML = finalTranscripts + '<span style="color: #999;">' + interimTranscripts + '</span>';
                    }
                };
                speechRecognizer.onerror = function(event){
                };
            }
            else{
                r.innerHTML = "Your browser does not support that.";
            }
            }
        </script>
    </head>
    <body>
        <div id="result"></div>
        <button onclick="start()">Listen</button>
    </body>
</html>

person Ahmed Hussein    schedule 02.07.2017
comment
Я искал это speechRecognizer.continuous = true; большое спасибо! - person SoEzPz; 06.01.2019

HTML 5 Speech Continuous требует этого...

window.SpeechRecognition = window.webkitSpeechRecognition || window.SpeechRecognition;

if ('SpeechRecognition' in window) {
  console.log('supported speech')
} else {
  console.error('speech not supported')
}
    const recognition = new window.SpeechRecognition();

    recognition.continuous = true;

    recognition.onresult = (event) => {
      console.log('transscript: ', event.results[event.results.length -1][0].transcript);
    }
    
    recognition.start();

person SoEzPz    schedule 06.01.2019

Вам придется запускать движок каждые несколько секунд. См. Мой код, https://github.com/servo-ai/servo-platform/blob/master/editor/src/assets/js./voice/asr.js

Примечание. После версии 70 Chrome пользовательский интерфейс щелчка необходим хотя бы один раз.

person Lior    schedule 12.02.2019