1.下载官网demo后倒入此jar包放入lib下

Android 13 语音通话权限 安卓手机语音权限设置_android

2.在main目录下导入相对应的so文件

Android 13 语音通话权限 安卓手机语音权限设置_初始化_02

3.添加权限,权限可按自己需求而定

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

 

4.同步项目   并进行初始化操作

private void initKDXF() {
        SpeechUtility.createUtility(this, SpeechConstant.APPID + "=APPID");
    }

5.放入语音播报的语音文件(语音文件在官网demo里面附带可自行搜索)

注:免费的

Android 13 语音通话权限 安卓手机语音权限设置_Android 13 语音通话权限_03

 6.在相对应的播报页面进行播报

private void initTTS() {

     SpeechSynthesizer  mTts = SpeechSynthesizer.createSynthesizer(this, mTtsInitListener);

        if (mTts != null) {
            mTts.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath());
            mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaofeng"); // 设置发音人
            mTts.setParameter(SpeechConstant.SPEED, "1");// 设置语速
            mTts.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围 0~100
            mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
            //这里出现的问题是因为多次进入语音播报页面会导致语音未播报,只是稍微简单处理一下
            boolean speaking = mTts.isSpeaking();
            ToastUtils.showShort(speaking + "");
            if (speaking) {
                if (mTts != null) {
                    mTts.pauseSpeaking();
                    mTts.stopSpeaking();
                    mTts.destroy();
                }

                mTts1 = SpeechSynthesizer.createSynthesizer(this, mTtsInitListener);
                mTts1.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath());
                mTts1.setParameter(SpeechConstant.VOICE_NAME, "xiaofeng"); // 设置发音人
                mTts1.setParameter(SpeechConstant.SPEED, "1");// 设置语速
                mTts1.setParameter(SpeechConstant.VOLUME, "80");// 设置音量,范围 0~100
                mTts1.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
                mTts1.startSpeaking("需要播报的文字", new MySynthesizerListener());
            } else {
                mTts.startSpeaking("需要播报的文字"", new MySynthesizerListener());
           
            }
        }

    }

6.1获取发言人资源方法

//获取发音人资源路径
    private String getResourcePath() {
        StringBuffer tempBuffer = new StringBuffer();
        String type = "tts";
        if (mEngineType.equals(SpeechConstant.TYPE_XTTS)) {
            type = "xtts";
        }
        //合成通用资源
        tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, type + "/common.jet"));
        tempBuffer.append(";");
        //发音人资源
        if (mEngineType.equals(SpeechConstant.TYPE_XTTS)) {
            tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, type + "/" + LeaveDatailsActivity.voicerXtts + ".jet"));
        } else {
            tempBuffer.append(ResourceUtil.generateResourcePath(this, ResourceUtil.RESOURCE_TYPE.assets, type + "/" + LeaveDatailsActivity.voicerLocal + ".jet"));
        }

        return tempBuffer.toString();
    }

6.2初始化监听操作

/**
     * 初始化监听。
     */
    private InitListener mTtsInitListener = new InitListener() {
        @Override
        public void onInit(int code) {
            LogUtil.e("InitListener init() code = " + code);
            if (code != ErrorCode.SUCCESS) {
                LogUtil.e("初始化失败,错误码:" + code + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");

            } else {
                // 初始化成功,之后可以调用startSpeaking方法
                // 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,
                // 正确的做法是将onCreate中的startSpeaking调用移至这里
            }
        }
    };

 

6.3使用的相对应的全局变量

// 引擎类型
    private String mEngineType = SpeechConstant.TYPE_CLOUD;
    public static String voicerXtts = "xiaofeng";
    // 默认本地发音人
    public static String voicerLocal = "xiaofeng";
    private SpeechSynthesizer mTts;
    private SpeechSynthesizer mTts1;

 

 7.最后只需要在播报页面相对应的生命周期里加入和SpeechSynthesizer相对应的生命周期即可

例:

@Override
    protected void onResume() {
        super.onResume();
        if (mTts != null) {
            mTts.resumeSpeaking();
        }
        if (mTts1 != null) {
            mTts1.resumeSpeaking();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mTts != null) {
            mTts.pauseSpeaking();
        }
        if (mTts1 != null) {
            mTts1.pauseSpeaking();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mTts1 != null) {
            if (mTts != null) {
                mTts.stopSpeaking();
            }
            mTts1.stopSpeaking();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
     
        if (mTts != null) {
            mTts.destroy();
        }
        if (mTts1 != null) {
            mTts1.destroy();
        }
    }

大致就是这个样子,其他的请默认移步官网