Я пытаюсь использовать SpeechRecognition интерфейс Web Speech API . Он отлично работает в настольной версии Chrome, но я не могу обнаружить аудио в версии Android. После неудачной попытки заставить мой собственный код работать, я протестировал это демо , а также это другое демо на двух разных Android устройствах (одно работает под управлением LineageOS Nougat, одно работает под управлением LineageOS P ie, оба с Chrome 79) и ни одна демка не работала ни на одном устройстве.
Я не уверен, что здесь не так ... может кто-нибудь еще заставить эти демки работать на Android? Я передаю свою тестовую страницу по протоколу https и могу нормально записывать звук с микрофона на эти устройства, используя navigator.mediaDevices.getUserMedia , так что это не похоже на проблемы с оборудованием, разрешениями или безопасностью.
Специфические c симптомы, которые я вижу, следующие:
Вот некоторый тестовый код, основанный на примере от 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>
Любые идеи относительно того, в чем может быть проблема, будут оценены.