接入高德 SDK 遇到的問題 01:語音導航中科大訊飛線上語音合成次數限制
阿新 • • 發佈:2019-01-29
需求:採用高德導航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次都沒有成功:
然後呢,這個demo的SDK版本都沒有我在百度 github上找到的百度語音示例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後還沒有出現什麼問題,不過高德+百度的組合…繼續觀察啦