美文网首页
Android 讯飞语音播报-在线版

Android 讯飞语音播报-在线版

作者: 九爺丶 | 来源:发表于2019-09-29 13:50 被阅读0次

    前言

    • 讯飞语音播报分为在线版和离线版,离线版是收费的,且费用稍贵。但是在线语音合成是免费的(有每日限额)。这里我们提供在线版SDK集成流程。

    • 讯飞语音科技官网

    • 在线语音合成文档

    一、首先需要到官网去创建一个应用,获取对应的APPID、APISecret和APIKey

    • 1.如图一:选中语音合成-在线语音合成(流式版)


      图一:控制台应用信息
    • 2.导入SDK
      在控制台应用管理中找到SDK下载。(文章对应的SDK版本 2019年06月18日 版本号:1138)
      图二:下载SDK
      下载完SDK后解压,并找到libs目录里的so库和Msc.jar包,复制你需要的so库架构都自己工程下的app\src\main\jniLibsMsc.jar拷贝到自己工程的app\libs目录中。
    • 3.在工程 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"/>
    <!--外存储写权限,构建语法需要用到此权限 -->
    <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" />
    
    • 注意:打包发布正式版前,需要加入防混淆配置*
    -keep class com.iflytek.**{*;}
    -keepattributes Signature
    
    • 完成以上步骤后,sync下项目,等待同步完成。

    *## 以下代码可以直接复制到项目里使用, 支持队列顺序播放

    import android.os.Bundle;
    import com.iflytek.cloud.ErrorCode;
    import com.iflytek.cloud.InitListener;
    import com.iflytek.cloud.SpeechConstant;
    import com.iflytek.cloud.SpeechError;
    import com.iflytek.cloud.SpeechSynthesizer;
    import com.iflytek.cloud.SynthesizerListener;
    import com.jsgtkj.life.MyApplication;
    import java.util.LinkedList;
    import java.util.Queue;
    
    /**
     * @author : GuoQiang
     * e-mail : 849199845@qq.com
     * time   : 2019/09/07  10:37
     * desc   : 讯飞语音科技
     * version: 1.0
     */
    public class TTSXFUtil {
        private static volatile TTSXFUtil ttsUtil = null;
        private SpeechSynthesizer mTts;
        private boolean isInitSuccess = false;
        //此处需要将语音添加到队列,保证一条播放完再播放下一条
        //必须第一次收到消息才能在这播放,以后每次收到消息将消息添加到队列,每次播放完后去队列里面取;
        private static Queue<String> queue = new LinkedList<>();
    
        public TTSXFUtil() {
        }
    
        public static TTSXFUtil getInstance() {
            if (ttsUtil == null) {
                synchronized (TTSXFUtil.class) {
                    if (ttsUtil == null) {
                        ttsUtil = new TTSXFUtil();
                    }
                }
            }
            return ttsUtil;
        }
    
        public void init(String msg) {
            mTts = SpeechSynthesizer.createSynthesizer(MyApplication.getInstance(), new MyInitListener(msg));
            initSpeechSynthesizer();
        }
        private void initSpeechSynthesizer(){
            if (mTts!=null) {
                mTts.setParameter(SpeechConstant.PARAMS, null);
                mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
                mTts.setParameter(SpeechConstant.SPEED, "60");//速度
                mTts.setParameter(SpeechConstant.PITCH, "50");//语调
                mTts.setParameter(SpeechConstant.VOLUME, "50");//音量
                mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);   //引擎类型
                mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");//设置播放合成音频打断音乐播放,默认为true
                //mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflyket.pcm");    //声音文件地址
            }
        }
    
        private class MyInitListener implements InitListener {
            private String msg;
    
            public MyInitListener(String msg) {
                this.msg = msg;
            }
            @Override
            public void onInit(int code) {
                if (code == ErrorCode.SUCCESS) {
                    isInitSuccess=true;
                    XLog.d("语音初始化成功:" + code);
                    // 初始化成功,之后可以调用startSpeaking方法
                    // 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,
                    // 正确的做法是将onCreate中的startSpeaking调用移至这里
                    speak(msg);
                } else {
                    XLog.d("语音初始化失败,错误码:" + code);
                }
            }
        };
    
        public void speak(String msg) {
            if (mTts!=null&&isInitSuccess) {
                queue.offer(msg);
                if (!mTts.isSpeaking()) {
                    //stop();
                    mTts.startSpeaking(queue.poll(), synthesizerListener);
                }
            } else {
                init(msg);
            }
        }
    
        public void stop() {
            mTts.stopSpeaking();
        }
    
        private SynthesizerListener synthesizerListener = new SynthesizerListener() {
            @Override
            public void onSpeakBegin() {
    
            }
    
            @Override
            public void onBufferProgress(int i, int i1, int i2, String s) {
    
            }
    
            @Override
            public void onSpeakPaused() {
    
            }
    
            @Override
            public void onSpeakResumed() {
    
            }
    
            @Override
            public void onSpeakProgress(int percent, int beginPos, int endPos) {
    
            }
    
            @Override
            public void onCompleted(SpeechError error) {
                if (error == null) {
                    if (!queue.isEmpty()) {
                        mTts.startSpeaking(queue.poll(), synthesizerListener);
                    }
                } else {
                    XLog.i(error.getPlainDescription(true));
                }
            }
    
            @Override
            public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
                // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
                // 若使用本地能力,会话id为null
                //  if (SpeechEvent.EVENT_SESSION_ID == eventType) {
                //      String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
                //      Log.d(TAG, "session id =" + sid);
                //  }
            }
        };
    
        public void pause() {
            mTts.pauseSpeaking();
        }
    
        public void resume() {
            mTts.resumeSpeaking();
        }
    
        public void release() {
            if (null != mTts) {
                mTts.stopSpeaking();
                mTts.destroy();  //退出时释放
            }
        }
    }
    
    
    • 使用方法:
      1.在Application中初始化
    //初始化语音合成 在线使用讯飞科技  把以下"="号后面的"123456"更换成自己的APPID,千万不要删除"="号哦
     SpeechUtility.createUtility(this, SpeechConstant.APPID +"=123456");
    

    2.在需要使用播放的地方调用

      TTSXFUtil.getInstance().speak("欢迎使用讯飞科技在线语音播放");
    

    3.使用完毕后不要忘记释放

      @Override
        protected void onDestroy() {
            super.onDestroy();
            TTSXFUtil.getInstance().release();
        }
    
    • 至此,讯飞在线语音合成完成

    相关文章

      网友评论

          本文标题:Android 讯飞语音播报-在线版

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