Android语音识别

语音识别技术在手机上应用得相当广泛,人类日常最频繁的沟通方式是语音,而在手机应用中,大部分是通过硬件手动输入,目前这依然是主要与手机互动的方式。但是随着手机软硬件功能的不断提升,可以预见在不久的将来,语音交流将是人机交互的主要方式。IPhone手机内置的Siri语音助手就是一个很好的例子。而鲜为人知的是其使用的语音识别技术来自于Google。而想而知,作为Google力推的Android自然被植入了最核心的语音识别技术,其还整合了Google的云端技术以更好的实现人机语音互动。


Android中主要通过RecognizerIntent来实现语音识别,它主要包括一些常量来表示语音的模式等,如下图所示:

常量

描述

ACTION_RECOGNIZE_SPEECH

开启语音活动

ACTION_WEB_SEARCH

开启网络语音模式,结果将以网页搜索显示

EXTRA_LANGUAGE

设置语言库

EXTRA_LANGUAGE_MODEL

语音识别模式

EXTRA_MAX_RESULTS

返回的最大结果

EXTRA_PROMPT

提示用户可以开始语音

EXTRA _RESULTS

将字符串返回到一个ArrayList中

LANGUAGE_MODEL-FREE_FORM

在一种语言模式上自由语言

LANGUAGE_MODEL-WEB_SEARCH

使用语言模型在Web上搜索

RESULT_AUDIO_ERROR

返回结果时,音频遇到错误

RESULT_CLIENT_ERROR

返回结果时,客户端遇到错误

RESULT_NETWORK_ERROR

返回结果时,网络遇到错误

RESULT_NO_MATCH

没有检测到语音的错误

RESULT_SERVER_ERROR

返回结果时,服务器遇到错误

这里我们只需要通过Intent来传递一个动作以及一些属性,然后通过startActivityForResult来开始语音,代码如下:

  1. Intentintent=newIntent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
  2. intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
  3. intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"开始语音");

当然,如果找不到设置,就会抛出ActivityNotFoundException,所以我们需要捕捉这个异常。在以下的例子中,我们实现了一个简单的语音识别程序,当我们点击“点击使用语音识别”按钮之后,开始语音,然后在onActivityResult方法中取得结果并显示出来,其中如果当前手机没有连接到互联网则会显示连接问题,运行效果如以下所示:

点击按钮后: 如果没联网会出现连接错误:




向话筒说完“电脑”一词后:




具体实现的代码如下:

  1. publicclassRecognizerIntent_TestActivityextendsActivity{
  2. privatestaticfinalintVOICE_RECOGNITION_REQUEST_CODE=1;
  3. privateListViewmList;
  4. ButtonmButton;
  5. @Override
  6. publicvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. mButton=(Button)findViewById(R.id.button1);
  10. mButton.setOnClickListener(newmyRecognizerIntentListener());
  11. mList=(ListView)findViewById(R.id.listView1);
  12. }
  13. publicclassmyRecognizerIntentListenerimplementsOnClickListener{
  14. publicvoidonClick(Viewv){
  15. try{
  16. //用Intent来传递语音识别的模式,并且开启语音模式
  17. Intentintent=newIntent(
  18. RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
  19. //语言模式和自由形式的语音识别
  20. intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
  21. RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
  22. //提示语言开始
  23. intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"请开始语音");
  24. //开始语音识别
  25. startActivityForResult(intent,VOICE_RECOGNITION_REQUEST_CODE);
  26. }catch(ActivityNotFoundExceptione){
  27. Toast.makeText(RecognizerIntent_TestActivity.this,"找不到语音设备",
  28. Toast.LENGTH_LONG).show();
  29. }
  30. }
  31. }
  32. //语音结束时的回调函数
  33. @Override
  34. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  35. if(requestCode==VOICE_RECOGNITION_REQUEST_CODE
  36. &&resultCode==RESULT_OK){
  37. //取得语音的字符
  38. ArrayList<String>results=data
  39. .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
  40. //设置视图的更新
  41. mList.setAdapter(newArrayAdapter<String>(this,
  42. android.R.layout.simple_list_item_1,results));
  43. StringresultsString="";
  44. for(inti=0;i<results.size();i++){
  45. resultsString+=results.get(i);
  46. }
  47. Toast.makeText(this,resultsString,Toast.LENGTH_LONG).show();
  48. }
  49. super.onActivityResult(requestCode,resultCode,data);
  50. }
  51. }