1. 程式人生 > >接入高德 SDK 遇到的問題 01:語音導航中科大訊飛線上語音合成次數限制

接入高德 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次都沒有成功:

然後呢,這個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後還沒有出現什麼問題,不過高德+百度的組合…繼續觀察啦