一. 簡單介紹
在上一篇裏
http://blog.csdn.net/ichliebephone/archive/2010/08/10/5802044.aspx
我們簡單的介紹了Android裏的TTS功能並實現了一個最簡單的Demo例子--AndroidTTSDemoFirst,在這篇文章中我們將具體介紹用到的TTS API,並給上一個Demo增加語言選擇功能,可以使用TTS引擎支持的 English、 French 、 German 、 Italian 和 Spanish 這 5大語言來進行相應的語音合成,並用這 5 種外語向她說出“我愛你”。
二. 實例分析
我們希望做的效果如下:
圖1 實現效果圖
有了上一個例子做基礎,這個Demo比較好實現,主要是增加了一個語言選擇的控件Spinner,選擇不同的語言,就會用對應的語言表達“我愛你”。
接下來就邊實現這個Demo邊講解用到的TTS API。也是先創建一個Android工程,工程名爲AndroidTTSDemoSecond,其中SDK必須選擇1.6版本及以上。
其中Main.xml文件也還是很簡單,在前一個AndroidTTSDemoFirst例子的基礎上增加了一個Spinner控件, 如下所示:
Java文件的編寫:
因爲這個Demo例子只是在上一個AndroidTTSDemoFirst基礎上的增加,因此可以使用上一個編寫的java文件,只要把class名字改爲AndroidTTSDemoSecond,如下所示:
下面簡單介紹下上面代碼中和TTS相關的一些API使用。
首先是實現 OnInitListener 這個接口,這個接口中只有一個抽象函數 void onInit( int status) ,在 TextToSpeech 引擎初始化完成後調用,在這個函數裏就可以根據狀態 status(爲 TextToSpeech.SUCCESS 或者 TextToSpeech. Error )判斷TTS 初始化成功與否進行相應的操作。
接着在使用TTS 時,會先啓動一個 Activity 檢查 TTS 引擎需要的 TTS 數據是否已經安裝並且可用, checkIntent. setAction ( TextToSpeech .Engine. ACTION_CHECK_TTS_DATA );
這個 Activity會返回如下結果之一: CHECK_VOICE_DATA_PASS , CHECK_VOICE_DATA_FAIL , CHECK_VOICE_DATA_BAD_DATA , CHECK_VOICE_DATA_MISSING_DATA , 或者 CHECK_VOICE_DATA_MISSING_VOLUME .
只有第一個結果 CHECK_VOICE_DATA_PASS 表明 TTS數據可用,其他都是數據不可用的結果,可以啓動一個 Activity 去安裝需要的 TTS 數據,
dataIntent.setAction(TextToSpeech.Engine. ACTION_INSTALL_TTS_DATA );
當數據可用時,就可以創建一個TextToSpeech 實例,
public TextToSpeech ( Context context, TextToSpeech.OnInitListener listener)
這裏需要兩個參數,一個是 TTS 實例運行的 Context;
另一個是初始化接口的實現,在實例的創建過程中,如果TTS 引擎沒有運行的話,則會初始化 TTS 引擎,並且在初始化完成後調用其第二個參數 listener 。
有了 TextToSpeech實例,接下來就可以對文本進行語音合成併發音了,對應的 API爲
public int speak ( String text, int queueMode, HashMap < String , String > params)
這裏需要三個參數,第一個爲要合成的文本;
第二個爲使用 TTS隊列的方式,因爲使用TTS合成語音時需要時間,TTS引擎就會把還沒有輪到的部分放在其隊列中排隊,後來的內容有兩種使用隊列的方式: QUEUE_ADD 或者 QUEUE_FLUSH , QUEUE_ADD 表示把當前需要合成的內容添加到 TTS隊列的後面,等前面的都完成了後再輪到他, QUEUE_FLUSH 表示清除隊列中原有的內容,直接使 TTS引擎對當前內容進行語音合成,一般來說適合比較緊急的情況使用,但因爲在 Android 中可能不止你一個程序使用 TTS 引擎,因此爲了不破壞其他人的數據,建議使用 QUEUE_ADD 參數;
第三個爲鍵值對錶示的一個參數,我們後面再來介紹,目前可以使其爲 null 。
前半部分簡單的介紹了前一個Demo 用到的 API ,下半部分添加這個 Demo 中新的語言選擇部分。
首先爲 Spinner 控件 新增加兩個變量,
接着添加 Spinner 的使用,
和TTS 相關的部分是 Spinner 控件的 item selected事件的處理,
在選擇不同的 item時,爲 inputText 設置不同語言“我愛你”對應的文本,並且爲 TTS實例設置語言。
爲TTS 引擎設置語言的 API 爲
public int setLanguage ( Locale loc) ;
使用Locale 這個表示語言及國家區域的類來設置語言,目前支持 English、 French 、 German 、 Italian 和 Spanish 這 5大語言, 返回的結果爲
LANG_AVAILABLE , LANG_COUNTRY_AVAILABLE , LANG_COUNTRY_VAR_AVAILABLE , LANG_MISSING_DATA 和 LANG_NOT_SUPPORTED 。其中 LANG_MISSING_DATA 和 LANG_NOT_SUPPORTED 表示無法使用當前進行設置的語言,另外的幾個表示設置的語言有效。
至此,增加了語言選擇的新的Demo 完成了,程序運行後可以選擇不同的語言說出“我愛你”,簡單效果圖如下所示:
圖2 簡單效果圖
文章對應的完整代碼例子可以在這裏下載:
http://download.csdn.net/source/2611687
注:文章參加“ 首屆Google暑期大學生博客分享大賽——2010 Andriod篇”