TTS實現(xiàn)方案
實現(xiàn)TTS有大體上有兩種方案:
-
1.使用系統(tǒng)內(nèi)置的TTS
- 優(yōu)點:集成簡單,免費,google語音引擎對于外語支持友好,中文也還不錯
- 缺點:擴展性相對來說低一點,只用于語音合成(文字轉(zhuǎn)語音),需要設(shè)備安裝語音引擎并在系統(tǒng)設(shè)置中設(shè)置默認(rèn)
-
2.集成第三方的SDK如百度語音、訊飛語音等
- 優(yōu)點:隨應(yīng)用一起部署,功能可擴展性強(語音合成,語音聽寫,喚醒詞)
- 缺點:集成相對來說復(fù)雜,收費,國際化問題,國內(nèi)的一些語音方案目前對于外語的支持并不是很好
系統(tǒng)內(nèi)置TTS集成
1.安裝語音引擎并在設(shè)置為默認(rèn)TTS
原生Android系統(tǒng)自帶了一個Pico TTS引擎,但不支持中文;國產(chǎn)手機大部分中默認(rèn)裝了訊飛TTS引擎
下載安裝后,打開無障礙進(jìn)行設(shè)置

設(shè)置

無障礙

TTS輸出
2.代碼中集成
這里提供一個工具類TtsManager.java,直接使用或參考
public class TtsManager {
private TtsManager() {
}
private static class SingletonHoler {
public static final TtsManager INSTANCE = new TtsManager();
}
public static TtsManager getInstance() {
return SingletonHoler.INSTANCE;
}
private TextToSpeech mSpeech;
private boolean mIsInited;
private UtteranceProgressListener mSpeedListener;
public void init() {
destory();
mSpeech = new TextToSpeech(MyApp.getInstance(), status -> {
if (status == TextToSpeech.SUCCESS) {
int result = mSpeech.setLanguage(Locale.getDefault());
// mSpeech.setPitch(1.0f); // 設(shè)置音調(diào)
// mSpeech.setSpeechRate(1.5f); // 設(shè)置語速
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
//語音合成初始化失敗,不支持語種
mIsInited = false;
} else {
mIsInited = true;
}
mSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
//======語音合成 Start
if (mSpeedListener != null)
mSpeedListener.onStart(utteranceId);
}
@Override
public void onDone(String utteranceId) {
//======語音合成 Done
if (mSpeedListener != null)
mSpeedListener.onDone(utteranceId);
}
@Override
public void onError(String utteranceId) {
//======語音合成 Error
if (mSpeedListener != null)
mSpeedListener.onError(utteranceId);
}
});
}
});
}
public void setSpeechListener(UtteranceProgressListener listener) {
this.mSpeedListener = listener;
}
public boolean speakText(String text) {
if (!mIsInited) {
//語音合成失敗,未初始化成功
init();
return false;
}
if (mSpeech != null) {
int result = mSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, "");
return result == TextToSpeech.SUCCESS;
}
return false;
}
public void stop() {
if (mSpeech != null && mSpeech.isSpeaking()) {
mSpeech.stop();
}
}
public boolean isSpeaking() {
if (mSpeech == null)
return false;
return mSpeech.isSpeaking();
}
public void destory() {
if (mSpeech != null) {
mSpeech.stop();
mSpeech.shutdown();
}
}
}
使用
//在應(yīng)用啟動時初始化一次
TtsManager.getInstance().init();
//在需要使用的地方調(diào)用
TtsManager.getInstance().speakText("需要合成的內(nèi)容");
第三方SDK集成
具體集成步驟請看其官網(wǎng)集成文檔