需求:采用高德导航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总是下载到一半就断掉了,下载了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
/**
* 百度离在线语音合成初始化
*/
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);
}
/**
* 导航播报信息回调函数
*/
@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后还没有出现什么问题,不过高德+百度的组合…继续观察啦