Как Google Keep выполняет распознавание речи, одновременно сохраняя запись звука?

Android SpeechRecognizer, по-видимому, не позволяет записывать ввод, в котором вы выполняете распознавание речи в аудиофайл. То есть, вы записываете голос, используя MediaRecorder (или AudioRecord, если на то пошло), или вы выполняете распознавание речи с помощью SpeechRecognizer, и в этом случае звук не записывается в файл (по крайней мере, не тот, к которому вы можете получить доступ); Но вы не можете обойти оба одновременно.

Вопрос о том, как добиться записи звука и распознавания речи одновременно в Android, задавали несколько раз, а самым популярным «решением» является запись файла flac и использование неофициального API-интерфейса Google, который позволяет вам отправлять флак Файл через запрос POST и получить ответ json с транскрипцией. Http://mikepultz.com/2011/03/accessing-google-speech-api-chrome-11/ (устаревшая версия Android) https://github.com/katchsvartanian/voiceRecognition/tree/master/VoiceRecognition http: // mikepultz.com/2013/07/google-speech-api-full-duplex-php-version/

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

Кроме того, нарезка аудиофайла на более мелкие файлы НЕ является возможным решением; Даже забывая о трудностях в правильном разбиении файла в правильных положениях (не в середине слова), многие последовательные запросы к вышеупомянутому веб-сервису api случайным образом приводят к пустым ответам (в Google говорится, что ограничение использования составляет 50 запросов на каждый День, но, как обычно, они не раскрывают детали реальных пределов использования, которые явно ограничивают всплески запросов).

Таким образом, все это, казалось бы, указывает на то, что получение транскрипции речи при одновременной записи ввода в звуковой файл в Android НЕВОЗМОЖНО.

ОДНАКО, приложение Google Keep Android делает именно это. Это позволяет говорить, транскрибировать то, что вы сказали в тексте, и сохраняет как текст, так и аудиозапись (ну неясно, где она хранится, но вы можете воспроизвести его). И он не имеет ограничений по длине.

Итак, вопрос в том, что у кого-то есть ИДЕЯ КАК GOOGLE KEEP? Я бы посмотрел на исходный код, но он, похоже, не доступен, не так ли?

Я понюхал пакеты, которые Google Keep посылает и получает при распознавании речи, и определенно НЕ использует упомянутую выше речь api. Весь трафик TLS и (со стороны) выглядит примерно так же, как при использовании SpeechRecognizer.

Так что, возможно, существует способ «разбить» (т. Е. Дублировать или мультиплексировать) входной поток микрофона на два потока и передать один из них в SpeechRecognizer, а другой – в MediaRecorder?

Google Keep запускает RecognizerIntent с некоторыми недокументированными дополнениями и ожидает, что в результате намерение будет содержать URI записанного аудио. Если RecognizerIntent обслуживается Google Voice Search, тогда все работает, и Keep получает аудио.

См. Запись / сохранение звука из намерения распознавания речи для получения дополнительной информации и образец кода, который вызывает распознаватель так же, как и Keep (возможно).

Обратите внимание, что это поведение не является частью Android. Это просто текущий недокументированный способ взаимодействия двух приложений Google с закрытым исходным кодом.

Он использует onPartialResults (Bundle). Это событие возвращает текст, распознанный из записанной речи, пока он все еще записывается. Он также доступен на Xamarin