2016-06-16 4 views
8

SpeechRecognizer хорошо работает на Android с помощью Google Apps (GApps). Однако в Китае большинство устройств Android удаляют эти Google Apps. Что произойдет, если используется SpeechRecognizer? Как я могу проверить его без реального устройства?SpeechRecognizer на Android-устройстве без Google Apps

speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext()); 
speechRecognizer.setRecognitionListener(new CustomListener()); 
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh_HK"); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName()); 
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1); 
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, false); 
intent.putExtra("android.speech.extra.EXTRA_ADDITIONAL_LANGUAGES", new String[]{"zh_HK", "en-US"}); 
speechRecognizer.startListening(intent); 

где CustomListener() реализует RecognitionListener.

+2

Возможность проверить через PackageManager, если «Gapps» установлен, например, проверит 'com.android.vending'. Если нет, то альтернативным способом распознавания речи может быть sphinx: http://cmusphinx.sourceforge.net/ – Opiatefuchs

+0

Хорошая идея. Однако языковой файл Sphinx занимает много места. Будет ли приведенный выше код сбой, если проверка не будет добавлена? – Raptor

+0

хорошо, это очень хороший вопрос, и если бы я мог, я бы дал больше стимулов этому. Но на самом деле ..... я не знаю. Если я начну с нормального случая, намерение обработать какое-либо действие приведет к сбою, если для этого нет пакета. Я думаю, что это то же самое с отсутствующими gapps, почему его следует рассматривать по-другому. Избегайте этого можно с помощью намерения.resolveActivity (pckManager)! = Null', я думаю. – Opiatefuchs

ответ

4

Я уверен, что вы знаете о большинстве следующих, но ради всеобъемлющего ответа:

Любое приложение может зарегистрировать в качестве поставщика услуг распознавания речи, так долго, как он регистрирует RecognitionService правильно. В случае с устройствами Samsung в Android Voice Search Settings будут показаны два поставщика, Google и Vlingo.

Google RecognitionService упакован в свое приложение Google 'Now', которое, как вам известно, зависит от сервисов Google Play.

Приложение Vlingo's RecognitionService находится в их приложении S-Voice, которое доступно только для публичных предустановок на устройствах Samsung - поэтому на самом деле оно не применимо к вашему вопросу, но я упоминаю в связи с моим комментарием ниже.

Перед тем, как использовать SpeechRecognizer, вы всегда должны использовать статический вспомогательный метод:

if (SpeechRecognizer.isRecognitionAvailable(getApplicationContext())) { 
    // initialise 
    } else { 
    // nope 
    } 

Как цитируемый method documentation:

Проверяет, является ли услуга распознавания речи доступны в системе , Если этот метод возвращает false, createSpeechRecognizer (Контекст) не удастся.

Возвращает истину, если распознавание доступно, иначе ложь

Если вы используете этот метод в вашем конкретном случае использования, она должна возвращать ложь, так что вам не придется беспокоиться о инициализации аварий.

В качестве примечания, Vlingo вернется сюда, но никогда не вернет речевые ответы, по какой-то причине он просто выбросит ERROR_NETWORK. Это раздражает.

Помимо выше проверки, вы можете также запросить, который, если таковые имеются, приложения регистрируются в качестве поставщика услуг Voice Recognition, выполнив следующие действия:

final List<ResolveInfo> services = context.getPackageManager().queryIntentServices(
        new Intent(RecognitionService.SERVICE_INTERFACE), 0); 

Любой пустой список, будет означать не провайдеры не доступны.

Наконец, как уже упоминалось в комментариях, вы могли бы всегда скрипичный чек и убедитесь, что установлено приложение Google:

Предполагая, что вы ориентируетесь Jelly Bean + Я использую следующий метод удобства:

/** 
* Check if the user has a package installed 
* 
* @param ctx   the application context 
* @param packageName the application package name 
* @return true if the package is installed 
*/ 
public static boolean isPackageInstalled(@NonNull final Context ctx, @NonNull final String packageName) { 
    try { 
     ctx.getApplicationContext().getPackageManager().getApplicationInfo(packageName, 0); 
     return true; 
    } catch (final PackageManager.NameNotFoundException e) { 
     return false; 
    } 
} 

Где имя пакета Google: com.google.android.googlequicksearchbox

В конце концов, вместо того, провайдера RESTful, которые вы могли бы использовать. Не все свободны.

Смежные вопросы