一.語音合成是什麼
語音合成也就是TextToSpeech,簡稱TTS,即把文本轉換成語音的意思。安卓系統自帶TTS引擎,默認爲Pico引擎,如下圖所示:
可惜的是Pico引擎不支持中文, 你也可以裝上支持中文的第三方引擎,比如著名的科大訊飛,然後在在默認引擎那裏把它勾選上,就可以了。
二. 實現語音合成
1.我們先用系統自帶的TTS來實現吧.
代碼很簡單,創建一個TextToSpeech對象,先初始化配置,然後調用speak方法,傳入三個參數就可以了,第一個參數爲文本內容,第二個爲發音模式,第三個傳null即可.
// 實例並初始化TTS對象
mTextToSpeech = new TextToSpeech(this,new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
// 設置朗讀語言
int supported = mTextToSpeech.setLanguage(Locale.ENGLISH);
if ((supported != TextToSpeech.LANG_AVAILABLE)
&& (supported != TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
Toast.makeText(MainActivity.this, "不支持當前語言",0).show();
}
}
}
});
調用speak方法
//朗讀
mTextToSpeech.speak(content,TextToSpeech.QUEUE_FLUSH, null);
2.使用科大訊飛實現
先去科大訊飛SDK官網創建應用,然後下載在線語音合成SDK,導入工程,進行一些配置。詳細可以去查官網.
主要代碼如下:
SpeechUtility.createUtility(context, SpeechConstant.APPID + "=571dd0b9");
// 1.創建SpeechSynthesizer對象, 第二個參數:本地合成時傳InitListener
SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(context,
null);
// 2.合成參數設置,詳見《科大訊飛MSC API手冊(Android)》SpeechSynthesizer 類
mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");// 設置發音人
mTts.setParameter(SpeechConstant.SPEED, "50");// 設置語速
mTts.setParameter(SpeechConstant.VOLUME, "80");// 設置音量,範圍0~100
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); // 設置雲端
// 設置合成音頻保存位置(可自定義保存位置),保存在“./sdcard/iflytek.pcm”
// 保存在SD卡需要在AndroidManifest.xml添加寫SD卡權限
// 如果不需要保存合成音頻,註釋該行代碼
mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
// 3.開始合成
mTts.startSpeaking(content, mSynListener);
需要傳入一個合成監聽器SynthesizerListener對象,可以監聽開始播放、暫停播放等事件.
// 合成監聽器
private SynthesizerListener mSynListener = new SynthesizerListener() {
// 會話結束回調接口,沒有錯誤時,error爲null
public void onCompleted(SpeechError error) {
}
// 緩衝進度回調
// percent爲緩衝進度0~100,beginPos爲緩衝音頻在文本中開始位置,endPos表示緩衝音頻在文本中結束位置,info爲附加信息。
public void onBufferProgress(int percent, int beginPos, int endPos,
String info) {
}
// 開始播放
public void onSpeakBegin() {
}
// 暫停播放
public void onSpeakPaused() {
}
// 播放進度回調
// percent爲播放進度0~100,beginPos爲播放音頻在文本中開始位置,endPos表示播放音頻在文本中結束位置.
public void onSpeakProgress(int percent, int beginPos, int endPos) {
}
// 恢復播放回調接口
public void onSpeakResumed() {
}
// 會話事件回調接口
public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
}
};
這樣就可以了。科大訊飛語音SDK還有很多功能,有興趣的朋友可以去看看。
這是我自己做的Demo截圖:
附上Demo下載地址:點擊打開鏈接