android语音识别Demo

来源:互联网 发布:医学科普文章 知乎 编辑:程序博客网 时间:2024/05/02 00:04

科大讯飞-语音识别开发

在线语音识别

将连续语音快速识别为文字语音识别在模拟器上是无法测试的,虚拟机mac接收不到声音或者语音识别是访问云端数据,所以如果手机的网络没有开启,就无法实现识别声音的!一定要开启手机的网络,如果手机不存在语音识别功能的话,也是无法启用识别!

效果图

这里写图片描述

源码

下载地址(Android Studio工程):http://download.csdn.net/detail/kwunyamshan/9692791
注意:源码中是我的sdk,只有三个装机量35天试用期限,你们试用需要替换掉SpeechApp中配置的Appid以及so库!

集成步骤

开通服务,下载SDK
之前介绍过,地址:http://blog.csdn.net/kwunyamshan/article/details/53320164

Step 1. 导入so库     eclipse将so库导入到libs目录下     AS用户将so导入到jniLibs目录下     下载的官方SDK中有七个so库目前已经支持市面上98%的手机     armeabi目录下libmsc.so只支持市面上百分之八十的手机,如果不需要做适配的话导入这一个so库也是极好的

这里写图片描述

Step 2. 拷贝资产文件        将 SDK 资源包assets 路径下的资源文件拷贝至 Android 工程 asstes 目录下

这里写图片描述

Step 3.  初始化        这是很重要并且是必须的一步操作,实际上初始化的操作是异步进行的,如果初始化还没有完成你就开始调用了语音识别,是会出现很多问题的,建议在你程序刚刚启动的时候调用
public class SpeechApp extends Application {    @Override    public void onCreate() {        // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null        // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton        // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true"        // 参数间使用半角“,”分隔。        // 设置你申请的应用appid,请勿在'='与appid之间添加空格及空转义符        // 注意: appid 必须和下载的SDK保持一致,否则会出现10407错误        SpeechUtility.createUtility(SpeechApp.this, "appid=" + getString(R.string.app_id));        // 以下语句用于设置日志开关(默认开启),设置成false时关闭语音云SDK日志打印        // Setting.setShowLog(false);        super.onCreate();    }}
Step 4.  添加用户权限,官方给的API中不规范有几条权限中间有空格导致编译不通过 ,注意一下
<!--连接网络权限,用于执行云端语音能力 -->    <uses-permission android:name="android.permission.INTERNET"/>    <!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->    <uses-permission android:name="android.permission.RECORD_AUDIO"/>    <!--读取网络信息状态 -->    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>    <!--获取当前wifi状态 -->    <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"/>    <!--手机定位信息,用来为语义等功能提供定位, 提供更精准的服务-->    <!--定位信息是敏感信息, 可通过Setting.setLocationEnable(false)关闭定位请求 -->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>    <!--如需使用人脸识别,还要添加:摄相头权限, 拍照需要用到-->    <uses-permission android:name="android.permission.CAMERA" />
Step 5. 代码
public class MainActivity extends Activity {    private StringBuffer mBuffer;    private TextView tv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv = (TextView) findViewById(R.id.tv_translate_text);    }    public void startVoice(View view) {        //1.创建RecognizerDialog对象        RecognizerDialog mDialog = new RecognizerDialog(this, null);        //2.设置accent、 language等参数        mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");        mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");        //若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解结果        // mDialog.setParameter("asr_sch", "1");        // mDialog.setParameter("nlp_version", "2.0");        mBuffer = new StringBuffer();        //3.设置回调接口        mDialog.setListener(mRecognizerDialogListener);        //4.显示dialog,接收语音输入        mDialog.show();    }    RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {        //听写结果回调接口(返回Json格式结果,用户可参见附录13.1);        //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;        //关于解析Json的代码可参见Demo中JsonParser类;        //isLast等于true时会话结束。        @Override        public void onResult(RecognizerResult results, boolean isLast) {            String result = results.getResultString();//语音听写的结果            String resultString = processData(result);            mBuffer.append(resultString);            if (isLast) {                //话已经说完了                String finalResult = mBuffer.toString();                System.out.println("解析结果:" + finalResult);                tv.setText(finalResult);            }        }        @Override        public void onError(SpeechError error) {        }    };    //解析json    protected String processData(String result) {        Gson gson = new Gson();        VoiceBean voiceBean = gson.fromJson(result, VoiceBean.class);        StringBuffer sb = new StringBuffer();        ArrayList<VoiceBean.WsBean> ws = voiceBean.ws;        for (VoiceBean.WsBean wsBean : ws) {            String word = wsBean.cw.get(0).w;            sb.append(word);        }        return sb.toString();    }}

layout

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"    ><TextView    android:padding="5dip"    android:layout_width="match_parent"    android:layout_height="230dip"    android:id="@+id/tv_translate_text"    android:background="#fff"    android:textSize="22sp"    android:textColor="#000"    android:hint="请点击按钮"    /><LinearLayout    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal"    android:background="#F1AF5A"    android:gravity="center"    >    <ImageButton        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/button"        android:onClick="startVoice"        /></LinearLayout></LinearLayout>
Step 6. 目录结构

这里写图片描述

遇到问题可以留言探讨会尽快回复,也可以访问官方地址
网址:http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=13040&fromuid=86908

1 0
原创粉丝点击