Автономное Распознавание Речи В Android (JellyBean)
похоже, что Google сделал автономное распознавание речи доступным из Google Now для сторонних приложений. Он используется приложение с именем Utter.
кто-нибудь видел какие-либо реализации того, как делать простые голосовые команды с этой автономной речью rec? Вы просто используете обычный SpeechRecognizer API, и он работает автоматически?
8 ответов:
Google спокойно включил автономное распознавание в этом обновлении поиска, но пока нет API или дополнительных параметров, доступных в SpeechRecognizer-класс. {см. редактирование в нижней части этого сообщения} функциональность доступна без дополнительного кодирования, однако устройство пользователя должно быть настроено правильно, чтобы оно начало работать, и именно в этом заключается проблема, и я бы предположил, почему многие разработчики предполагают, что они " отсутствуют нечто.’
кроме того, Google ограничил некоторые устройства Jelly Bean от использования автономного распознавания из-за аппаратных ограничений. К каким устройствам это относится, не задокументировано, на самом деле ничего не задокументировано, поэтому настройка возможностей для пользователя оказалась вопросом проб и ошибок (для них). Это работает для некоторых сразу – для тех, кто этого не делает, это "руководство", которое я им предоставляю.
- убедитесь, что голос Android по умолчанию Поезд находится в Google не Samsung / Vlingo
- удалите все автономные файлы распознавания, которые вы уже установили из настроек голосового поиска Google
- перейдите в Настройки Приложения для Android и посмотрите, можете ли вы удалить обновления для поиска Google и голосового поиска Google приложения.
- если вы не можете сделать выше, перейдите в Play Store, чтобы узнать, есть ли у вас вариант есть.
- перезагрузка (Если вы достигли 2, 3 или 4)
- обновление Google Search и Google Voice Search из Play Store (если вы достигли 3 или 4 или если обновление доступно в любом случае).
- перезагрузка (Если вы достигли 6)
- установить английский язык в Великобритании автономные языковые файлы
- перезагрузка
- использовать несусветная! подключение
- переключитесь в режим самолета и попробуйте
- как только он работает, автономное распознавание других языков, как английский язык Мы тоже должны начать работать.
EDIT: временное изменение локали устройства на английский UK также, похоже, запускает это для некоторых.
некоторые пользователи сообщили, что им все еще приходилось перезагружаться несколько раз, прежде чем он начнет работать, но все они в конечном итоге попадают туда, часто необъяснимо к тому, что было триггером, ключ к которому находится внутри поиск в Google APK, Так что не в общественном достоянии или части AOSP.
из того, что я могу установить, Google проверяет доступность соединения до принятия решения о том, следует ли использовать автономное или Онлайн-распознавание. Если соединение доступно изначально, но потеряно до ответа, Google предоставит ошибку подключения, она не вернется в автономный режим. В качестве побочного Примечания, если запрос на синтезированный голос сети был сделан, нет ошибки, предоставленной ему, если не удается – вы получаете тишину.
обновление поиска Google включить новые функции в Google теперь и в самом деле, если вы попытаетесь использовать его без подключения к интернету, это будет ошибка. Я упоминаю об этом, поскольку я задавался вопросом, будет ли способность отозвана так же тихо, как она появилась, и поэтому не следует полагаться на производство.
Если вы собираетесь начать использовать класс SpeechRecognizer, будьте осторожны, есть довольно главная ошибка связанные с ним, которые требуют своей реализации в обращении.
не будучи в состоянии конкретно запросить offline = true, делает управление этой функцией невозможным без манипулирования подключением к данным. Мусор. Вы получите сотни пользовательских писем с вопросом, почему вы не включили что-то настолько простое!EDIT: С уровня API 23 был добавлен новый параметр EXTRA_PREFER_OFFLINE которого служба распознавания Google, похоже, придерживается.
надеюсь, что выше не помогает.
Я хотел бы улучшить руководство, что ответ https://stackoverflow.com/a/17674655/2987828 отправляет своим пользователям, с изображениями. Это предложение "для тех, кто этого не делает, это "руководство", которое я им предоставляю."что я хочу улучшить.
пользователь должен нажать на четыре кнопки, выделенные синим цветом на этих изображениях:
затем пользователь может выбрать любой нужный язык. Когда загрузка будет сделав это, он должен отключиться от сети, а затем нажать на кнопку "микрофон" клавиатуры.
Он работал для меня (android 4.1.2), затем распознавание языка работало из коробки, без перезагрузки. Теперь я могу диктовать инструкции оболочке эмулятора терминала ! И это в два раза быстрее в автономном режиме, чем в интернете, на padfone 2 от ASUS.
эти изображения лицензированы под cc by-sa 3.0 с атрибуцией, необходимой для stackoverflow.com/a/21329845/2987828 ; вы можете поэтому добавьте эти изображения в любом месте вместе с этой атрибуцией.
(Это стандартная политика всех изображений и текстов на stackoverflow.com)
простое и гибкое автономное распознавание на Android реализовано CMUSphinx, инструментарием распознавания речи с открытым исходным кодом. Он работает чисто в автономном режиме, быстро и настраивается он может слушать непрерывно для ключевых слов, например.
вы можете найти последний код и обучение.
короче, у меня нет реализации, но объяснение.
Google не сделал автономное распознавание речи доступным для сторонних приложений. Автономное распознавание доступно только с помощью клавиатуры. Бен Рэнделл (разработчик несусветная!) объясняет его обходной путь в статье на Android полиции:
я реализовал свою собственную клавиатуру и переключался между Google Голосовой ввод и клавиатура по умолчанию для пользователей с невидимым редактированием текстовое поле и прозрачная деятельность, чтобы получить вход. Грязный хак!
это был единственный способ сделать это, так как автономный голосовой ввод мог быть только запускается IME или системным приложением (это был мой корень рубить) . Другой тип API распознавания ... не вызвал его и просто потерпел неудачу с ошибкой сервера. ... Много работы потрачено впустую для меня на обходной путь! Но по крайней мере я был готов к реализации...
с несусветная! называющий Первый не име приложение, чтобы использовать устройство в желе
Я успешно реализовал свою речевую службу с автономными возможностями, используя onPartialResults в автономном режиме и onResults в режиме онлайн.
Я имел дело с этим, и я заметил, что вам нужно установить автономный пакет для вашего языка. Моя языковая настройка была " Español (Estados Unidos)", но для этого языка нет автономного пакета, поэтому, когда я отключил все сетевые подключения, я получил предупреждение от RecognizerIntent, сказав, что не могу добраться до Google, затем я меняю язык на " английский (США)" (потому что у меня уже есть автономный пакет) и запустил RecognizerIntent, он просто работал из.
ключи: языковая настройка = = автономный пакет распознавания голоса
по-видимому, можно вручную установить автономное распознавание голоса, загрузив файлы напрямую и установив их в нужных местах вручную. Я думаю, это просто способ обойти требования к оборудованию компании Google. Однако лично мне не пришлось перезагружаться или что-то еще, просто перейдя в Великобританию и обратно, сделал это.
рабочий пример приведен ниже,
MyService.класс
public class MyService extends Service implements SpeechDelegate, Speech.stopDueToDelay { public static SpeechDelegate delegate; @Override public int onStartCommand(Intent intent, int flags, int startId) { //TODO do something useful try { if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { ((AudioManager) Objects.requireNonNull( getSystemService(Context.AUDIO_SERVICE))).setStreamMute(AudioManager.STREAM_SYSTEM, true); } } catch (Exception e) { e.printStackTrace(); } Speech.init(this); delegate = this; Speech.getInstance().setListener(this); if (Speech.getInstance().isListening()) { Speech.getInstance().stopListening(); } else { System.setProperty("rx.unsafe-disable", "True"); RxPermissions.getInstance(this).request(permission.RECORD_AUDIO).subscribe(granted -> { if (granted) { // Always true pre-M try { Speech.getInstance().stopTextToSpeech(); Speech.getInstance().startListening(null, this); } catch (SpeechRecognitionNotAvailable exc) { //showSpeechNotSupportedDialog(); } catch (GoogleVoiceTypingDisabledException exc) { //showEnableGoogleVoiceTyping(); } } else { Toast.makeText(this, R.string.permission_required, Toast.LENGTH_LONG).show(); } }); } return Service.START_STICKY; } @Override public IBinder onBind(Intent intent) { //TODO for communication return IBinder implementation return null; } @Override public void onStartOfSpeech() { } @Override public void onSpeechRmsChanged(float value) { } @Override public void onSpeechPartialResults(List<String> results) { for (String partial : results) { Log.d("Result", partial+""); } } @Override public void onSpeechResult(String result) { Log.d("Result", result+""); if (!TextUtils.isEmpty(result)) { Toast.makeText(this, result, Toast.LENGTH_SHORT).show(); } } @Override public void onSpecifiedCommandPronounced(String event) { try { if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { ((AudioManager) Objects.requireNonNull( getSystemService(Context.AUDIO_SERVICE))).setStreamMute(AudioManager.STREAM_SYSTEM, true); } } catch (Exception e) { e.printStackTrace(); } if (Speech.getInstance().isListening()) { Speech.getInstance().stopListening(); } else { RxPermissions.getInstance(this).request(permission.RECORD_AUDIO).subscribe(granted -> { if (granted) { // Always true pre-M try { Speech.getInstance().stopTextToSpeech(); Speech.getInstance().startListening(null, this); } catch (SpeechRecognitionNotAvailable exc) { //showSpeechNotSupportedDialog(); } catch (GoogleVoiceTypingDisabledException exc) { //showEnableGoogleVoiceTyping(); } } else { Toast.makeText(this, R.string.permission_required, Toast.LENGTH_LONG).show(); } }); } } @Override public void onTaskRemoved(Intent rootIntent) { //Restarting the service if it is removed. PendingIntent service = PendingIntent.getService(getApplicationContext(), new Random().nextInt(), new Intent(getApplicationContext(), MyService.class), PendingIntent.FLAG_ONE_SHOT); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); assert alarmManager != null; alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000, service); super.onTaskRemoved(rootIntent); } }для более подробной информации,
надеюсь, что это поможет кому-то в будущем.




Comments