Android 讯飞语音开发

*本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

前段时间火了一个很牛的讯飞语音,去看官方文档,瞬间蒙逼,官方是用的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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值