简介在本文中,我将向您展示一个基本的Android应用程序,它可以侦听用户的语音并将其转换为文本数据。而且,本程序还可以进行文本分析,然后执行相应的命令,实现数据存储和用户响应功能。注意,本文的源码项目下载地址为:https://github.com/sitepoint-editors/SpeechApplication。程序截图如下:创建一个应用程序打开AndroidStudio新建一个项目,选择AndroidAPI18的最低版本,添加一个空的Activity。这也是该项目中唯一的Activity。为了实现view的全屏显示,打开配置文件AndroidManifest.xml,设置如下:android:theme="@style/Theme.AppCompat.NoActionBar"这个配置会隐藏我们的ActionBar的显示当前活动(Activity)。此时,您已经有了一个全屏布局视图,背景颜色为白色,其中只有一个TextView控件。为了进行一些改进,您可以向RelativeLayout添加渐变形状。接下来,右键单击drawable文件夹并选择New->Drawableresourcefile。将此资源文件命名为background,并用以下代码替换原来的内容:实际上,您可以根据自己的喜好任意修改颜色和角度。注意:布局中的ImageButton控件使用来自https://design.google.com/icons/#ic_mic_none的图像。您可以下载它并将其添加为资源。接下来,更新文件activity_main.xml中的代码:添加说话功能现在,用户界面部分已经完成,下一步就是把里面的MainActivity的Java代码写上去。首先在onCreate方法上面声明一个变量TextToSpeech:privateTextToSpeechtts;然后,将以下代码添加到onCreate方法中:if(result==TextToSpeech.LANG_MISSING_DATA||result==TextToSpeech.LANG_NOT_SUPPORTED){Log.e("TTS","ThisLanguageisnotsupported");}speak("Hello");}else{Log.e("TTS","初始化失败!");}}});上述代码将启动系统中的TextToSpeech服务。speak()方法采用String类型的参数,这是您要求Android设备朗读的文本。接下来,创建此方法并添加以下代码:privatevoidspeak(Stringtext){if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){tts.speak(text,TextToSpeech.QUEUE_FLUSH,null,null);}else{tts.speak(text,TextToSpeech.QUEUE_FLUSH,null);}}Build.VERSION检查在上面的代码中使用,因为tts.speak(param,param,param)格式的调用对于AndroidAPI5.1来说已经过时了。在speak()方法后面创建另一个方法,负责在用户关闭程序时停止TextToSpeech服务:@OverridepublicvoidonDestroy(){if(tts!=null){tts.stop();tts.shutdown();}super.onDestroy();}此时,一旦启动程序,程序就能说“Hello”。接下来要实现的是使程序能够监听。添加收听功能要使程序能够收听,您需要使用麦克风按钮。为此,您需要在onCreate方法中添加以下代码:当ImageButton控件被点击时,会触发调用下面这个函数:privatevoidlisten(){Intenti=newIntent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);i.putExtra(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);i.putExtra(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).getDefault());i.putExtra(RecognizerIntent.EXTRA_PROMPT,"Saysomething");try{startActivityForResult(i,100);}catch(ActivityNotFoundExceptiona){Toast.makeText(MainActivity.this,"Yourdevicedoes'tsupportSpeechRecognition",Toast。LENGTH_SHORT).show();}}这里的方法会启动监听Activity,会显示一个带有文字提示的对话框。用于说话的语言由设备提供并通过Locale.getDefault()方法实现。StartActivityForResult(i,100)方法等待当前活动返回结果。100只是附加到已启动活动的随机代码,但它可以是适合您需要的任何数字。当从启动的活动返回结果时,它包含此代码并使用此代码来区分多个结果。要从启动的活动中捕获结果,您需要添加以下覆盖方法:@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);if(requestCode==100){if(resultCode==RESULT_OK&&null!=data){ArrayListres=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);StringinSpeech=res.get(0);recognition(inSpeech);}}}此方法捕获活动的每个结果并使用requestCode处理语言识别器结果数据。如果requestCode等于100,则requestCode等于OK,并且此结果中的数据不为空。您将从res.get(0)获得结果字符串。接下来,创建一个新的方法recognition,它将接受一个String类型的参数:privatevoidrecognition(Stringtext){Log.e("Speech",""+text);}到目前为止,当用户点击麦克风按钮时,程序可以听声音,并能将用户的语言转换成文本数据,最后的结果会通过Errorlog打印出来。添加学习功能为了使程序更有趣一些,在本节中,您将使应用程序能够学习一些简单的东西,例如您的名字。为了实现这个功能,需要用到本地存储功能。首先,在onCreate方法中添加如下代码:方法:preferences=getSharedPreferences(PREFS,0);editor=preferences.edit();首先,您需要让应用程序提问,因此您需要将speak("Hello")更改为speak("Whatisyourname?")。这里,您可以使用一个简单的逻辑;因此,当有人问“Whatis你的名字?”,答案是“MynameisDori”,所以名字是从答案中提出来的。一个简单的方法是将答案用空格分隔的字符串拆分,并得到最后一个索引的值。因此,我们需要更新识别方法中的代码如下:/thelastwordisournameStringname=speech[speech.length-1];//wegotthename,wecanputitinlocalstorageandsavechangeseditor.putString(NAME,name).apply();//maketheapptellournamespeak("Yournameis"+preferences.getString(NAME,null));}识别方法使用用户语音的所有结果。由于语音可能不同,您可以使用它们可能包含的某些词来区分它们。例如,这个方法中的代码可以是:.contains("mynameis")){Stringname=speech[speech.length-1];Log.e("Yourname",""+name);editor.putString(NAME,name).apply();speak("Yournameis"+preferences.getString(NAME,null));}}但这仍然是与应用程序的简单交互。你可以让它知道你的年龄,或者给它起个名字。在相同的方法中,您可以尝试这些简单的条件://Thismustbetheage//Justspeak:Iamxyearsold.if(text.contains("years")&&text.contains("old")){Stringage=speech[speech.length-3];Log.e("THIS",""+age);editor.putString(AGE,age).apply();}//Thenaskitforyourageif(text.contains("howoldamI")){speak("Youare"+preferences.getString(AGE,null)+"yearsold.");}应用程序可以告诉你时间信息://Ask:Whattimeisit?if(text.contains("whattimeisit")){SimpleDateFormatsdfDate=newSimpleDateFormat("HH:mm");//dd/MM/yyyyDatenow=newDate();String[]strDate=sdfDate.format(now).split(":");if(strDate[1].contains("00"))strDate[1]="o'clock";speak("Thetimeis"+sdfDate.format(now));}总结在我创建的GitHub项目中(https://github.com/sitepoint-editors/SpeechApplication)包含更多示例,您可以充分体验和开发自己真正的Android助手程序。最后,我希望您喜欢本教程,并希望您能够与您的手机进行真正有用的对话。