Android 不能识别语音,因此一款 Android 设备通常也不能识别语音。 通过什么方式帮助它识别呢?
最简便的方法就是让另一种应用为我们识别语音。 让另一种应用处理 Android 中的任务被称为 使用意图
我们的目标设备必须至少有一个可以为语音识别处理意图的应用,并且可以被 RecognizerIntent.ACTION_RECOGNIZE_SPEECH 调用。
其中的一款应用就是 Google 语音搜索。
该应用是当前 Android 可用的最好识别器之一,可以支持多种语言。 由于语音识别是通过 Google 服务器处理的,因此该服务要求必须有互联网连接。 该应用具备一个非常简单的活动,通过它告知用户是否可以讲话。
当用户停止讲话时,会话就会关闭,然后我们的应用(意图调用程序)将收到一列带有已识别语音的字符串。

语音识别示例
我们现在通过一个小的示例程序展示如何在应用中使用语音搜索。
我们的应用需要完成以下任务:
- 收到语音识别请求
- 检查语音识别应用的可用性
- 如果语音识别可用,然后调用意图并接收结果
- 如果语音识别不可用,然后会显示一个安装 Google 语音搜索的会话,并将用户重定向至 Google Play。
首先,我们需要创建一个类,为语音识别实现逻辑。 调用类 SpeechRecognitionHelper,此时我们需要声明一个静态的公共函数 run(),该函数将收到一个启动识别的请求:
04 | public class SpeechRecognitionHelper
{ |
13 | public static void run(Activity
callingActivity) { |
15 | if (isSpeechRecognitionActivityPresented(callingActivity)
== true )
{ |
17 | startRecognition(callingActivity); |
20 | Toast.makeText(callingActivity, "In
order to activate speech recognition you must install "Google Voice Search"" ,
Toast.LENGTH_LONG).show(); |
22 | installGoogleVoiceSearch(callingActivity); |
如您所见,除 run() 函数之外,我们还需要执行三个函数:
- isSpeechRecognitionActivityPresented — 检查语音识别应用是否存在于系统中
- installGoogleVoiceSearch — 初始化 Google 语音搜索安装进程
- startRecognition — 准备适合的意图并运行识别
为了检查设备是否有语音识别应用,我们可以使用类 PackageManager 中的 queryIntentActivities 方法。
该方法列出了可以处理指定意图的各种活动。 为了接收 PackageManager 的一个实例,我们可以使用 getPackageManager。
我们的代码如下所示:
isSpeechRecognitionActivityPresented
07 | private static boolean
isSpeechRecognitionActivityPresented(Activity callerActivity) { |
10 | PackageManager
pm = callerActivity.getPackageManager(); |
12 | List
activities = pm.queryIntentActivities( new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH),
0); |
14 | if (activities.size()
!= 0) { |
17 | } catch (Exception
e) { |
现在执行 startRecognition 函数。 该函数为启动语音识别活动提供适合的意图。 如欲了解有关该过程的详细信息,请查看 文档页。
源代码:
05 | private static void startRecognitionActivity(Activity
callerActivity) { |
08 | Intent
intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); |
11 | intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Select
an application" ); |
12 | intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); |
13 | intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,
1); |
17 | ownerActivity.startActivityForResult(intent,
SystemData.VOICE_RECOGNITION_REQUEST_CODE); |
最后,我们需要执行 installGoogleVoiceSearch。 该函数将会显示出一个会话,询问用户是否需要安装 Google 语音搜索,如果用户同意,则将其转至 Google Play。
06 | private static void installGoogleVoiceSearch(final
Activity ownerActivity) { |
10 | Dialog
dialog = new AlertDialog.Builder(ownerActivity) |
11 | .setMessage( "For
recognition it’s necessary to install "Google Voice Search"" ) |
12 | .setTitle( "Install
Voice Search from Google Play?" ) |
13 | .setPositiveButton( "Install" , new DialogInterface.OnClickListener()
{ |
17 | public void onClick(DialogInterface
dialog, int which)
{ |
23 | intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY
| Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); |
25 | ownerActivity.startActivity(intent); |
26 | } catch (Exception
ex) { |
32 | .setNegativeButton( "Cancel" ,
null) |
大致就是这样。 我们运行语音识别活动。 然后请求用户的许可,安装语音搜索并在取得用户同意之后将其转至 Google Play。 我们还需要做的一件事就是收集语音识别的结果。
我们使用 startActivityForResult 函数发送一个请求,收集已启动活动的结果。
我们还需要在我们的意图调用程序活动中重新定义一个OnActivityResult 方法。
按照以下方式进行定义:
03 | public void onActivityResult( int requestCode, int resultCode,
Intent data) { |
07 | if (requestCode
== SystemData.VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) { |
12 | ArrayList
matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); |
15 | if (matches.size()
> 0) Toast.makeText( this ,
matches.get(0), Toast.LENGTH_LONG).show(); |
18 | super.onActivityResult(requestCode,
resultCode, data); |
现在我们已经准备就绪
借助已创建的类 SpeechRecognitionHelper,我们只需调用一个函数 run() 就能执行一个语音识别请求。
此时只需在我们的项目中添加该类并在需要的位置中调用运行函数就能添加一个识别功能。 然后为发起识别请求的活动重新定义 onActivityResult 方法并执行处理文本结果。
如欲了解更多信息,请查看 Android 开发人员 网站。 这里的一些正确 示例 展示了如何实现语音识别,更重要的是,如何获取可用的语言列表。
如果您想要识别除用户默认位置之外的一种语言,您就需要使用该列表。
如果您想快速地将语音输入集成到您的应用中,您可以下载该代码并将其用于 SpeechRecognitionHelper 类。