百度离在线语音合成的快速集成
生活随笔
收集整理的這篇文章主要介紹了
百度离在线语音合成的快速集成
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1,注冊百度開發者賬號后下載離在線語音合成SDK到本地,然后在控制臺創建一個應用,以便獲取AppID,APIKey,SecretKey
?
2,將下載到本地的SDK中的jar,assets,.so下的文件全部拷貝到項目
?
3,拷貝下面的工具類到項目,然后將工具類中的APPID,apiKey,secretKey替換成第一步中我們拿到的
public class BaiduTtsUtil {private static final String TAG = BaiduTtsUtil.class.getSimpleName();private static BaiduTtsUtil instance = null;public static synchronized BaiduTtsUtil getInstance() {if (instance == null) {instance = new BaiduTtsUtil();}return instance;}// ================== 初始化參數設置開始 ==========================/*** 發布時請替換成自己申請的appId appKey 和 secretKey。注意如果需要離線合成功能,請在您申請的應用中填寫包名。* 本demo的包名是com.baidu.tts.sample,定義在build.gradle中。*/private String appId = "15623655";private String appKey = "gF2HcpHDqYH64UVcweUlpuXu";private String secretKey = "1j3qWQ2203kGS7f0YvOhGLrBxGhGSclP";// TtsMode.MIX; 離在線融合,在線優先; TtsMode.ONLINE 純在線; 沒有純離線 // private TtsMode ttsMode = TtsMode.ONLINE;private TtsMode ttsMode = TtsMode.MIX;// ================選擇TtsMode.ONLINE 不需要設置以下參數; 選擇TtsMode.MIX 需要設置下面2個離線資源文件的路徑private static final String TEMP_DIR = "/sdcard/baiduTTS"; // 重要!請手動將assets目錄下的3個dat 文件復制到該目錄// 請確保該PATH下有這個文件private static final String TEXT_FILENAME = TEMP_DIR + "/" + "bd_etts_text.dat";// 請確保該PATH下有這個文件 ,m15是離線男聲private static final String MODEL_FILENAME =TEMP_DIR + "/" + "bd_etts_common_speech_m15_mand_eng_high_am-mix_v3.0.0_20170505.dat";// ===============初始化參數設置完畢,更多合成參數請至getParams()方法中設置 =================private SpeechSynthesizer mSpeechSynthesizer;/*** 注意此處為了說明流程,故意在UI線程中調用。* 實際集成中,該方法一定在新線程中調用,并且該線程不能結束。具體可以參考NonBlockSyntherizer的寫法*/public void initTTs(Activity activity) {LoggerProxy.printable(true); // 日志打印在logcat中boolean isMix = ttsMode.equals(TtsMode.MIX);boolean isSuccess;if (isMix) {// 檢查2個離線資源是否可讀isSuccess = checkOfflineResources();if (!isSuccess) {return;} else {print("離線資源存在并且可讀, 目錄:" + TEMP_DIR);}}// 日志更新在UI中,可以換成MessageListener,在logcat中查看日志 // SpeechSynthesizerListener listener = new UiMessageListener(mainHandler);// 1. 獲取實例mSpeechSynthesizer = SpeechSynthesizer.getInstance();mSpeechSynthesizer.setContext(activity);// 2. 設置listener // mSpeechSynthesizer.setSpeechSynthesizerListener(listener);// 3. 設置appId,appKey.secretKeyint result = mSpeechSynthesizer.setAppId(appId);checkResult(result, "setAppId");result = mSpeechSynthesizer.setApiKey(appKey, secretKey);checkResult(result, "setApiKey");// 4. 支持離線的話,需要設置離線模型if (isMix) {// 檢查離線授權文件是否下載成功,離線授權文件聯網時SDK自動下載管理,有效期3年,3年后的最后一個月自動更新。isSuccess = checkAuth();if (!isSuccess) {return;}// 文本模型文件路徑 (離線引擎使用), 注意TEXT_FILENAME必須存在并且可讀mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, TEXT_FILENAME);// 聲學模型文件路徑 (離線引擎使用), 注意TEXT_FILENAME必須存在并且可讀mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, MODEL_FILENAME);}// 5. 以下setParam 參數選填。不填寫則默認值生效// 設置在線發聲音人: 0 普通女聲(默認) 1 普通男聲 2 特別男聲 3 情感男聲<度逍遙> 4 情感兒童聲<度丫丫>mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");// 設置合成的音量,0-9 ,默認 5mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9");// 設置合成的語速,0-9 ,默認 5mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5");// 設置合成的語調,0-9 ,默認 5mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);// 該參數設置為TtsMode.MIX生效。即純在線模式不生效。// MIX_MODE_DEFAULT 默認 ,wifi狀態下使用在線,非wifi離線。在線狀態下,請求超時6s自動轉離線// MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI wifi狀態下使用在線,非wifi離線。在線狀態下, 請求超時1.2s自動轉離線// MIX_MODE_HIGH_SPEED_NETWORK , 3G 4G wifi狀態下使用在線,其它狀態離線。在線狀態下,請求超時1.2s自動轉離線// MIX_MODE_HIGH_SPEED_SYNTHESIZE, 2G 3G 4G wifi狀態下使用在線,其它狀態離線。在線狀態下,請求超時1.2s自動轉離線mSpeechSynthesizer.setAudioStreamType(AudioManager.MODE_IN_CALL);// x. 額外 : 自動so文件是否復制正確及上面設置的參數Map<String, String> params = new HashMap<>();// 復制下上面的 mSpeechSynthesizer.setParam參數// 上線時請刪除AutoCheck的調用if (isMix) {params.put(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, TEXT_FILENAME);params.put(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, MODEL_FILENAME);} // InitConfig initConfig = new InitConfig(appId, appKey, secretKey, ttsMode, params, listener); // AutoCheck.getInstance(getApplicationContext()).check(initConfig, new Handler() { // @Override // /** // * 開新線程檢查,成功后回調 // */ // public void handleMessage(Message msg) { // if (msg.what == 100) { // AutoCheck autoCheck = (AutoCheck) msg.obj; // synchronized (autoCheck) { // String message = autoCheck.obtainDebugMessage(); // print(message); // 可以用下面一行替代,在logcat中查看代碼 // // Log.w("AutoCheckMessage", message); // } // } // } // // });// 6. 初始化result = mSpeechSynthesizer.initTts(ttsMode);checkResult(result, "initTts");}/*** 檢查 TEXT_FILENAME, MODEL_FILENAME 這2個文件是否存在,不存在請自行從assets目錄里手動復制** @return*/private boolean checkOfflineResources() {String[] filenames = {TEXT_FILENAME, MODEL_FILENAME};for (String path : filenames) {File f = new File(path);if (!f.canRead()) {print("[ERROR] 文件不存在或者不可讀取,請從assets目錄復制同名文件到:" + path);print("[ERROR] 初始化失敗!!!");return false;}}return true;}private void print(String message) {Log.i(TAG, message);}private void checkResult(int result, String method) {if (result != 0) {print("error code :" + result + " method:" + method + ", 錯誤碼文檔:http://yuyin.baidu.com/docs/tts/122 ");}}/*** 檢查appId ak sk 是否填寫正確,另外檢查官網應用內設置的包名是否與運行時的包名一致。本demo的包名定義在build.gradle文件中** @return*/private boolean checkAuth() {AuthInfo authInfo = mSpeechSynthesizer.auth(ttsMode);if (!authInfo.isSuccess()) {// 離線授權需要網站上的應用填寫包名。本demo的包名是com.baidu.tts.sample,定義在build.gradle中String errorMsg = authInfo.getTtsError().getDetailMessage();print("【error】鑒權失敗 errorMsg=" + errorMsg);return false;} else {print("驗證通過,離線正式授權文件存在。");return true;}}public void speak(String speakContent) {/* 以下參數每次合成時都可以修改* mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");* 設置在線發聲音人: 0 普通女聲(默認) 1 普通男聲 2 特別男聲 3 情感男聲<度逍遙> 4 情感兒童聲<度丫丫>* mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "5"); 設置合成的音量,0-9 ,默認 5* mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5"); 設置合成的語速,0-9 ,默認 5* mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5"); 設置合成的語調,0-9 ,默認 5** mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);* MIX_MODE_DEFAULT 默認 ,wifi狀態下使用在線,非wifi離線。在線狀態下,請求超時6s自動轉離線* MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI wifi狀態下使用在線,非wifi離線。在線狀態下, 請求超時1.2s自動轉離線* MIX_MODE_HIGH_SPEED_NETWORK , 3G 4G wifi狀態下使用在線,其它狀態離線。在線狀態下,請求超時1.2s自動轉離線* MIX_MODE_HIGH_SPEED_SYNTHESIZE, 2G 3G 4G wifi狀態下使用在線,其它狀態離線。在線狀態下,請求超時1.2s自動轉離線*/if (mSpeechSynthesizer == null) {print("[ERROR], 初始化失敗");return;}int result = mSpeechSynthesizer.speak(speakContent);print("合成并播放 按鈕已經點擊");checkResult(result, "speak");} }?
4,在項目中調用
先在onCreate中初始化:BaiduTtsUtil.getInstance().initTTs(this);
再去需要語音播報的地方調用播報:BaiduTtsUtil.getInstance().speak(speckContent);
?
?
OK!完成,就這么簡單。
總結
以上是生活随笔為你收集整理的百度离在线语音合成的快速集成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新型舰艇细节画面披露,今起举行舰艇开放日
- 下一篇: stc12串口收发计算机,半双工串口通信