Android 讯飞语音播报-在线版

2019-09-29  本文已影响0人  九爺丶

前言

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

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

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

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();  //退出时释放
        }
    }
}

//初始化语音合成 在线使用讯飞科技  把以下"="号后面的"123456"更换成自己的APPID,千万不要删除"="号哦
 SpeechUtility.createUtility(this, SpeechConstant.APPID +"=123456");

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

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

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

  @Override
    protected void onDestroy() {
        super.onDestroy();
        TTSXFUtil.getInstance().release();
    }
上一篇下一篇

猜你喜欢

热点阅读