首先,打開雲知聲開放平台
 
        
 
        添加新應用后,選擇Android,離線語音合成,點擊下載
 
        
 
        下載完成后,解壓壓縮包USCDemo文件夾
 
        打開USCDemo-->assets-->OfflineTTSModels,選擇復制2個文件(離線語音合成模型)到你項目中的assets資源目錄下
 
        打開USCDemo-->libs,復制jar包和.so文件到你的項目libs目錄下
 
        注意:需要在build.gradle增加如下圖所示代碼(注意層級),不然編譯時會報錯找不到.so文件(如下圖左上角箭頭修改項目結構為Project,然后找到在app目錄下的build.gradle文件進行修改)
 
        - repositories {
 - flatDir {
 - dir 'libs'
 - }
 - }
 
- sourceSets {
 - main {
 - jniLibs.srcDir 'libs'
 - }
 - }
 
做完以上准備工作,就可以開始擼代碼了
               
         首先,AndroidManifest.xml申請權限(6.0需要動態申請權限,礙於篇幅,請自行百度) 
        
 
        - <uses-permission android:name="android.permission.RECORD_AUDIO"/>
 - <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
 - <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
 - <uses-permission android:name="android.permission.INTERNET"/>
 - <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 - <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
 - <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
 - <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
 - <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
 - <uses-permission android:name="android.permission.READ_CONTACTS"/>
 - <uses-permission android:name="android.permission.WAKE_LOCK" />
 - <uses-permission android:name="android.permission.VIBRATE" />
 

- package com.cyf.ttsdemo.utils;
 - import android.content.Context;
 - import android.os.Environment;
 - import android.util.Log;
 - import com.cyf.ttsdemo.MyApplication;
 - import com.unisound.client.SpeechConstants;
 - import com.unisound.client.SpeechSynthesizer;
 - import com.unisound.client.SpeechSynthesizerListener;
 - import java.io.File;
 - import java.io.FileOutputStream;
 - import java.io.IOException;
 - import java.io.InputStream;
 - /**
 - * Created by As on 2017/8/7.
 - */
 - public class TTSUtils implements SpeechSynthesizerListener {
 - private static final String TAG = "TTSUtils";
 - private static volatile TTSUtils instance = null;
 - private boolean isInitSuccess = false;
 - private SpeechSynthesizer mTTSPlayer;
 - private static final String SAMPLE_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + "/unisound/tts/";
 - private static final String FRONTEND_MODEL = "frontend_model";
 - private static final String BACKEND_MODEL = "backend_lzl";
 - private static final String APPKEY = "wiouzjcsmxvqes7ibqqm5bcgqrzrvddsvtceiwa5";
 - private static final String SECRET = "3e20d7aff586ffe7dce62b302e7cc378";
 - private TTSUtils() {
 - }
 - public static TTSUtils getInstance() {
 - if (instance == null) {
 - synchronized (TTSUtils.class) {
 - if (instance == null) {
 - instance = new TTSUtils();
 - }
 - }
 - }
 - return instance;
 - }
 - public void init() {
 - Context context = MyApplication.getContext();
 - mTTSPlayer = new SpeechSynthesizer(context, APPKEY, SECRET);
 - mTTSPlayer.setOption(SpeechConstants.TTS_SERVICE_MODE, SpeechConstants.TTS_SERVICE_MODE_LOCAL); // 設置本地合成
 - File file = new File(SAMPLE_DIR);
 - if (!file.exists()) {
 - file.mkdirs();
 - }
 - File _FrontendModelFile = new File(SAMPLE_DIR + FRONTEND_MODEL);
 - if (!_FrontendModelFile.exists()) {
 - copyAssetsFile2SDCard(context, FRONTEND_MODEL, SAMPLE_DIR + FRONTEND_MODEL);
 - }
 - File _BackendModelFile = new File(SAMPLE_DIR + BACKEND_MODEL);
 - if (!_BackendModelFile.exists()) {
 - copyAssetsFile2SDCard(context, BACKEND_MODEL, SAMPLE_DIR + BACKEND_MODEL);
 - }
 - mTTSPlayer.setOption(SpeechConstants.TTS_KEY_FRONTEND_MODEL_PATH, SAMPLE_DIR + FRONTEND_MODEL);// 設置前端模型
 - mTTSPlayer.setOption(SpeechConstants.TTS_KEY_BACKEND_MODEL_PATH, SAMPLE_DIR + BACKEND_MODEL);// 設置后端模型
 - mTTSPlayer.setTTSListener(this);// 設置回調監聽
 - mTTSPlayer.init(null);// 初始化合成引擎
 - }
 - public void speak(String msg) {
 - if (isInitSuccess) {
 - mTTSPlayer.playText(msg);
 - }else {
 - init();
 - }
 - }
 - public void stop() {
 - mTTSPlayer.stop();
 - }
 - public void pause() {
 - mTTSPlayer.pause();
 - }
 - public void resume() {
 - mTTSPlayer.resume();
 - }
 - public void release() {
 - if (null != mTTSPlayer) {
 - // 釋放離線引擎
 - mTTSPlayer.release(SpeechConstants.TTS_RELEASE_ENGINE, null);
 - }
 - }
 - @Override
 - public void onEvent(int type) {
 - switch (type) {
 - case SpeechConstants.TTS_EVENT_INIT:
 - isInitSuccess = true;
 - break;
 - case SpeechConstants.TTS_EVENT_SYNTHESIZER_START:
 - // 開始合成回調
 - Log.i(TAG, "beginSynthesizer");
 - break;
 - case SpeechConstants.TTS_EVENT_SYNTHESIZER_END:
 - // 合成結束回調
 - Log.i(TAG, "endSynthesizer");
 - break;
 - case SpeechConstants.TTS_EVENT_BUFFER_BEGIN:
 - // 開始緩存回調
 - Log.i(TAG, "beginBuffer");
 - break;
 - case SpeechConstants.TTS_EVENT_BUFFER_READY:
 - // 緩存完畢回調
 - Log.i(TAG, "bufferReady");
 - break;
 - case SpeechConstants.TTS_EVENT_PLAYING_START:
 - // 開始播放回調
 - Log.i(TAG, "onPlayBegin");
 - break;
 - case SpeechConstants.TTS_EVENT_PLAYING_END:
 - // 播放完成回調
 - Log.i(TAG, "onPlayEnd");
 - break;
 - case SpeechConstants.TTS_EVENT_PAUSE:
 - // 暫停回調
 - Log.i(TAG, "pause");
 - break;
 - case SpeechConstants.TTS_EVENT_RESUME:
 - // 恢復回調
 - Log.i(TAG, "resume");
 - break;
 - case SpeechConstants.TTS_EVENT_STOP:
 - // 停止回調
 - Log.i(TAG, "stop");
 - break;
 - case SpeechConstants.TTS_EVENT_RELEASE:
 - // 釋放資源回調
 - Log.i(TAG, "release");
 - break;
 - default:
 - break;
 - }
 - }
 - @Override
 - public void onError(int type, String errorMSG) {
 - Log.e(TAG, "語音合成錯誤回調: " + errorMSG);
 - }
 - public static void copyAssetsFile2SDCard(Context context, String fileName, String path) {
 - try {
 - InputStream is = context.getAssets().open(fileName);
 - FileOutputStream fos = new FileOutputStream(new File(path));
 - byte[] buffer = new byte[1024];
 - int byteCount = 0;
 - while ((byteCount = is.read(buffer)) != -1) {// 循環從輸入流讀取buffer字節
 - fos.write(buffer, 0, byteCount);// 將讀取的輸入流寫入到輸出流
 - }
 - fos.flush();// 刷新緩沖區
 - is.close();
 - fos.close();
 - } catch (IOException e) {
 - Log.e(TAG, "copyAssetsFile2SDCard: " + e.toString());
 - }
 - }
 - }
 
 
             同樣的需要新建MyApplication.java進行預初始化離線語音合成功能 
        
 
        - package com.cyf.ttsdemo;
 - import android.app.Application;
 - import android.content.Context;
 - import com.cyf.ttsdemo.utils.TTSUtils;
 - /**
 - * Created by As on 2017/8/7.
 - */
 - public class MyApplication extends Application{
 - private static Context context;
 - @Override
 - public void onCreate() {
 - super.onCreate();
 - context = getApplicationContext();
 - TTSUtils.getInstance().init();
 - }
 - public static Context getContext(){
 - return context;
 - }
 - }
 
 
         好的,這樣就大功告成了,在需要進行語音合成的地方調用TTSUtils.getInstance().speak("xxx")即可

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