Проблемы с API веб-речи в Android Chrome - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь использовать SpeechRecognition интерфейс Web Speech API . Он отлично работает в настольной версии Chrome, но я не могу обнаружить аудио в версии Android. После неудачной попытки заставить мой собственный код работать, я протестировал это демо , а также это другое демо на двух разных Android устройствах (одно работает под управлением LineageOS Nougat, одно работает под управлением LineageOS P ie, оба с Chrome 79) и ни одна демка не работала ни на одном устройстве.

Я не уверен, что здесь не так ... может кто-нибудь еще заставить эти демки работать на Android? Я передаю свою тестовую страницу по протоколу https и могу нормально записывать звук с микрофона на эти устройства, используя navigator.mediaDevices.getUserMedia , так что это не похоже на проблемы с оборудованием, разрешениями или безопасностью.

Специфические c симптомы, которые я вижу, следующие:

  • Событие start возникает после первоначального запуска распознавания, как и ожидалось но последующие audiostart, soundstart, speechstart и result события, которые должны следуйте за ним никогда.

  • Попытка вызова SpeechRecognition.stop, кажется, не имеет никакого эффекта - событие end не вызывается. Вызов SpeechRecognition.start после попытки остановки выдает Uncaught DOMException: Не удалось выполнить 'start' для 'SpeechRecognition': распознавание уже началось.

  • Вызов SpeechRecognition.abort вызывает событие end и позволяет перезапустить распознавание.

Вот некоторый тестовый код, основанный на примере от MDN .

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title> Speech-2-Text Test </title>
    <style>
      html, body {
        height: 100%;
        width: 100%;
        padding: 0;
        margin: 0;
      }
    </style>
  </head>
  <body>
    <script>
      let SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
      let SpeechGrammarList = window.SpeechGrammarList || window.webkitSpeechGrammarList;
      let SpeechRecognitionEvent = window.SpeechRecognitionEvent || window.webkitSpeechRecognitionEvent;

      let grammar = '#JSGF V1.0; grammar colors; public <color> = aqua | azure | beige | bisque | black | blue | brown | chocolate | coral | crimson | cyan | fuchsia | ghostwhite | gold | goldenrod | gray | green | indigo | ivory | khaki | lavender | lime | linen | magenta | maroon | moccasin | navy | olive | orange | orchid | peru | pink | plum | purple | red | salmon | sienna | silver | snow | tan | teal | thistle | tomato | turquoise | violet | white | yellow ;';

      let recognition = new SpeechRecognition();
      let speechRecognitionList = new SpeechGrammarList();
      speechRecognitionList.addFromString(grammar, 1);

      recognition.grammars = speechRecognitionList;
      recognition.continuous = false;
      recognition.lang = 'en-US';
      recognition.interimResults = false;
      recognition.maxAlternatives = 1;

      let listening = false;

      document.body.addEventListener('click', event => {
        if (listening == false) {
          recognition.start();
          listening = true;
        } else {
          recognition.stop();
          // recognition.abort();
          listening = false;
        }
      });

      console.dir(recognition);

      recognition.onstart = event => {
        console.log('recognition started');
      };

      recognition.onaudiostart = event => {
        console.log('audiostart');
      };

      recognition.onsoundstart = event => {
        console.log('soundstart');
      };

      recognition.onspeechstart = event => {
        console.log('speechstart');
      };

      recognition.onspeechend = event => {
        console.log('speechend');
        recognition.stop();  
      };

      recognition.onsoundend = event => {
        console.log('soundend');
      };

      recognition.onaudioend = event => {
        console.log('audioend');
      };

      recognition.onend = event => {
        console.log('recognition stopped');
      };

      recognition.onresult = event => {
        let color = event.results[0][0].transcript;
        console.log('Result received: ' + color);
        console.log('Confidence: ' + event.results[0][0].confidence);
        document.body.style.backgroundColor = color;
      };

      recognition.onnomatch = event => {
        console.log('I didnt recognise that color.');
      };

      recognition.onerror = event => {
        console.log('Error: occurred in recognition: ' + event.error);
      };
    </script>
  </body>
</html>

Любые идеи относительно того, в чем может быть проблема, будут оценены.

...