隨着科技的不斷進步,人們對於可視化的需求越來越高。而對於導盲軟件、語音播報、語音輸入等應用,用戶對於聲音的需求甚至比對於圖像的需求還要重要。但是,如何讓應用說話,成為了很多開發者面臨的難題。Android TTS(即Android Text-To-Speech,中文意為文本轉語音)是Google Android團隊針對Android平台所提供的一種自然語言合成系統,它能夠將自然語言文本轉變成能夠被人類聽懂的語音信息。
一、TTS的基本原理
Android TTS是基於系統默認的TTS Engine。使用TTS Engine需要以下步驟:
1. 引入TTS Engine:需要在配置文件AndroidManifest.xml中添加以下配置信息
2. 創建TTS Engine對象:創建TTS Engine對象需要主要構造函數.
private TextToSpeech textToSpeech;
…
textToSpeech = new TextToSpeech(this, this);
3. 設置回調函數:為了實現TTS Engine的狀態監聽,需要設置回調函數.
@Override
public void onInit(int status) {
if(status == TextToSpeech.SUCCESS) {
textToSpeech.setOnUtteranceProgressListener(new TTSUtteranceProgressListener());
}
}
4. 文本轉語音:在完成TTS Engine的初始化工作後,就可以將文本轉變成語音信息了.
@Override
public void speak(String text) {
if(textToSpeech == null) {
return;
}
String utteranceId = hashCode() + “”;
HashMap params = new HashMap();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceId);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
} else {
textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, params);
}
}
二、TTS的使用場景
Android TTS應用場景非常之廣泛。其中的一個典型應用場景便是語音導航。通過將行進路線的信息和提醒內容轉換成語音,可以使司機在駕車時不用看路,直接聽取語音提示,使駕車更加安全。還有一種應用場景便是TTS播報內容。例如,當應用有新消息時,通過TTS播報內容,可以在用戶無視覺的情況下提醒用戶。
三、TTS的開發注意事項
1. 不同TTS Engine的API、回調函數都存在差異。需要注意調用對應的API。
2. 在初始化TTS Engine的時候,如果網絡不可用或者資源下載失敗等情況下,使用TTS Engine會出現空指針異常。因此在實現TTS Engine並使用前,應該對Android手機當前的網絡狀態以及下載耗時進行檢測,確保能夠正常使用TTS Engine。
3. 在使用TTS Engine時,會有一定的延遲,需要注意使用場景,避免出現較大的延遲。
四、TTS的完整代碼示例
public class TTSService extends Service implements TextToSpeech.OnInitListener { /** * TTS Engine對象 */ private TextToSpeech mTts; @Override public void onCreate() { super.onCreate(); mTts = new TextToSpeech(this, this); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY_COMPATIBILITY; } @Override public void onDestroy() { if (mTts != null) { mTts.stop(); mTts.shutdown(); } super.onDestroy(); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } /** * 播放語音 * @param text 文本 * @param utteranceId 語音ID */ public void playTalkText(String text, String utteranceId) { if (mTts == null) { return; } if (text.length() == 0) { return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId); } else { mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null); } } /** * TTS Engine初始化完成回調函數 * @param status 初始化狀態,成功時為TextToSpeech.SUCCESS */ @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { mTts.setLanguage(Locale.CHINA); mTts.setSpeechRate(0.8f); } } }
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/155057.html