科大訊飛離線語音合成簡單實例
訊飛語音開發集成地址http://www.xfyun.cn/
如何使用科大訊飛開放平臺的語音合成呢?
1.首先要註冊開發者賬戶, 創建我的新應用,創建完後就有一個專屬APPID(非常重要),添加我的應用 , 下載你所需要的sdk,這裏我們下載離線語音合成。注意:下載的sdk文件,都是自己創建的應用生成的,申請appid時就與自己的應用綁定了的。所以一定要使用自己下載的文件,appid的值也要使用自己的。
2.下載後將sdk解壓,將libs下的兩個jar包添加到libs目錄下(jar包還要右鍵 add to Libraries), 同路徑下的其它 .so文件(與c進行交互)複製到main路徑下新建的 jniLibs(L要大寫)目錄下, 將assert目錄拷貝到main目錄下,將res目錄下的tts文件複製到assert目錄下。並在你的繼承了Application的類中添加下圖的幾行代碼進行配置(appid的值寫自己註冊的)。這些文件的安放位置在我的項目中體現如下:
3.在MainActivity同目錄下創建類KqwSpeechSynthesizer,並創建類SoundTipUtil,再通過下圖方框圈出的代碼,即可實現在activity內進行語音合成的使用了。不妨試試!
KqwSpeechSynthesizer類的代碼如下:
-
import android.content.Context;
-
import android.os.Bundle;
-
import android.util.Log;
-
import android.widget.Toast;
-
import com.iflytek.cloud.ErrorCode;
-
import com.iflytek.cloud.InitListener;
-
import com.iflytek.cloud.SpeechConstant;
-
import com.iflytek.cloud.SpeechError;
-
import com.iflytek.cloud.SpeechSynthesizer;
-
import com.iflytek.cloud.SynthesizerListener;
-
import com.iflytek.cloud.util.ResourceUtil;
-
/**
-
* 語音合成器
-
*
-
* @author kongqw
-
*/
-
public class KqwSpeechSynthesizer {
-
// Log標籤
-
private static final String TAG = "KqwSpeechSynthesizer";
-
private Context mContext;
-
// 語音合成對象
-
private SpeechSynthesizer mTts;
-
public KqwSpeechSynthesizer(Context context) {
-
mContext = context;
-
// 初始化合成對象
-
mTts = SpeechSynthesizer.createSynthesizer(context, new InitListener() {
-
@Override
-
public void onInit(int code) {
-
Log.d(TAG, "InitListener init() code = " + code);
-
if (code != ErrorCode.SUCCESS) {
-
Toast.makeText(mContext, "初始化失敗,錯誤碼:" + code, Toast.LENGTH_SHORT).show();
-
}
-
}
-
});
-
}
-
/**
-
* 開始語音合成
-
*
-
* @param text
-
*/
-
public void start(String text) {
-
// 設置參數
-
setParam();
-
int code = mTts.startSpeaking(text, mTtsListener);
-
if (code != ErrorCode.SUCCESS) {
-
Toast.makeText(mContext, "語音合成失敗,錯誤碼: " + code, Toast.LENGTH_SHORT).show();
-
}
-
}
-
/**
-
* 合成回調監聽。
-
*/
-
private SynthesizerListener mTtsListener = new SynthesizerListener() {
-
@Override
-
public void onSpeakBegin() {
-
Log.i(TAG, "開始合成");
-
}
-
@Override
-
public void onSpeakPaused() {
-
Log.i(TAG, "暫停合成");
-
}
-
@Override
-
public void onSpeakResumed() {
-
Log.i(TAG, "繼續合成");
-
}
-
@Override
-
public void onBufferProgress(int percent, int beginPos, int endPos, String info) {
-
Log.i(TAG, "傳衝進度 :" + percent);
-
}
-
@Override
-
public void onSpeakProgress(int percent, int beginPos, int endPos) {
-
Log.i(TAG, "合成進度 : " + percent);
-
}
-
@Override
-
public void onCompleted(SpeechError error) {
-
if (error == null) {
-
Log.i(TAG, "合成完成");
-
} else if (error != null) {
-
Log.i(TAG, "error : " + error.toString());
-
}
-
}
-
@Override
-
public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
-
// TODO Auto-generated method stub
-
}
-
};
-
/**
-
* 參數設置
-
*
-
* @return
-
*/
-
private void setParam() {
-
// 清空參數
-
mTts.setParameter(SpeechConstant.PARAMS, null);
-
// 設置使用本地引擎
-
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
-
// 設置發音人資源路徑
-
mTts.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath());
-
// 設置發音人
-
mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");
-
// 設置語速
-
mTts.setParameter(SpeechConstant.SPEED, "50");
-
// 設置音調
-
mTts.setParameter(SpeechConstant.PITCH, "50");
-
// 設置音量
-
mTts.setParameter(SpeechConstant.VOLUME, "50");
-
// 設置播放器音頻流類型
-
mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
-
}
-
// 獲取發音人資源路徑
-
private String getResourcePath() {
-
StringBuffer tempBuffer = new StringBuffer();
-
// 合成通用資源
-
tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "tts/common.jet"));
-
tempBuffer.append(";");
-
// 發音人資源
-
tempBuffer.append(ResourceUtil.generateResourcePath(mContext, ResourceUtil.RESOURCE_TYPE.assets, "tts/xiaoyan.jet"));
-
return tempBuffer.toString();
-
}
-
}
SoundTipUtill類代碼如下:
-
import android.content.Context;
-
public class SoundTipUtil {
-
private static KqwSpeechSynthesizer kqwSpeechSynthesizer;
-
public static void soundTip(Context context,String text) {
-
kqwSpeechSynthesizer = new KqwSpeechSynthesizer(context);
-
kqwSpeechSynthesizer.start(text);
-
}
-
}
如果不是在activity內進行語音播報,那該咋辦?
按以下步驟即可實現:1.在繼承了Application的類中添加如下幾行代碼(圖1);
2.在非Activity類中調用方法即可(如圖2)