android 科大讯飞语音播报简单集成

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

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

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里面附带可自行搜索)

注:免费的

 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();
        }
    }

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Unity中使用科大讯飞语音的过程中,有一些常见问题需要注意。首先,关于路径的问题,需要确保ivw_res_path路径中不包含中文字符,否则会报错10102。此外,路径中的斜杠需要替换为反斜杠,否则也会报错10102。\[1\] 其次,关于QIVWAudioWrite接口需要调用两次的问题,这是因为在写入音频数据时,需要先调用一次MSP_AUDIO_SAMPLE_CONTINUE表示音频数据的中间部分,然后再调用一次MSP_AUDIO_SAMPLE_LAST表示音频数据的最后一部分。这样做是为了确保音频数据的完整性。\[2\] 最后,关于QIVWRegisterNotify接口后面需要使用Sleep的问题,这是因为在注册通知后,需要给科大讯飞语音一些时间来处理注册的操作。使用Sleep函数可以暂停程序的执行,让科大讯飞语音有足够的时间来完成注册。具体的等待时间可以根据实际情况进行调整。\[2\] 总结起来,在Unity中使用科大讯飞语音时,需要注意路径中不包含中文字符,斜杠需要替换为反斜杠;在写入音频数据时,需要调用两次接口来表示音频数据的中间部分和最后一部分;在注册通知后,需要使用Sleep函数给科大讯飞语音足够的时间来完成注册操作。 #### 引用[.reference_title] - *1* *2* [Unity 科大讯飞语音唤醒](https://blog.csdn.net/weixin_42208093/article/details/107364588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值