android集成科大讯飞语音听写和语音合成

标签: android 语音合成 语音听写 语音识别 科大讯飞
133人阅读 评论(0) 收藏 举报
分类:
android集成科大讯飞语音听写和语音合成


        集成科大讯飞语音听写和语音合成,语音听写只是语音识别下面的一部分,别弄混淆了,由于科大讯飞暂未开放gradle引包方式,所以目前集成还是手动引包。我的流程是点击语音合成按钮然后播放语音,点击语音合成按钮说话然后识别出文字。

1、语音合成:文字转语音

2、语音听写:语音转文字,可以使用原生UI,也可以不使用,区别就是在于两者的监听方法不一样而已。

集成步骤:

一、下载语音听写和语音合成sdk包(离线语音是要收费的,所以选择在线语言)



二、sdk引入项目,androidstudio项目目录结构如图所示,我的是webview加载的h5界面发起的语音请求,就算是原生,思路也一样,做好动态权限,不然是没有权限的,如果只是测试那你去手动开启麦克风权限也可以,但是不是科学的办法

1、原libs下面的Msc.jar引入android libs下面

2、iflytek引入assets下面

3、原libs下面的除Msc.jar其他包引入android 的jniLibs下面

4、build.gradle依赖里面加入

//科大讯飞语音包
implementation files('libs/Msc.jar')
5、项目目录结构大致如下所示


三、加入权限,6.0之后需要做动态权限,不然只在清单文件里面申请是开启不了权限的。动态权限可以参考http://blog.csdn.net/u013144287/article/details/79298358这篇文章

<!--连接网络权限,用于执行云端语音能力 -->
<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" />

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

// 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
// 请勿在“=”与appid之间添加任何空字符或者转义符
SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");

五、语音合成和语音听写代码写法(代码直接写在一个工具类JavaScriptUtils里面,只不过是利用构造函数把activity的context传过来而已)

//语音听写对象
private SpeechRecognizer mAsr;
//语音合成对象
private SpeechSynthesizer mTts;
//语音识别动画效果
private RecognizerDialog iatDialog;
//存储所有的语音识别文字
private String voiceResult = "";


 /**
     * 语音合成 文字转声音
     */
    @JavascriptInterface
    public void speechSynthesizerVoice(String strTextToSpeech){
     //初始化语音合成
        mTts= SpeechSynthesizer.createSynthesizer(mContext, new InitListener() {
            @Override
            public void onInit(int i) {
                System.out.println("语音合成错误码:"+ i);
            }
        });
        mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//设置发音人
        mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速
        mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围0~100
        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
        mTts.startSpeaking(strTextToSpeech, mSynListener);
    }

    /**
     * 语音合成监听器
     */
    SynthesizerListener mSynListener = new SynthesizerListener(){
        //会话结束回调接口,没有错误时,error为null
        public void onCompleted(SpeechError error) {
            mHandler.sendEmptyMessage(6007);
        }
        //缓冲进度回调
        //percent为缓冲进度0~100,beginPos为缓冲音频在文本中开始位置,endPos表示缓冲音频在文本中结束位置,info为附加信息。
        public void onBufferProgress(int percent, int beginPos, int endPos, String info) {}
        //开始播放
        public void onSpeakBegin() {}
        //暂停播放
        public void onSpeakPaused() {}
        //播放进度回调
        //percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在文本中结束位置.
        public void onSpeakProgress(int percent, int beginPos, int endPos) {}
        //恢复播放回调接口
        public void onSpeakResumed() {}
        //会话事件回调接口
        public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {}
    };
    /**
     * 语音听写 声音转文字
     */
    @JavascriptInterface
    public void speechRecognizerVoice() {
    //初始化语音听写对象
        mAsr = SpeechRecognizer.createRecognizer(mContext, new InitListener() {
            @Override
            public void onInit(int i) {
                System.out.println("语音听写对象错误码" + i);
            }
        });
        //初始化语音UI
//        iatDialog = new RecognizerDialog(mContext, new InitListener() {
//            @Override
//            public void onInit(int i) {
//                System.out.println("语音ui" + i);
//            }
//        });
        // 清空参数
        mAsr.setParameter(SpeechConstant.PARAMS, null);
        // 设置听写引擎
        mAsr.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
        // 设置返回结果格式
        mAsr.setParameter(SpeechConstant.RESULT_TYPE, "json");
        // 设置语言
        mAsr.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        // 设置语言区域
        mAsr.setParameter(SpeechConstant.ACCENT, "mandarin");
        // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
        mAsr.setParameter(SpeechConstant.VAD_BOS,"5000");
        // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
        mAsr.setParameter(SpeechConstant.VAD_EOS,  "5000");
        //3.设置回调接口
//        iatDialog.setListener(new RecognizerDialogListener() {
//            @Override
//            public void onResult(RecognizerResult recognizerResult, boolean isLast) {
//                if (!isLast) {
//                    //解析语音
//                    String result = parseVoice(recognizerResult.getResultString());
//                    System.out.println("--------------------------------" + result);
//                }
//            }
//
//            @Override
//            public void onError(SpeechError speechError) {
//                System.out.println(speechError.getErrorCode() + "*******" + speechError.getErrorDescription());
//            }
//        });
//        //4.开始听写
//        iatDialog.show();

        mAsr.startListening(new RecognizerListener() {
            @Override
            public void onVolumeChanged(int i, byte[] bytes) {
                Message message = new Message();
                message.what = 6005;
                message.obj = i;
                mHandler.sendMessage(message);
            }

            @Override
            public void onBeginOfSpeech() {
                System.out.println("开始讲话");
            }

            @Override
            public void onEndOfSpeech() {
                System.out.println("结束讲话");
            }

            @Override
            public void onResult(RecognizerResult recognizerResult, boolean b) {
                if (!b) {
                    //解析语音
                    voiceResult = voiceResult + parseVoice(recognizerResult.getResultString());
                }else{
                    Message message = new Message();
                    message.what = 6006;
                    message.obj = voiceResult;
                    mHandler.sendMessage(message);
                }
            }

            @Override
            public void onError(SpeechError speechError) {

            }

            @Override
            public void onEvent(int i, int i1, int i2, Bundle bundle) {

            }
        });
    }

    /**
     * 取消语音识别
     */
    @JavascriptInterface
    public void cancelSpeechRecognizerVoice(){
        if(mAsr != null){
            mAsr.cancel();
        }
    }

    /**
     * 停止语音识别
     */
    @JavascriptInterface
    public void stopSpeechRecognizerVoice(){
        if(mAsr != null){
            mAsr.stopListening();
        }
    }

    /**
     * 解析语音json
     */
    public String parseVoice(String resultString) {
        Gson gson = new Gson();
        Voice voiceBean = gson.fromJson(resultString, Voice.class);

        StringBuffer sb = new StringBuffer();
        ArrayList<Voice.WSBean> ws = voiceBean.ws;
        for (Voice.WSBean wsBean : ws) {
            String word = wsBean.cw.get(0).w;
            sb.append(word);
        }
        return sb.toString();
    }

    /**
     * 语音对象封装
     */
    public class Voice {

        public ArrayList<WSBean> ws;

        public class WSBean {
            public ArrayList<CWBean> cw;
        }

        public class CWBean {
            public String w;
        }
    }

上面方法是提供给js调用的,这是h5才会这么干,不过思路差不多哈哈,语音听写里面注释的部分就是调用原生科大讯飞UI,测试时候调用起来是这样的



自此,也就集成成功了


查看评论

讯飞语音——带你简单实现语音听写

功能描述         语音听写和语音合成都是较为基础也是最常使用的两个基本功能。         语音合成是将文本转化为语音说出来,就是读文章。         语音听写是什么呢?        ...
  • niaonao
  • niaonao
  • 2016-10-02 16:59:06
  • 9334

讯飞语音开发之语音语音听写

语音听写是讯飞语音的一大组成部分,也是语音开发的一个主要部分。讯飞语音听写分为带ui界面的开发和不带ui界面开发,今天我们要说的是带ui界面的开发。 在开发之前我们需要将我们从讯飞语音开放平台下载的开...
  • sz0268
  • sz0268
  • 2016-06-13 13:59:39
  • 1312

讯飞语音的语音听写功能实现的总结以及新手如何着手第三方SDK

讯飞语音的语音听写功能实现的总结以及新手如何着手第三方SDK 前言 {才知道前言和序言的区别,写文章的好处,吱吱} 由于本人最近有点小忙,所以没有更新博客。其实呢!我想说的是我的草稿箱都快要...
  • pandayima
  • pandayima
  • 2017-08-08 00:38:19
  • 1238

使用讯飞语音的语音听写

准备在项目中使用语音搜索,讯飞语音SDK给了比较完整的案例,这里只用到了其中最简单的语音听写功能(语音转文字),正确率还是很高的。 下面是从SDK中抽出的测试代码: 准备工作参考讯飞开发平台:ht...
  • leokelly001
  • leokelly001
  • 2015-04-08 21:00:41
  • 3466

讯飞语音听写Demo

自从上次看了锤子M1发布会之后,一直对发布会上大放光彩的讯飞语音识别很感兴趣,最近正好有时间,便做了一个小Demo与大家分享一下。效果演示 下载SDK 导入SDK 添加用户权限 初始化 按钮监听 解析...
  • XX_CSDN_XX
  • XX_CSDN_XX
  • 2017-01-08 20:41:13
  • 940

科大讯飞语音服务-只含听写

科大讯飞语音服务-只含听写想要集成科大讯飞语音服务首先要在人家的平台上注册一个自己的开发者账号 科大讯飞语音-讯飞开放平台地址:http://www.xfyun.cn/?ch=bdtg进入地址之后要...
  • lanrenxiaowen
  • lanrenxiaowen
  • 2016-11-25 20:59:53
  • 767

AndroidStudio快速开发讯飞语音听写

AndroidStudio快速开发讯飞语音听写  好久没更新了,差点就忘记这个东东了,不过好在一闲下来就赶紧更新一波 哈哈^_^到科大讯飞官网注册账号并登陆,选择单个服务SDK下载 ,选择语音听...
  • shma1022
  • shma1022
  • 2017-01-16 09:10:07
  • 1488

语音听写与合成--(讯飞语音识别与合成&&百度语音识别)

目前比较厉害的国内免费开源的语音识别库主要就是:讯飞和百度,本篇博客也是关于这两家SDK的使用。 讯飞语音开放平台:http://doc.xfyun.cn/msc_android/299547 语音S...
  • g_ying_jie
  • g_ying_jie
  • 2017-07-06 11:43:10
  • 2037

Android科大讯飞语音听写实现

首先去讯飞平台注册一个应用,因为要用到APPID这个字符串。其实查看一下官方文档更好,每个接口都有很详细的准备工作和代码使用说明。链接:https://www.xfyun.cn/在这里我就把准备工作再...
  • qq_31573745
  • qq_31573745
  • 2017-04-04 10:42:54
  • 250
    个人资料
    持之以恒
    等级:
    访问量: 9万+
    积分: 1555
    排名: 3万+
    友情链接
    最新评论