Захват аудио, отправленный на сервер распознавания речи Google - PullRequest
4 голосов
/ 08 мая 2011

для распознавания речи сервером Google, я использую класс SpeechRecognizer в сочетании с RecognitionListener, как предложено в Стефан * ответ на этот вопрос .Кроме того, я пытаюсь захватить распознаваемый аудиосигнал с помощью обратного вызова onBufferReceived () из RecognitionListener, например:

byte[] sig = new byte[500000] ;
int sigPos = 0 ;
...
public void onBufferReceived(byte[] buffer) {
  System.arraycopy(buffer, 0, sig, sigPos, buffer.length) ;
  sigPos += buffer.length ;
}
...

Это работает нормально, за исключением случаев, когда SpeechRecognizer не удается подключиться к серверу Google, когда кусокаудио не копируется в вышеупомянутый массив sig, и генерируется исключение тайм-аута соединения HTTP.SpeechRecognizer в конечном итоге подключается к серверу Google, и результаты распознавания показывают, что был получен полный аудиосигнал;только в массиве sig отсутствуют аудиоблоки.

Кто-нибудь испытывает такую ​​же проблему?Любой намек на решение?Спасибо!

Ответы [ 3 ]

1 голос
/ 03 февраля 2016

В современных версиях onBufferReceeded не работает, вместо этого вы можете установить запись / сохранение звука из функции распознавания голоса .

1 голос
/ 10 мая 2011

Я склонен говорить, что это может быть несоответствием в поведении службы распознавания, возможно, даже ошибкой в ​​используемой вами версии Android. Однако в документации говорится, что не гарантируется, что этот метод вызывается, поэтому он будет соответствовать спецификации. До сих пор я заметил следующее (на Android 2.3.4): я получаю байты во время записи, но если, например, есть SocketTimeout, он пытается отправить данные на сервер через некоторое время, но без вызова onBufferReceived снова для тех же данных. Код, который использовался для тестирования, был таким же, как и тот, который вы указали при публикации.

Как вы думаете, почему некоторые фрагменты отсутствуют в аудио, которое вы получили в методе? Если бы отсутствовали только несколько фрагментов, это могло бы быть даже так, что распознавание работало, хотя эти фрагменты отсутствовали.

0 голосов
/ 29 мая 2018

Лучший способ добиться этого - наоборот. Захватите ваши аудиоданные, используя AudioRecord (я бы рекомендовал использовать VOICE_COMMUNICATION вместо MIC в качестве входа, чтобы получить действительно чистый звук), а затем передать его на SpeechRecognizer. :)

...