#实现android语音识别


下载地址:
https://download.csdn.net/download/huosanghuakai1995/10348660

##一、准备工作

科大讯飞开放云平台:http://www.xfyun.cn,自行注册。

  • 注册完毕后下载科大讯飞云平台提供的SDK,勾选下面的服务选择android平台后,下载SDK。

使用科大讯飞提供的SDK实现android语音识别_第1张图片


  • 按照提示完成SDK配置和权限添加工作
  • 将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下。
  • 在工程 AndroidManifest.xml 文件中添加权限:

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.RECORD_AUDIO"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><uses-permission android:name="android.permission.READ_CONTACTS"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_SETTINGS"/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><uses-permission android:name="android.permission.CAMERA" />

  • 初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:

SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");//APPID是你自己注册的APPID,可以自己去查看

##二、开始新建android工程

  • java代码:
    主activity
package com.demo.voice;import java.util.ArrayList;import java.util.Collections;import java.util.List;import sina.CreAmazing.voice.R;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.os.Bundle;import android.text.NoCopySpan.Concrete;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import android.widget.ToggleButton;import com.iflytek.speech.RecognizerResult;import com.iflytek.speech.SpeechError;import com.iflytek.speech.SynthesizerPlayer;import com.iflytek.ui.RecognizerDialog;import com.iflytek.ui.RecognizerDialogListener;import com.iflytek.ui.SynthesizerDialog;import com.iflytek.ui.SynthesizerDialogListener;public class VoiceRecognize extends Activity {    // 声明控件    private EditText et;    private Button bt1;    private Button bt2;    private Button bt3;    private ToggleButton tb;    private PackageManager pm;    // 全局只设一个String,因为String为final类型,这样做节省内存    String text = "";    private static final String APPID = "appid=11111111";//定义一个常量APPPID,我自己的不便公开需要修改为你自己的;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        //这是后台朗读,实例化一个SynthesizerPlayer        SynthesizerPlayer player = SynthesizerPlayer.createSynthesizerPlayer(VoiceRecognize.this, APPID);        //设置语音朗读者,可以根据需要设置男女朗读,具体请看api文档和官方论坛        player.setVoiceName("vivixiaoyan");//在此设置语音播报的人选例如:vivixiaoyan、vivixiaomei、vivixiaoqi        player.playText("hello world", "ent=vivi21,bft=5",null);        bt1 = (Button) findViewById(R.id.bt_recognize);        bt2 = (Button) findViewById(R.id.bt_speek);        bt3 = (Button) findViewById(R.id.bt_speek_bg);        et = (EditText) findViewById(R.id.et);        tb = (ToggleButton) findViewById(R.id.tb);        // 初始化监听器        initListener();    }    private void initListener() {        bt1.setOnClickListener(myListener);        bt2.setOnClickListener(myListener);        bt3.setOnClickListener(myListener);    }    OnClickListener myListener = new OnClickListener() {        @Override        public void onClick(View v) {            // 根据不同View的id调用不同方法            switch (v.getId()) {                case R.id.bt_recognize:                    // 这是语言识别部分,最重要的实例化一个                    // RecognizerDialog并把在官方网站申请的appid填入进去,非法id不能进行识别                    RecognizerDialog isrDialog = new RecognizerDialog(VoiceRecognize.this, APPID);                    /*                     * 设置引擎目前支持五种 ”sms”:普通文本转写 “poi”:地名搜索 ”vsearch”:热词搜索                     * ”video”:视频音乐搜索 ”asr”:命令词识别                     */                    isrDialog.setEngine("sms", null, null);                    isrDialog.setListener(recoListener);                    isrDialog.show();                    break;                case R.id.bt_speek:                    // 这是语言合成部分 同样需要实例化一个SynthesizerDialog ,并输入appid                    SynthesizerDialog syn = new SynthesizerDialog(VoiceRecognize.this, APPID);                    syn.setListener(new SynthesizerDialogListener() {                        @Override                        public void onEnd(SpeechError arg0) {                        }                    });                    // 根据EditText里的内容实现语音合成                    syn.setText(et.getText().toString(), null);                    syn.show();                    break;                case R.id.bt_speek_bg:                    //这是后台朗读,实例化一个SynthesizerPlayer                    SynthesizerPlayer player = SynthesizerPlayer.createSynthesizerPlayer(VoiceRecognize.this, APPID);                    //设置语音朗读者,可以根据需要设置男女朗读,具体请看api文档和官方论坛                    player.setVoiceName("vivixiaoyan");//在此设置语音播报的人选例如:vivixiaoyan、vivixiaomei、vivixiaoqi                    player.playText(et.getText().toString(), "ent=vivi21,bft=5",null);                    break;                default:                    break;            }        }    };    public  void openApp(String str){          //应用过滤条件,intent启动是应用的顶层          Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);          PackageManager mPackageManager =getPackageManager();          //返回给定条件的所有ResolveInfo对象(本质为activity)        List<ResolveInfo> mAllApps = mPackageManager.queryIntentActivities(mainIntent, 0);          //按包名排序          Collections.sort(mAllApps, new ResolveInfo.DisplayNameComparator(mPackageManager));          for(ResolveInfo res : mAllApps){              //该应用的包名和主Activity              String pkg = res.activityInfo.packageName;              String cls = res.activityInfo.name;              System.out.println("pkg~~~~~~" +pkg);              // 打开QQ pkg中包含"qq",打开微信,pkg中包含"mm"              if(pkg.contains(str)){                  ComponentName componet = new ComponentName(pkg, cls);                                Intent intent = new Intent();                  intent.setComponent(componet);                  intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                  VoiceRecognize.this.startActivity(intent);              }          } }    // 语言识别监听器,有两个方法    RecognizerDialogListener recoListener = new RecognizerDialogListener() {        @Override        public void onResults(ArrayList<RecognizerResult> results,                boolean isLast) {            // 新增加了一个ToggleButton tb,首先检查tb是否被按下,如果被按下才进行语言控制,没被按下就进行文字识别            if (tb.isChecked()) {                // doVoice方法就是进行识别                doVoice(results);            } else {                // 服务器识别完成后会返回集合,我们这里就只得到最匹配的那一项                text += results.get(0).text;                System.out.println(text);            }        }        // 首先迭代结果,然后获取每个结果,并进行对比,如果包含有特定字符串,那么就执行相应Intent跳转。        // 注意 凡是Intent能办到的(发邮件,跳到已安装应用,拨号,发短信,发彩信,浏览网页,播放多媒体。。。。),它就都能办到。        private void doVoice(ArrayList<RecognizerResult> results) {            Intent i = new Intent();            for (RecognizerResult result : results) {                if (result.text.contains("天气")) {                    // 天气界面的跳转                    i.setClass(VoiceRecognize.this, Weather.class);                    startActivity(i);                } else if (result.text.contains("QQ")) {                    // 跳转到QQ                openApp("com.tencent.mobileqq");//QQ的包名                } else if (result.text.contains("短信")) {                    // 短信界面的跳转                    i.setAction(Intent.ACTION_VIEW);                    i.setType("vnd.android-dir/mms-sms");                    startActivity(i);                } else {                    // 如果没有相应指令就用Toast提示用户                    Toast.makeText(VoiceRecognize.this, "无法识别",Toast.LENGTH_SHORT).show();                }            }        }        @Override        public void onEnd(SpeechError error) {            if (error == null) {                // 完成后就把结果显示在EditText上                et.setText(text);            }        }    };}

demo里面的Wether是要跳转的acticity,当语言识别监听器接收到“天气”时会跳转到wether界面。

package com.demo.voice;import sina.CreAmazing.voice.R;import android.app.Activity;import android.os.Bundle;public class Weather extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.weather);}}
  • 下面是xml文件
    wether.xml:这是wether界面
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    android:orientation="vertical"     android:background="#F5F5DC">    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:gravity="center"        android:text="Weather"        android:textSize="70dp"         android:textColor="#FF1493"/>LinearLayout>

main.xml:这是主界面

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

AndroidManifest.xml:里面有权限获取以及activity的注册

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="sina.CreAmazing.voice"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" />    <application        android:icon="@drawable/ic_launcher"        android:label="@string/app_name" >        <activity            android:name="com.demo.voice.VoiceRecognize"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            intent-filter>        activity>        <activity android:name="com.demo.voice.Weather" >        activity>        <activity android:name="com.demo.voice.News" >        activity>    application>    <uses-permission android:name="android.permission.RECORD_AUDIO" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />manifest>

##三、功能简介
安装到手机上后,进入应用会朗读文本“hello world”;
可以看到有四个按钮,点击第一个按钮会启动语音听写并加载到文本框里面,点击第二个按钮会朗读文本框里面输入的文本,点击第三个按钮能在后台朗读,点击最后一个按钮可以开关语音控制,语音控制开启后识别到“QQ”,“短信”会打开相应的应用,识别到“天气”会跳转到wether界面;

更多相关文章

  1. Android之——申请应用系统管理员权限
  2. android selinux权限, Permission denied, 访问限制
  3. [Android--Structure]App系统权限permission与安全security
  4. Android更新至2.3.6 改进语音搜索

随机推荐

  1. Grafana 之 自定义监控板
  2. Grafana 之 kubeGraf插件安装使用
  3. 用ldap作为django后端用户登录验证
  4. 记一次生产环境问题解决案例(k8s环境)
  5. ArrayList底层
  6. 苹果Mac强大的图床软件:​​​​PicGo
  7. 【东哥说书】俞军产品方法论
  8. Apache Flink 商业公司 Ververica 又有几
  9. 一文了解 Apache Hive 联邦查询(Query Fed
  10. 从行存储到 RCFile,Facebook 为什么要设计