美文网首页
Android 讯飞语音开发(Android Studio)

Android 讯飞语音开发(Android Studio)

作者: 闪电代码手 | 来源:发表于2017-06-03 12:16 被阅读814次

    前段时间火了一个很牛的讯飞语音,去看官方文档,瞬间蒙逼,官方是用的eclipse,我用的Android Studio。好了,能上代码尽量不BB。
    先来看看gradle里面要配置的东西。

    module里面:

    apply plugin: 'com.android.application'
    apply plugin: 'com.neenbedankt.android-apt'
    apply plugin: 'com.jakewharton.butterknife'
    

    添加butterknife,然后再来看看

    dependencies里面要写的:

    compile 'com.jakewharton:butterknife:8.4.0'
    apt 'com.jakewharton:butterknife-compiler:8.4.0'
    compile files('libs/Msc.jar')
    compile files('libs/Sunflower.jar')
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.code.gson:gson:2.7'
    

    添加了butterknife的包,并apt,然后呢,就要把官方要的包给放进去,没错,就是Msc.jar和Sunflower.jar,并把gson给弄进去,说到gson解析,那是没的说,好用。

    Project的gradle里面的dependencies:

    classpath 'com.android.tools.build:gradle:2.1.2'
    classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    

    到这里,还不算结束,因为还有so文件,将项目换成Project Files展示方式,找到app-->src-->main,新建jniLibs,记得L要大写,然后把东西放进去。嗯,对,就像这样:

    这里写图片描述

    不要问我为什么文件都是红色,本来想传git,结果不会弄。。。
    到这里,项目需要的包就弄完了。下面来看看manifest里面需要添加的权限

    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" />
        <!--获取当前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" />
    

    来来来,看看他的返回结果然后来写我们的bean


    这里写图片描述

    可以看到,一共3个list,我。。。还是先写最里面的吧。记得Getter and Setter啊
    另外,变量的名字要和他返回的相同,便于gson解析。

    TalkBackChineseWordVo

        // word,单字
        private String w;
        // score,分数
        private int sc;
    

    TalkBackWordsVo

        // begin,开始
        private int bg;
        // chinese word,中文分词
        private List<TalkBackChineseWordVo> cw;
    

    TalkBackVo

         // sentence,第几句
        private int sn;
         // last sentence,是否最后一句
        private boolean ls;
        // begin,开始
        private int bg;
        // end,结束
        private int ed;
        // words,词
        private List<TalkBackWordsVo> ws;
    

    在Activity中声明:

    //语音合成器
    private SpeechSynthesizer mSynthesizer;
    

    onCreate中:
    APPID是自己申请的,直接把12345678替换成申请好的ID

    //语音初始化,在使用应用使用时需要初始化一次就好,如果没有这句会出现10111初始化失败
    SpeechUtility.createUtility(this, SpeechConstant.APPID + "=12345678");
    //处理语音合成关键类
    mSynthesizer = SpeechSynthesizer.createSynthesizer(this, mInitListener);
    

    mInitListener

        private InitListener mInitListener = new InitListener() {
            @Override
            public void onInit(int code) {
                Log.e("tag", "initListener init code = " + code);
            }
        };
    
    

    初始化成功就会打印tag: initListener init code = 0,不要问我为什么,因为成功状态的code就是0,哈哈哈哈。
    接下来,看下语音播报

                    //设置发音人
                    mSynthesizer.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
                    //设置音调
                    mSynthesizer.setParameter(SpeechConstant.PITCH, "50");
                    //设置音量
                    mSynthesizer.setParameter(SpeechConstant.VOLUME, "50");
                    int code;
                    code = mSynthesizer.startSpeaking("你想要我说什么?", mTtsListener);
                    Log.e("tag", "mSynthesizer start code = " + code);
    

    发音人还有很多选项,大家可参照官方文档中的发音人列表选择自己喜欢的。
    startSpeaking方法的第一个参数就是播报的内容。

    mTtsListender代码如下:
    里面的方法,一猜名字就看懂了的,我就不贴出来咯

        //语音合成器listener
        private SynthesizerListener mTtsListener = new SynthesizerListener() {
            // 方法未贴出,完整方法有onSpeakBegin,onBufferProgress,onSpeakPaused,onSpeakResumed,onSpeakProgress,onCompleted,onEvent
        };
    

    接下来就是语音识别了,官方给出的是用dialog来实现,方法已经封装好了,我们就先来搞一搞。
    语音识别dialog

                    //语音识别dialog
                    RecognizerDialog mDialog = new RecognizerDialog(this, mInitListener);
                    //设置accent、language等参数
                    mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
                    mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
                    mDialog.setListener(mRecognizerDialogListerer);
                    mDialog.show();
    
    

    诶,敲黑板啦,重点来了:


    看这名字也知道,识别器的监听嘛,哈哈。

    private RecognizerDialogListener mRecognizerDialogListerer = new RecognizerDialogListener() {
        @Override
        public void onResult(RecognizerResult recognizerResult, boolean isLast) {}
        
        @Override
        public void onError(SpeechError speechError) {}
    };
    

    其中,onResult方法中,是重点,这时候会把识别结果返回给我们,期间可能会多次调用此方法。
    recognizerResult就是返回的结果,isLast即判断是否是返回结果的最后一条
    记得声明gson和list

    private static Gson gson = new Gson();
    private List<TalkBackVo> talkBackVoList;
    

    下面来看看怎么去获取最终的返回结果。

    String jsonStr = new String(recognizerResult.getResultString());
    //此处type中写TalkBackVo。
    Type type = new TypeToken<TalkBackVo>() {}.getType();
    TalkBackVo talkBackVo = gson.fromJson(jsonStr, type);
    talkBackVoList.add(talkBackVo);//将此vo添加到我们的list中
    String finalStr = "";//识别的最终结果
    //当是最后一句话时,才执行拼接字段操作
    if (isLast) {
        for (int i = 0; i < talkBackVoList.size(); i++) {
            for (int j = 0; j < talkBackVoList.get(i).getWs().size(); j++) {
                for (int k = 0; k < talkBackVoList.get(i).getWs().get(j).getCw().size(); k++) {
                    finalStr = finalStr + talkBackVoList.get(i).getWs().get(j).getCw().get(k).getW();
                }
             }
         }
    }
    

    gson会自动根据key去把value设置进去,省去手动解析的大半时间。

    一定要最后一条的时候才去拼接。但是不知道为什么,我说“英雄联盟”的时候,他先给我返回一条“英雄”和“联盟”,然后再是一条“。”是的,只有一个句号。不过拼接出来就是完整的“英雄联盟。”

    好了,我的装逼到此结束,谢谢各位。demo中还有开启悬浮框的代码,还有不用dialog语音识别的代码段,买一赠N,哈哈哈,良心商家。

    讯飞开发平台:http://www.xfyun.cn/doccenter/awd
    demo地址:http://download.csdn.net/detail/u013806766/9668792


    2016年11月1日更新,搞定github了,请各位审阅,以后如有更新,均在github。

    github地址:https://github.com/SimbaLiu/VCApp

    相关文章

      网友评论

          本文标题:Android 讯飞语音开发(Android Studio)

          本文链接:https://www.haomeiwen.com/subject/rknpfxtx.html