Android简单语音控制应用的实现

   我们可以知道Google为Android应用程序开发者提供了简单而强大的语音识别技术的API,我们可以利用这些Api,结合Google的云端技术来实现功能强大的语音识别和语音控制应用。

本篇就结合最近项目,实现一个简单的语音控制Demo应用,实现简单的语音控制。

功能点为:通过用户语音将用户输入的语音识别出来,并完成预定义的命令操作。

说明:1、这个应用采用的是Android语音识别技术实现方法的第一种方法:使用intent调用Google的语音识别程序,通过访问google云端数据来进行识别。

     2、手机必须要能上网

     3、必须安装Google语音基础软件Google Action

       首先建立如下的一个activity,并在button下建立一个listview控件(用来回显语言识

别到的项目)。

android 控件长短 语音时长 android语音控制_android

 

设置预定义控制命令集。

在String.xml文件中

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">VoiceControl</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="voice_recognition">Voice Recognition and Control</string>
    <string name="speak_button">Speak!</string>
    <string name="action_camera_item1">打开照相机</string>
    <string name="action_camera_item2">打开相机</string>
    <string name="action_camera_item3">相机打开</string>
    <string name="action_camera_item4">照相机打开</string>
    <string name="action_gallery_item1">打开相册</string>
    <string name="action_gallery_item2">相册打开</string>
    <string name="action_gallery_item3">查看相册</string>
    <string name="action_gallery_item4">相册查看</string>
    <string name="action_video_item1">打开视频</string>
    <string name="action_video_item2">视频打开</string>
    <string name="action_video_item3">查看视频</string>
    <string name="action_video_item4">视频查看</string>
    <string name="action_music_item1">打开音乐</string>
    <string name="action_music_item2">音乐打开</string>
    <string name="action_music_item3">打开音乐播放器</string>
    <string name="action_music_item4">音乐播放器打开</string>
    <string name="action_desktime_item1">打开时间</string>
    <string name="action_desktime_item2">时间打开</string>
    <string name="action_desktime_item3">查看时间</string>
    <string name="action_desktime_item4">时间查看</string>
    <string name="action_browser_item1">打开浏览器</string>
    <string name="action_browser_item2">浏览器打开</string>
    <string name="action_browser_item3">使用浏览器</string>
<string name="action_browser_item4">浏览器使用</string>

</resources>

Java代码VoiceControl如下:

package com.sprd.voicecontrol;

import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager; //用于查找本地应用软件包相关的类  
import android.content.pm.ResolveInfo;  //从系统IntentFilter返回的信息  
import android.speech.RecognizerIntent;  //语音识别类  
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter; //相同数据用数组存储的匹配转化类  
import android.widget.Button;
import android.widget.ListView;

/***
 * 使用intent调用语音识别程序
 *	1.说明
 *		以下例程功能为:在应用程序中使用intent来调出语言识别界面,录音并识别后将识别的字串返回给应用程序。
 *		注意:使用前需要安装语音识别程序如语音搜索。
 *	2.本例参考自android例程:
 *		development/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.java
 *  3.实现简单语音命令控制
 * @author Administrator
 *
 */
public class VoiceControl extends Activity implements OnClickListener {
    
    private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234; //startActivityForResult操作要求的标识码  

    private ListView mList;
	private static final String TAG="VoiceControl";
	private int mCurrentSystemVersion=0; //当前系统版本
	private static final int SYSTEM_VERSION_ANDROID23 = 100;
	private static final int SYSTEM_VERSION_ANDROID40 = 101;
	
	private String[] mPackages23 = {"com.cooliris.media",//视频包名
			"com.cooliris.media",//相册应用包名
			"com.android.camera",
			"com.android.music",
			"com.android.deskclock",//桌面时钟包名
			"com.android.browser"};
	
	private String[] mActivitys23 = {"com.cooliris.media.VideoActivity",
			"com.cooliris.media.Gallery",
			"com.android.camera.Camera",
			"com.android.music.MusicBrowserActivity",
			"com.android.deskclock.DeskClock",
			"com.android.browser.BrowserActivity"};
	
	private String[] mPackages40 = {"com.android.gallery3d",
			"com.android.gallery3d",
			"com.android.camera",
			"com.android.music",
			"com.android.deskclock",
			"com.android.browser"};
	
	private String[] mActivitys40 = {"com.android.gallery3d.app.VideoActivity",
			"com.android.gallery3d.app.Gallery",
			"com.android.camera.Camera",
			"com.android.music.MusicBrowserActivity",
			"com.android.deskclock.DeskClock",
			"com.android.browser.BrowserActivity"};
	//预定义控制口令急
	private static final int ACTION_NULL = -1;
	private static final int ACTION_OPEN_VIDEO = 0;
	private static final int ACTION_OPEN_GALLERY = 1;
	private static final int ACTION_OPEN_CAMERA = 2;
	private static final int ACTION_OPEN_MUSIC = 3;
	private static final int ACTION_OPEN_TIME = 4;
	private static final int ACTION_OPEN_BROWSER = 5;
	
	public int[] mVedioStringId = {R.string.action_video_item1,R.string.action_video_item2,
			   R.string.action_video_item3,R.string.action_video_item4};
	public int[] mGalleryStringId = {R.string.action_gallery_item1,R.string.action_gallery_item2,
			   R.string.action_gallery_item3,R.string.action_gallery_item4};
	public int[] mCameraStringId = {R.string.action_camera_item1,R.string.action_camera_item2,
			   R.string.action_camera_item3,R.string.action_camera_item4};
	public int[] mMusicStringId = {R.string.action_music_item1,R.string.action_music_item2,
			   R.string.action_music_item3,R.string.action_music_item4};
	public int[] mTimeStringId = {R.string.action_desktime_item1,R.string.action_desktime_item2,
			   R.string.action_desktime_item3,R.string.action_desktime_item4};
	public int[] mBrowserStringId = {R.string.action_browser_item1,R.string.action_browser_item2,
			   R.string.action_browser_item3,R.string.action_browser_item4};
    /**
     * Called with the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Inflate our UI from its XML layout description.
        setContentView(R.layout.voice_control);
        //判断系统软件的版本,是Android2.3还是Android 4.x
		String mSystemVersion = android.os.Build.VERSION.RELEASE;
		Log.d(TAG,"---->>onCreate():info:"+ android.os.Build.VERSION.SDK +"," + android.os.Build.VERSION.RELEASE);
		//android.os.Build.VERSION_CODES;
		if(mSystemVersion.contains("2.3")){
			mCurrentSystemVersion = SYSTEM_VERSION_ANDROID23;
		}else if(mSystemVersion.contains("4.")){
			mCurrentSystemVersion = SYSTEM_VERSION_ANDROID40;	
		}else{
			mCurrentSystemVersion = SYSTEM_VERSION_ANDROID40;	
		}

        // Get display items for later interaction
        Button speakButton = (Button) findViewById(R.id.btn_speak);
        
        mList = (ListView) findViewById(R.id.list);

        /**
         * 下面是判断当前手机是否支持语音识别功能
         */
        // Check to see if a recognition activity is present
        PackageManager pm = getPackageManager();
        List<ResolveInfo> activities = pm.queryIntentActivities(
                new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); //本地识别程序 ,通过全局包管理器及特定intent,查找系统是否有语音识别的服务程序  
        		//new Intent(RecognizerIntent.ACTION_WEB_SEARCH), 0); // 网络识别程序  
        if (activities.size() != 0) {
            speakButton.setOnClickListener(this);//如果存在该activity 
        } else {
            speakButton.setEnabled(false); //否则将BUTTON显示值修改,并设置成不可选  
            speakButton.setText("Recognizer not present"); 
        }
    }

    /**
     * Handle the click on the start recognition button.
     */
    public void onClick(View v) {
        if (v.getId() == R.id.btn_speak) {
            startVoiceRecognitionActivity(); //OnClickListener中的要override的函数  
        }
    }

    /**
     * Fire an intent to start the speech recognition activity.
     */
    private void startVoiceRecognitionActivity() {
		/**
		 * 启动手机内置的语言识别功能
		 */
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); //设置为当前手机的语言类型
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition and simple control");//设置语音识别Intent调用的特定属性参数 ,;//出现语言识别界面上面需要显示的提示 
        startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); //启动一个要求有返回值的activity调用  
    }

    /**
     * Handle the results from the recognition activity.
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {//该函数非接口内也非抽象函数,为何会Override?  
        if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
            // Fill the list view with the strings the recognizer thought it could have heard
            ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            //解析存储识别返回的结果  
            mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,matches));
            //在listview中显示结果  
            startSelectApp(recognitionResult(matches));

        }

        super.onActivityResult(requestCode, resultCode, data);
    }
    private int recognitionResult(ArrayList<String> voiceArrayList){
        for(String result:voiceArrayList){
        	Log.d(TAG,"---->>result="+result);
        	if(recognitionVedio(result)){
        		return ACTION_OPEN_VIDEO;
        	}else if(recognitionGallery(result)){
        		return ACTION_OPEN_GALLERY;
        	}else if(recognitionCamera(result)){
        		return ACTION_OPEN_CAMERA;
        	}else if(recognitionMusic(result)){
        		return ACTION_OPEN_MUSIC;
        	}else if(recognitionTime(result)){
        		return ACTION_OPEN_TIME;
        	}else if(recognitionBrowser(result)){
        		return ACTION_OPEN_BROWSER;
        	}       	
        }
        return ACTION_NULL;
    }
    
    private boolean recognitionVedio(String recognitionString){
		Log.d(TAG, "---->>heww recognitionVedio():recognitionString="+recognitionString);
    	for(int i=0;i<mVedioStringId.length;i++){
    		String temp = getResources().getString(mVedioStringId[i]);
    		Log.d(TAG, "---->>recognitionVedio():temp="+temp);
    		if(recognitionString.contains(temp)){
    			return true;
    		}
    	}
    	return false;    	
    }
    private boolean recognitionGallery(String recognitionString){
    	for(int i=0;i<mGalleryStringId.length;i++){
    		if(recognitionString.contains(getResources().getString(mGalleryStringId[i]))){
    			return true;
    		}
    	}
    	return false;    	
    }
    private boolean recognitionCamera(String recognitionString){
    	for(int i=0;i<mCameraStringId.length;i++){
    		if(recognitionString.contains(getResources().getString(mCameraStringId[i]))){
    			return true;
    		}
    	}
    	return false;    	
    }
    private boolean recognitionMusic(String recognitionString){
    	for(int i=0;i<mMusicStringId.length;i++){
    		if(recognitionString.contains(getResources().getString(mMusicStringId[i]))){
    			return true;
    		}
    	}
    	return false;    	
    }
    private boolean recognitionTime(String recognitionString){
    	for(int i=0;i<mTimeStringId.length;i++){
    		if(recognitionString.contains(getResources().getString(mTimeStringId[i]))){
    			return true;
    		}
    	}
    	return false;    	
    }
    private boolean recognitionBrowser(String recognitionString){
    	for(int i=0;i<mBrowserStringId.length;i++){
    		if(recognitionString.contains(getResources().getString(mBrowserStringId[i]))){
    			return true;
    		}
    	}
    	return false;    	
    }
    
    public void startSelectApp(int position){
    	Log.d(TAG,"---->>heww position="+position);
    	if(position<0&&position>6){
    		return;
    	}
    	Intent intent = new Intent();
    	if(mCurrentSystemVersion == SYSTEM_VERSION_ANDROID23){
    		intent.setClassName(mPackages23[position],mActivitys23[position]);
    	}else{
    		intent.setClassName(mPackages40[position],mActivitys40[position]);
    	}
    	startActivity(intent);
    }
}

口令:打开照相机,执行预览结果如下:

      

android 控件长短 语音时长 android语音控制_ide_02

  

android 控件长短 语音时长 android语音控制_android 控件长短 语音时长_03