雲知聲語音合成SDK的用法


首先,打開雲知聲開放平台

 

然后,注冊、登錄(圖略)

接着打開我的應用,添加新應用,選擇通用解決方案

添加新應用后,選擇Android,離線語音合成,點擊下載

下載完成后,解壓壓縮包USCDemo文件夾

打開USCDemo-->assets-->OfflineTTSModels,選擇復制2個文件(離線語音合成模型)到你項目中的assets資源目錄下

打開USCDemo-->libs,復制jar包和.so文件到你的項目libs目錄下

注意:需要在build.gradle增加如下圖所示代碼(注意層級),不然編譯時會報錯找不到.so文件(如下圖左上角箭頭修改項目結構為Project,然后找到在app目錄下的build.gradle文件進行修改)

[html]  view plain  copy
 
  1. repositories {  
  2.     flatDir {  
  3.         dir 'libs'  
  4.     }  
  5. }  
[html]  view plain  copy
 
  1. sourceSets {  
  2.     main {  
  3.         jniLibs.srcDir 'libs'  
  4.     }  
  5. }  

做完以上准備工作,就可以開始擼代碼了

     首先,AndroidManifest.xml申請權限(6.0需要動態申請權限,礙於篇幅,請自行百度)
[html]  view plain  copy
 
  1. <uses-permission android:name="android.permission.RECORD_AUDIO"/>  
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
  3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>  
  4. <uses-permission android:name="android.permission.INTERNET"/>  
  5. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
  7. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />  
  8. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
  9. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
  10. <uses-permission android:name="android.permission.READ_CONTACTS"/>  
  11. <uses-permission android:name="android.permission.WAKE_LOCK" />  
  12. <uses-permission android:name="android.permission.VIBRATE" />  
    然后,直接封裝成工具類,以供全局調用離線語音合成功能,大家可以直接復制進去用,其中APPKEY和SECRET在開放平台-->我的應用,點擊你之前添加的應用可查看

[java]  view plain  copy
 
  1. package com.cyf.ttsdemo.utils;  
  2.   
  3. import android.content.Context;  
  4. import android.os.Environment;  
  5. import android.util.Log;  
  6.   
  7. import com.cyf.ttsdemo.MyApplication;  
  8. import com.unisound.client.SpeechConstants;  
  9. import com.unisound.client.SpeechSynthesizer;  
  10. import com.unisound.client.SpeechSynthesizerListener;  
  11.   
  12. import java.io.File;  
  13. import java.io.FileOutputStream;  
  14. import java.io.IOException;  
  15. import java.io.InputStream;  
  16.   
  17. /** 
  18.  * Created by As on 2017/8/7. 
  19.  */  
  20.   
  21. public class TTSUtils implements SpeechSynthesizerListener {  
  22.   
  23.     private static final String TAG = "TTSUtils";  
  24.     private static volatile TTSUtils instance = null;  
  25.     private boolean isInitSuccess = false;  
  26.     private SpeechSynthesizer mTTSPlayer;  
  27.   
  28.     private static final String SAMPLE_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + "/unisound/tts/";  
  29.     private static final String FRONTEND_MODEL = "frontend_model";  
  30.     private static final String BACKEND_MODEL = "backend_lzl";  
  31.   
  32.     private static final String APPKEY = "wiouzjcsmxvqes7ibqqm5bcgqrzrvddsvtceiwa5";  
  33.     private static final String SECRET = "3e20d7aff586ffe7dce62b302e7cc378";  
  34.   
  35.     private TTSUtils() {  
  36.     }  
  37.   
  38.     public static TTSUtils getInstance() {  
  39.         if (instance == null) {  
  40.             synchronized (TTSUtils.class) {  
  41.                 if (instance == null) {  
  42.                     instance = new TTSUtils();  
  43.                 }  
  44.             }  
  45.         }  
  46.         return instance;  
  47.     }  
  48.   
  49.     public void init() {  
  50.         Context context = MyApplication.getContext();  
  51.         mTTSPlayer = new SpeechSynthesizer(context, APPKEY, SECRET);  
  52.         mTTSPlayer.setOption(SpeechConstants.TTS_SERVICE_MODE, SpeechConstants.TTS_SERVICE_MODE_LOCAL); // 設置本地合成  
  53.     File file = new File(SAMPLE_DIR);  
  54.         if (!file.exists()) {  
  55.             file.mkdirs();  
  56.         }  
  57.         File _FrontendModelFile = new File(SAMPLE_DIR + FRONTEND_MODEL);  
  58.         if (!_FrontendModelFile.exists()) {  
  59.             copyAssetsFile2SDCard(context, FRONTEND_MODEL, SAMPLE_DIR + FRONTEND_MODEL);  
  60.         }  
  61.         File _BackendModelFile = new File(SAMPLE_DIR + BACKEND_MODEL);  
  62.         if (!_BackendModelFile.exists()) {  
  63.             copyAssetsFile2SDCard(context, BACKEND_MODEL, SAMPLE_DIR + BACKEND_MODEL);  
  64.         }  
  65.         mTTSPlayer.setOption(SpeechConstants.TTS_KEY_FRONTEND_MODEL_PATH, SAMPLE_DIR + FRONTEND_MODEL);// 設置前端模型  
  66.         mTTSPlayer.setOption(SpeechConstants.TTS_KEY_BACKEND_MODEL_PATH, SAMPLE_DIR + BACKEND_MODEL);// 設置后端模型  
  67.         mTTSPlayer.setTTSListener(this);// 設置回調監聽  
  68.         mTTSPlayer.init(null);// 初始化合成引擎  
  69.     }  
  70.   
  71.     public void speak(String msg) {  
  72.         if (isInitSuccess) {  
  73.             mTTSPlayer.playText(msg);  
  74.         }else {  
  75.             init();  
  76.         }  
  77.     }  
  78.   
  79.     public void stop() {  
  80.         mTTSPlayer.stop();  
  81.     }  
  82.   
  83.     public void pause() {  
  84.         mTTSPlayer.pause();  
  85.     }  
  86.   
  87.     public void resume() {  
  88.         mTTSPlayer.resume();  
  89.     }  
  90.   
  91.     public void release() {  
  92.         if (null != mTTSPlayer) {  
  93.             // 釋放離線引擎  
  94.             mTTSPlayer.release(SpeechConstants.TTS_RELEASE_ENGINE, null);  
  95.         }  
  96.     }  
  97.   
  98.     @Override  
  99.     public void onEvent(int type) {  
  100.         switch (type) {  
  101.             case SpeechConstants.TTS_EVENT_INIT:  
  102.                 isInitSuccess = true;  
  103.                 break;  
  104.             case SpeechConstants.TTS_EVENT_SYNTHESIZER_START:  
  105.                 // 開始合成回調  
  106.                 Log.i(TAG, "beginSynthesizer");  
  107.                 break;  
  108.             case SpeechConstants.TTS_EVENT_SYNTHESIZER_END:  
  109.                 // 合成結束回調  
  110.                 Log.i(TAG, "endSynthesizer");  
  111.                 break;  
  112.             case SpeechConstants.TTS_EVENT_BUFFER_BEGIN:  
  113.                 // 開始緩存回調  
  114.                 Log.i(TAG, "beginBuffer");  
  115.                 break;  
  116.             case SpeechConstants.TTS_EVENT_BUFFER_READY:  
  117.                 // 緩存完畢回調  
  118.                 Log.i(TAG, "bufferReady");  
  119.                 break;  
  120.             case SpeechConstants.TTS_EVENT_PLAYING_START:  
  121.                 // 開始播放回調  
  122.                 Log.i(TAG, "onPlayBegin");  
  123.                 break;  
  124.             case SpeechConstants.TTS_EVENT_PLAYING_END:  
  125.                 // 播放完成回調  
  126.                 Log.i(TAG, "onPlayEnd");  
  127.                 break;  
  128.             case SpeechConstants.TTS_EVENT_PAUSE:  
  129.                 // 暫停回調  
  130.                 Log.i(TAG, "pause");  
  131.                 break;  
  132.             case SpeechConstants.TTS_EVENT_RESUME:  
  133.                 // 恢復回調  
  134.                 Log.i(TAG, "resume");  
  135.                 break;  
  136.             case SpeechConstants.TTS_EVENT_STOP:  
  137.                 // 停止回調  
  138.                 Log.i(TAG, "stop");  
  139.                 break;  
  140.             case SpeechConstants.TTS_EVENT_RELEASE:  
  141.                 // 釋放資源回調  
  142.                 Log.i(TAG, "release");  
  143.                 break;  
  144.             default:  
  145.                 break;  
  146.         }  
  147.     }  
  148.   
  149.     @Override  
  150.     public void onError(int type, String errorMSG) {  
  151.         Log.e(TAG, "語音合成錯誤回調: " + errorMSG);  
  152.     }  
  153.   
  154.     public static void copyAssetsFile2SDCard(Context context, String fileName, String path) {  
  155.         try {  
  156.             InputStream is = context.getAssets().open(fileName);  
  157.             FileOutputStream fos = new FileOutputStream(new File(path));  
  158.             byte[] buffer = new byte[1024];  
  159.             int byteCount = 0;  
  160.             while ((byteCount = is.read(buffer)) != -1) {// 循環從輸入流讀取buffer字節  
  161.                 fos.write(buffer, 0, byteCount);// 將讀取的輸入流寫入到輸出流  
  162.             }  
  163.             fos.flush();// 刷新緩沖區  
  164.             is.close();  
  165.             fos.close();  
  166.         } catch (IOException e) {  
  167.             Log.e(TAG, "copyAssetsFile2SDCard: " + e.toString());  
  168.         }  
  169.     }  
  170.   
  171. }  


    同樣的需要新建MyApplication.java進行預初始化離線語音合成功能
[java]  view plain  copy
 
  1. package com.cyf.ttsdemo;  
  2.   
  3. import android.app.Application;  
  4. import android.content.Context;  
  5.   
  6. import com.cyf.ttsdemo.utils.TTSUtils;  
  7.   
  8. /** 
  9.  * Created by As on 2017/8/7. 
  10.  */  
  11.   
  12. public class MyApplication extends Application{  
  13.   
  14.     private static Context context;  
  15.   
  16.     @Override  
  17.     public void onCreate() {  
  18.         super.onCreate();  
  19.         context = getApplicationContext();  
  20.         TTSUtils.getInstance().init();  
  21.     }  
  22.   
  23.     public static Context getContext(){  
  24.         return context;  
  25.     }  
  26. }  
    最后,別忘了在AndroidManifest.xml文件中注冊該Application
    好的,這樣就大功告成了,在需要進行語音合成的地方調用TTSUtils.getInstance().speak("xxx")即可

    注意:離線語音合成因為需要復制文件到SD卡中,所以初始化是比較耗時的,這就有可能造成有一些情況:初始化還未完成,但調用了語音合成方法沒有聲音的情況,而我在代碼中並未處理,所以有遇到類似情況的,可以自己琢磨處理一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM