Подтвердить что ты не робот

Почему RecognitionListener перестает работать в JellyBean?

Для всех пользователей, использующих Android API распознавания голоса, было удобно RecognitionListener вы могли бы регистр, который будет подталкивать различные события к вашим обратным вызовам. В частности, был метод onBufferReceived(byte[]):

public abstract void onBufferReceived (byte[] buffer)

С: API Level 8 получено больше звука. Цель этого функция позволяет давать обратную связь пользователю в отношении захваченный звук. Нет гарантии, что этот метод будет вызван.

Параметры buffer буфер, содержащий последовательность 16-разрядных целые числа, представляющие одноканальный аудиопоток. Частота выборки зависит от реализации.

Хотя метод явно заявляет, что нет гарантии, что он будет вызван, в ICS и до этого он будет эффективно вызван в 100% случаев: достаточно регулярно, по крайней мере, чтобы, объединив все байты, полученные таким образом, вы может восстановить весь аудиопоток и воспроизвести его.

По какой-то причине, однако, в SDK Jellybean это магически перестало работать. Там нет уведомления об устаревании, и код все еще компилируется, но onBufferReceived теперь называется никогда. Технически это не нарушает их API (так как там сказано "нет гарантии", метод будет вызван), но, очевидно, это изменчивое изменение для многих вещей, которые зависели от этого поведения.

Кто-нибудь знает, почему эта функция была отключена, и если есть способ воспроизвести ее поведение на Jellybean?

Разъяснение. Я понимаю, что вся вещь RecognizerIntent - это интерфейс с несколькими реализациями (включая некоторые из доступных в Play Маркете), и каждый из них может выбрать, что делать с RecognitionListener, Я специально ссылаюсь на стандартную реализацию Google, которую используют большинство телефонов Jellybean.

4b9b3361

Ответ 1

Google не вызывает этот метод своим речевым приложением Jelly Bean (QuickSearchBox). Его просто не в коде. Если у официального инженера Google нет официальных комментариев, я не могу дать однозначный ответ "почему" они это сделали. Я действительно искал форумы разработчиков, но не видел комментариев об этом решении.

Значение по умолчанию для распознавания речи происходит из Google VoiceSearch.apk. Вы можете декомпилировать этот apk и посмотреть и найти, что есть активность для обработки намерения действий * android.speech.action.RECOGNIZE_SPEECH *. В этом apk я искал "onBufferReceived" и нашел ссылку на него в com.google.android.voicesearch.GoogleRecognitionService $RecognitionCallback.

С желе Bean Google переименовал VoiceSearch.apk в QuickSearch.apk и сделал много новых дополнений к приложению (например, оффлайн диктовка). Вы ожидали бы найти вызов onBufferReceived, но по какой-то причине он полностью ушел.

Ответ 2

Я тоже использовал метод onBufferReceived и был разочарован тем, что (не гарантированный) вызов метода был удален в желе Bean. Ну, если мы не можем захватить аудио с помощью onBufferReceived(), возможно, есть возможность одновременного запуска AudioRecord с распознаванием голоса. Кто-нибудь это пробовал? Если нет, я дам ему вихрь и отчитаюсь.

Ответ 3

Я столкнулся с той же проблемой. Причина, по которой я не просто согласился с тем, что "это не работает", объясняется тем, что Google ноу-хау "записка к себе" записывает аудио и отправляет ее вам. То, что я обнаружил в logcat при запуске операции "note-to-self", было:

02-20 14:04:59.664: I/AudioService(525):  AudioFocus  requestAudioFocus() from [email protected][email protected]

02-20 14:04:59.754: I/AbstractCardController.SelfNoteController(8675): #attach
02-20 14:05:01.006: I/AudioService(525):  AudioFocus  abandonAudioFocus() from [email protected]h.audio.ByteArray[email protected]

02-20 14:05:05.791: I/ActivityManager(525): START u0 {act=com.google.android.gm.action.AUTO_SEND typ=text/plain cmp=com.google.android.gm/.AutoSendActivity (has extras)} from pid 8675
02-20 14:05:05.821: I/AbstractCardView.SelfNoteCard(8675): #onViewDetachedFromWindow

Это заставляет меня верить в то, что google теперь предоставляет audioFocus из google now (regonizerIntent), и что они используют звукозаписывающее устройство или что-то подобное, когда в onPartialResults появляется заметка "Самостоятельный тег". Я не могу подтвердить это, попытался ли кто-нибудь сделать эту работу?

Ответ 4

У меня есть служба, которая реализует RecognitionListener, и я также переопределяю метод onBufferReceived (byte []). Я исследовал, почему распознавание речи намного медленнее, чтобы вызвать onResults() on <= ICS. Единственное различие, которое я мог найти, это то, что onBufferReceived вызывается на телефонах <= ICS. На JellyBean onBufferReceived() никогда не вызывается, а onResults() вызывается значительно быстрее, и я думаю об этом из-за накладных расходов, которые вызывают onBufferReceived каждую секунду или миллисекунду. Возможно, поэтому они покончили с onBufferReceived()?