在一些应用中,能够进行语音识别是非常重要的功能。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);
}