语音识别之语音控制

接上文,如何实现语音控制呢?比如当我们说天气的时候,界面会自动呈现的天气预报的界面,当我们说UC的时候,会自动跳转到UC浏览器上等等。其实方法很简单,仅仅需要对识别到的字符串进行判断,当它符合特定的字符串是就对Activity进行跳转,跳转到自己写好的Activity上,或者跳转到已安装的应用上,下面来看具体怎么实现:
首先我们在layout布局里增加一个ToggleButton用于开关语音控制:

然后我们就在获取结果的RecognizerDialogListener下面改变几行代码:
[java] view plain copy print ?
  1. RecognizerDialogListener recoListener = new RecognizerDialogListener() {
  2. @Override
  3. public void onResults(ArrayList results,
  4. boolean isLast) {
  5. //新增加了一个ToggleButton tb,首先检查tb是否被按下,如果被按下才进行语言控制,没被按下就进行文字识别
  6. if (tb.isChecked()) {
  7. //doVoice方法就是进行识别
  8. doVoice(results);
  9. } else {
  10. // 服务器识别完成后会返回集合,我们这里就只得到最匹配的那一项
  11. text += results.get(0).text;
  12. System.out.println(text);
  13. }
  14. }
RecognizerDialogListener recoListener = new RecognizerDialogListener() {

		@Override
		public void onResults(ArrayList results,
				boolean isLast) {
//新增加了一个ToggleButton tb,首先检查tb是否被按下,如果被按下才进行语言控制,没被按下就进行文字识别			
			if (tb.isChecked()) {
//doVoice方法就是进行识别				
				doVoice(results);
			} else {
				// 服务器识别完成后会返回集合,我们这里就只得到最匹配的那一项
				text += results.get(0).text;
				System.out.println(text);
			}

		}
如果进行语言识别就把返回的结果传入上面的doVoice方法里,doVoice如下:
[java] view plain copy print ?
  1. //首先迭代结果,然后获取每个结果,并进行对比,如果包含有特定字符串,那么就执行相应Intent跳转。
  2. //注意 凡是Intent能办到的(发邮件,跳到已安装应用,拨号,发短信,发彩信,浏览网页,播放多媒体。。。。),它就都能办到。
  3. private void doVoice(ArrayList results) {
  4. Intent i = new Intent();
  5. for(RecognizerResult result : results){
  6. if(result.text.contains("天气")){
  7. //天气界面的跳转
  8. i.setClass(Voice1Activity.this, Weather.class);
  9. startActivity(i);
  10. }else if(result.text.contains("新闻")){
  11. //新闻界面的跳转
  12. i.setClass(Voice1Activity.this, News.class);
  13. startActivity(i);
  14. }else if(result.text.contains("短信")){
  15. //短信界面的跳转
  16. i.setAction(Intent.ACTION_VIEW);
  17. i.setType("vnd.android-dir/mms-sms");
  18. startActivity(i);
  19. }else{
  20. //如果没有相应指令就用Toast提示用户
  21. Toast.makeText(Voice1Activity.this, "无法识别", Toast.LENGTH_SHORT).show();
  22. }
  23. }
  24. }
//首先迭代结果,然后获取每个结果,并进行对比,如果包含有特定字符串,那么就执行相应Intent跳转。
//注意 凡是Intent能办到的(发邮件,跳到已安装应用,拨号,发短信,发彩信,浏览网页,播放多媒体。。。。),它就都能办到。		
		private void doVoice(ArrayList results) {
			Intent i = new Intent();
			for(RecognizerResult result : results){
				if(result.text.contains("天气")){
					//天气界面的跳转
					i.setClass(Voice1Activity.this, Weather.class);
					startActivity(i);
				}else if(result.text.contains("新闻")){
					//新闻界面的跳转
					i.setClass(Voice1Activity.this, News.class);
					startActivity(i);
				}else if(result.text.contains("短信")){
					//短信界面的跳转
					i.setAction(Intent.ACTION_VIEW);
					i.setType("vnd.android-dir/mms-sms");
					startActivity(i);
				}else{
					//如果没有相应指令就用Toast提示用户
					Toast.makeText(Voice1Activity.this, "无法识别", Toast.LENGTH_SHORT).show();
				}
			}
			
		}
如下是做得相应简单界面:


其实在主UI里执行那么耗时操作比如语音的识别与控制并不是很好的方法,其实完全可以把这些耗时的操作交给Service来做只要在主Activity的开始,启动一个Service,定义好各种逻辑接口并把那些耗时的操作交给Service就行了,在Service里面实现语音的识别,控制和逻辑的跳转。

源码地址:http://115.com/file/c2403e81#VoiceContral.rar

你可能感兴趣的:(语音识别)