没有Google Apps的Android设备上的SpeechRecognizer

时间:2016-06-16 10:47:40

标签: android speech-recognition

SpeechRecognizer适用于使用Google Apps(GApps)的Android。但是在中国,大多数Android设备都会删除这些Google Apps。使用SpeechRecognizer时会发生什么?如何在没有实际设备的情况下测试它?

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

1 个答案:

答案 0 :(得分:4)

我确定你知道以下大部分内容,但为了全面解答:

任何应用程序都可以注册为语音识别提供程序,只要它正确注册RecognitionService即可。对于三星设备,Android语音搜索设置将显示两个提供商,Google和Vlingo。

Google RecognitionService已打包在Google 'Now'应用程序中,如您所知,该应用程序依赖于Google Play服务。

Vlingo的RecognitionService位于他们的S-Voice应用程序中,该应用程序仅在三星设备上公开预装 - 因此不适用于您的问题,但我提及由于我的评论进一步下降。< / p>

在使用SpeechRecognizer之前,应始终使用静态辅助方法:

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

引用method documentation

  

检查语音识别服务是否可用   系统。如果此方法返回false,则createSpeechRecognizer(Context)   会失败。

     

如果识别可用,则返回true,否则返回

如果您在特定用例中使用此方法,则应返回false,因此您不必担心初始化崩溃。

作为一个注释,Vlingo将在这里返回true,但实际上永远不会返回语音响应,它会因某种原因抛出ERROR_NETWORK。这太烦人了。

除上述检查外,您还可以通过执行以下操作查询哪些应用程序(如果有)已注册为语音识别提供程序:

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服务,而不是让用户侧载加载gapps的头痛问题。并非所有人都是免费的。