接入高德 SDK 遇到的问题 01:语音导航中科大讯飞在线语音合成次数限制

需求:采用高德导航SDK实现路线导航,并且实现语音播报导航
问题:高德导航语音合成开发指南中,建议采用的科大讯飞在线语音合成存在次数限制,远远达不到生产环境的需求量
解决:采用百度离在线语音识别 Android SDK

一、科大讯飞语音合成使用次数有限

高德导航语音合成开发指南中,建议采用的科大讯飞在线语音合成,兼容性好,且使用简单,查看高德导航demo,在接入科大讯飞在线语音合成SDK后,只要一行代码就能实现语音合成播放:

@Override
    public void onGetNavigationText(String s) {
        amapTTSController.onGetNavigationText(s);
    }

当然得先初始化:

        // 科大讯飞在线语音合成初始化
        // SpeechUtils.getInstance(this).speakText();系统自带的语音播报
        amapTTSController = AmapTTSController.getInstance(getApplicationContext());
        amapTTSController.init();

但是存在次数限制:

Dear:
  感谢您致信和支持讯飞开放平台!
  是的,您的应用集成上线前需要提交审核,审核通过后可提额到2万次/日的交互次数。
  祝您工作愉快~

远远不够本公司产品的需求量,买套餐又有点小贵,没办法只能使用第三方的语音合成SDK。

二、百度语音合成无限制

应用需要先在百度云平台进行注册,后添加相关功能:

其实是有初始次数限制的,但只要申请提高配额,就可以无限制合成:

三、接入百度离在线语音识别SDK

这里有个问题,离在线语音识别SDK总是下载到一半就断掉了,下载了N次都没有成功:

只能去社区提问:
离在线融合SDK 不能下载 http://ai.baidu.com/forum/topic/show/497323

然后找到了这个下载地址:
http://bos.nj.bpc.baidu.com/v1/audio/Baidu-TTS-Android-2.3.2-2017-12-28.zip

然后呢,这个demo的SDK版本都没有我在百度 github上找到的百度语音示例demo版本新:

不过还好,我还沉浸于“机智的我居然想到去github找”的成就感中,没有发飙:
https://github.com/baidu/speech-samples

接入流程:百度语音文档中心 + 百度语音示例demo

1、引入jar包

2、引入库文件

3、设置权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

4、百度离在线语音合成初始化

    /**
     * 百度离在线语音合成初始化
     */
    private void initialTts() {
        this.mSpeechSynthesizer = SpeechSynthesizer.getInstance();
        this.mSpeechSynthesizer.setContext(this);
        this.mSpeechSynthesizer.setSpeechSynthesizerListener(this);

        // TODO 选择TtsMode.ONLINE 不需要设置以下参数; 选择TtsMode.MIX 需要设置下面2个离线资源文件的路径
        // TODO 因为离线功能需要手动将assets目录下的3个dat文件复制到该目录,大大增加了app大小,所以建议不采用
        // 文本模型文件路径 (离线引擎使用), 注意TEXT_FILENAME必须存在并且可读
        // this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, mSampleDirPath + "/" + TEXT_MODEL_NAME);
        // 声学模型文件路径 (离线引擎使用), 注意TEXT_FILENAME必须存在并且可读
        // this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, mSampleDirPath + "/" + SPEECH_FEMALE_MODEL_NAME);
        // 本地授权文件路径,如未设置将使用默认路径.设置临时授权文件路径,LICENCE_FILE_NAME请替换成临时授权文件的实际路径,仅在使用临时license文件时需要进行设置,如果在[应用管理]中开通了正式离线授权,不需要设置该参数,建议将该行代码删除(离线引擎)
        // 如果合成结果出现临时授权文件将要到期的提示,说明使用了临时授权文件,请删除临时授权即可。
        // 临时授权文件。目前SDK会自动下载正式授权文件。正式授权文件有效期3年,并在最后一个月SDK自动更新下载授权文件。
        // this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_LICENCE_FILE, mSampleDirPath + "/" + LICENSE_FILE_NAME);
        // 请替换为语音开发者平台上注册应用得到的App ID (离线授权)
        this.mSpeechSynthesizer.setAppId("10611756");
        // 请替换为语音开发者平台注册应用得到的apikey和secretkey (在线授权)
        this.mSpeechSynthesizer.setApiKey("DxQms5tV0PK0GPxPi7MxUvOi", "4xkoLSQOrfICDRmHqSmURFkPQVIx24TH");
        // 发音人(在线引擎),可用参数为0,1,2,3。。。(服务器端会动态增加,各值含义参考文档,以文档说明为准。0--普通女声,1--普通男声,2--特别男声,3--情感男声。。。)
        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");
        // 设置Mix模式的合成策略(MIX_MODE_DEFAULT:WIFI下在线优先;MIX_MODE_HIGH_SPEED_NETWORK:WIFI 4G 3G 2G下在线优先)
        // 如果在线连接百度服务器失败或者超时6s,那么切换成离线合成。
        this.mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_HIGH_SPEED_NETWORK);

        // 授权检测接口(只是通过AuthInfo进行检验授权是否成功。)
        // AuthInfo接口用于测试开发者是否成功申请了在线或者离线授权,如果测试授权成功了,可以删除AuthInfo部分的代码(该接口首次验证时比较耗时),不会影响正常使用(合成使用时SDK内部会自动验证授权)
        // 检查合成服务是否开通,如果只需要检查在线合成服务,使用 TtsMode.ONLINE
        /*AuthInfo authInfo = this.mSpeechSynthesizer.auth(TtsMode.ONLINE);
        if (authInfo.isSuccess()) {
            Toast.makeText(this, "语音合成成功", Toast.LENGTH_SHORT).show();
        } else {
            String errorMsg = authInfo.getTtsError().getDetailMessage();
            Toast.makeText(this, "语音合成成失败 errorMsg=" + errorMsg, Toast.LENGTH_SHORT).show();
        }*/

        // 初始化tts
        // 初始化离在线混合模式,如果只需要在线合成功能,使用 TtsMode.ONLINE
        // TtsMode.ONLINE 纯在线,断网即不可使用,TtsMode.MIX 离在线混合,断网或者网络请求超时使用离线。
        mSpeechSynthesizer.initTts(TtsMode.ONLINE);
    }

5、语音播报

    /**
     * 导航播报信息回调函数
     */
    @Override
    public void onGetNavigationText(String s) {
        /*
        * 如果需要合成后立即播放的请调用speak方法,如果只需要合成请调用synthesize方法
        * 该接口线程安全,可以重复调用。内部采用排队策略,调用后将自动加入队列,SDK会按照队列的顺序进行合成及播放。
        * 注意需要合成的每个文本text不超过1024的GBK字节,即512个汉字或英文字母数字。超过请自行按照句号问号等标点切分,调用多次合成接口。
        * 调用这两个方法后,SDK会回调 SpeechSynthesizerListener 中的 onSynthesizeDataArrived 方法
        * */
        mSpeechSynthesizer.speak(s);
        Log.v("GetNavigationText导航信息", s);
    }

ps:接入百度语音SDK后还没有出现什么问题,不过高德+百度的组合…继续观察啦

猜你喜欢

转载自blog.csdn.net/zeqiao/article/details/78952446
今日推荐