资源技术动态android集成科大讯飞语音听写和语音合成

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

2019-12-11 | |  59 |   0

原标题:android集成科大讯飞语音听写和语音合成

来源:CSDN博客       链接:https://blog.csdn.net/u013144287/article/details/79361639


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


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

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


集成步骤:


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

1576044748920133.png


二、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、项目目录结构大致如下所示

2018022414571598 .jpg

三、加入权限,6.0之后需要做动态权限,不然只在清单文件里面申请是开启不了权限的。动态权限可以参考

三、加入权限,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,测试时候调用起来是这样的

1576044986753881.jpg

————————————————

版权声明:本文为CSDN博主「演员赵诗绎」的原创文章

原文链接:https://blog.csdn.net/u013144287/article/details/79361639

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com  

上一篇:基于海康机器视觉算法平台的对位贴合项目个人理解 | CSDN原力计划

下一篇:深度学习于语音合成研究综述

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...