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


通过之前几篇文章Android语音识别技术简介Android语音识别的具体实现实例

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

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

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

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

2、手机必须要能上网

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

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

别到的项目)。

设置预定义控制命令集。

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.xString 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);    }}

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

完整代码下载

Google语音基础包Goole Actions下载

更多相关文章

  1. 《Android应用开发揭秘》第九章Android特色开发一
  2. unable to access android sdk add-on list
  3. [Android(安卓)Studio系列(五)] Android(安卓)Studio手动配置Gra
  4. Android(安卓)照相机打开方法
  5. 【Android(安卓)UI】色板
  6. Android版本号的识别——$(PLATFORM_VERSION)
  7. android VoiceRecognition 语音识别并打印到列表上
  8. 【Android】利用Fiddler进行抓包详解教程。抓取接口以及数据,可以
  9. Android(安卓)SDK安装时碰到的问题之解决办法

随机推荐

  1. Android视频播放: VideoView播放视频(三)
  2. Android权限大全
  3. Android studio maven pom.xml
  4. android 获取mac地址
  5. Android单元测试时如何使用log查看输出结
  6. Android(安卓)开发(六)C2DM 云端推送
  7. Android 字体颜色渐变效果 Span实现
  8. android图片缩放手势检测类--ScaleGestur
  9. Android 执行Shell命令
  10. android 通过webservice方式向服务器上传