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
。
答案 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
}
检查语音识别服务是否可用 系统。如果此方法返回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的头痛问题。并非所有人都是免费的。