讯飞语音识别demo实现

最近看了看百度语音和讯飞语音识别的实现,吐个槽,他们的官方文档是真的写得垃圾,多是我技术不到位,html

反正我是很难看懂的,不吐槽了,先上实现android

讯飞的官方文档json

https://doc.xfyun.cn/msc_android/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5%88%AB.html网络

按步骤来app

  • 注册帐号进去后注册应用,获得APPID(这是必须操做,由于不注册应用是不能够下载的,固然也不要想着从其余位置拷贝SDK过来,这里我开始没有理解,后面才知道,每一个SDK都是和你要用的应用的APPID绑定的,因此即便拷了别人的SDK过来也没用)

下载 的SDK后面图画部分就是你的APPID,也就是这个SDK必须使用这个APPIDide

  • 获得了资源后接下来就是新建工程,而后将文件放到对应位置了

三个对应的资料在SDK里面找到文件 对症下药便可gradle

在app的build.gradle里面添加上面配置,加载libs和jnilibs的文件ui

sourceSets{
        main{
            jniLibs.srcDir 'libs'
            jni.srcDirs = []
        }
    }
  • 接下来就是代码实现了
  • 添加权限
  • <!--链接网络权限,用于执行云端语音能力 -->
        <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"/>

     

  • 首先须要初始化操做
    SpeechUtility.createUtility(this, SpeechConstant.APPID + "=111111111");

     后面的111111是表明你的APPID,拿来替换便可,这个初始化能够世界子啊你的demo里面oncreate方法里面进行this

  • 下面这个代码是获得并显示讯飞语音识别视图编码

  • public void startVoice(){
            //1.建立RecognizerDialog对象
            RecognizerDialog recognizerDialog = new RecognizerDialog(MainActivity.this, this);
            //2.设置accent、language等参数
            recognizerDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//语种,这里能够有zh_cn和en_us
            recognizerDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//设置口音,这里设置的是汉语普通话 具体支持口音请查看讯飞文档,
            recognizerDialog.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");//设置编码类型
    
            //其余设置请参考文档http://www.xfyun.cn/doccenter/awd
            //3.设置讯飞识别语音后的回调监听
            recognizerDialog.setListener(new RecognizerDialogListener() {
                @Override
                public void onResult(RecognizerResult recognizerResult, boolean b) {//返回结果
                    if (!b) {
                        Log.i("test_xunfei", recognizerResult.getResultString());
                        result(recognizerResult.getResultString());
                    }
                }
    
                @Override
                public void onError(SpeechError speechError) {//返回错误
                    Log.e("test_xunfei", speechError.getErrorCode() + "");
                }
    
            });
            //显示讯飞语音识别视图
            recognizerDialog.show();
        }

     

    箭头指向的这个this是我实现了InitListener接口,这个接口会让你实现下面这个方法

@Override
    public void onInit(int code) {
        if (code != ErrorCode.SUCCESS) {
            Toast.makeText(MainActivity.this,"初始化失败,错误码:" + code,Toast.LENGTH_LONG).show();
        }
    }
  • 接下来是拿到识别后的返回结果
  • 在上面onresult毁掉方法里面的log,拿到的只是json数据
  • {"sn":1,"ls":false,"bg":0,"ed":0,"ws":[{"bg":1,"cw":[{"sc":0.0,"w":"你好"}]}]}这样的值,解析这个数据便可获得
  • 添加fastjson用来解析这个返回值implementation 'com.alibaba:fastjson:1.2.8'
  • public String result(String resultString){
            JSONObject jsonObject = JSON.parseObject(resultString);
            JSONArray jsonArray = jsonObject.getJSONArray("ws");
            StringBuffer stringBuffer = new StringBuffer();
            for (int i = 0; i < jsonArray.size(); i++) {
                JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                JSONArray jsonArray1 = jsonObject1.getJSONArray("cw");
                JSONObject jsonObject2 = jsonArray1.getJSONObject(0);
                String w = jsonObject2.getString("w");
                stringBuffer.append(w);
            }
            String result = stringBuffer.toString();
            Log.i("test_xunfei", "识别结果为:" + result);
            return result;
        }

     解析后获得的结果是:识别结果为:你好

  •  

     

    好了,总共就这些了,只是先语音识别功能这样仍是看上去挺简单的,就是不少时候官方文档没有解析不少细节,因此出了错不少时候不知道为何,但愿能帮到你们吧