在一些应用中,能够进行语音识别是非常重要的功能。Android系统原生实现了语音识别,利用谷歌提供的服务,可以将用户的语音装换为文本。
在Android中访问语音识别服务已经被包装为简单的Intent,通过发送定制的Intent,就可以调用语音识别服务。
检查是否包含语音识别服务
因为Android系统是开源的,原生的语音识别服务有可能被手机厂商精简掉。所以在使用前应该检查服务是是否可用。利用Android的API就可以完成检查任务。如下面的代码:
1 2 3 4 5 6 7
| PackageManager pm = getPackageManager(); List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); if (activities.size() != 0) { Log.d(TAG, "Recognizer is ok."); } else { btnStart.setEnabled(false); }
|
代码中,我们主要是通过 queryIntentActivities 函数进行检查,如果返回数组的长度大于零,则标识语音识别功能可用。
启动语音识别服务
通过构造一个特定的 Intent, 就可以调用语音识别服务,代码如下:
1 2 3 4
| Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "语音识别测试"); startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
|
注意,在代码中我们使用了 startActivityForResult 方法,所以我们需要在本Activity的返回结果代码中去获取识别的文本。
获取语音识别结果
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| @Override protected void onActivityResult(int reqCode, int resultCode, Intent data) {
if (reqCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
List<String> stmts = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
Log.d(TAG, "stmts.size = " + stmts.size()); for (String s: stmts) { Log.d(TAG, "s = " + s); } } super.onActivityResult(reqCode, resultCode, data); }
|