一. 簡單介紹
在上一篇裏
http://blog.csdn.net/ichliebephone/archive/2010/08/10/5802739.aspx
我們講到了TTS 最主要的一個API :
public int speak ( String text, int queueMode, HashMap < String , String > params)
其中我們介紹了前兩個參數,第三個參數設置了null ,並沒有具體介紹。
而且我們在介紹Android TTS 提供的功能時,說到TTS 提供了兩個接口,第一個初始化接口OnInitListener 我們已經使用過了,而第二個接口OnUtteranceCompletedListener 我們還沒有使用到。
首先我們就來簡單介紹一下這個接口的使用方式。TTS 引擎進行語音合成的每個語音片段叫做"utterance ", 而且在送給speak 函數進行語音合成時,可以爲這次的語音片段"utterance " 設置一個ID 。OnUtteranceCompletedListener 這個接口裏定義了一個回調函數,當設置了ID 的語音片段"utterance " 語音合成結束後就會調用這個回調函數。然後我們就可以在這回調函數裏進行我們需要的操作,比如在某個特定ID 的語音片段結束後播放音樂,或者跟蹤記錄哪些文本內容已經被朗讀等。
下面利用這個接口的功能完成一個Demo 例子,朗讀一段愛的表白,並且在程序退出後可以記住這次表白到哪了,下次在她再次打開程序時,就可以繼續這愛的表白。
二. 實例分析
我們希望做的效果如下:
圖1 實現效果圖
在界面上體現不出這個Demo 的特點,除了一長串英文的愛的表白外,還有一個Speak 按鈕。但當點擊了Speak 按鈕開始朗讀上面的表白後,在沒有讀完就退出程序後,下次再啓動後還會接着上次的繼續朗讀。
創建一個Android 工程,工程名爲AndroidTTSDemoThird, 其中SDK 必須選擇1.6 版本及以上。
其中Main.xml 文件很簡單,如下所示:
Java 文件的編寫:
這次要實現 OnInitListener 和 OnUtteranceCompletedListener 兩個接口
接着定義好下面要用到的幾個變量:
因爲通過前面的兩個 Demo ,我們知道已經安裝了 TTS 需要的數據,因此這裏我們可以在 onCreate 函數中直接創建一個 TextToSpeech 實例,
成功創建一個 TextToSpeech 後,就會調用接口 OnInitListener 中定義的回調函數
和前面的 Demo 相比,這裏多了一句 mTts .setOnUtteranceCompletedListener( this );
就是設置語音片段結束後的回調函數。
接着在 onCreate 函數中設置 EditText 和 Button 的使用:
在 SpeakBtn 的 onClick 事件中,先把輸入框中的內容按 ',' 和 '.' 分割成一個個短的部分並保存在字符串數組中,然後調用我們寫的 speakText() 函數來進行朗讀。
speakText() 函數的定義如下:
lastUtterance 變量保存上一個語音片段的 ID , params 是 HashMap<String, String> 類型,鍵值對形式的變量,在這裏我們的鍵 name 爲 TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID ,是一個 UTTERANCE_ID ,值 value 爲 String.valueOf(i) ,其實只要是任何字符串變量都行,爲了方便我們設置的爲有順序的數字。然後把這個鍵值對變量添加給 speak 函數, TTS 引擎就會在這個語音片段朗讀結束後通知我們,調用設置好的回調函數 onUtteranceCompleted(String utteranceId) ,這個回調函數的內容如下:
很簡單,主要就是把當前剛結束的這個語音片段 ID--utteranceId 保存到 lastUtterance 變量中,這樣在程序退出時,我們就可以保存這個變量,
首先是釋放 TTS 資源,然後把 lastUtterance 變量的值以鍵值對的方式保存在系統中,這樣下次啓動程序時 lastUtterance 就可以從系統中讀取上次退出時保存的值。在 onCreate 函數中添加獲取保存的 lastUtterance 代碼:
至此,這個 Demo 完成了,運行後點擊 Speak 按鈕會朗讀文本框中的經典的愛的表白,一小段一小段朗讀,每朗讀完一小段程序都會調用回調函數 onUtteranceCompleted 記錄剛朗讀完的那個小段的 ID ,當所有的表白沒朗讀完就按返回退出程序時,程序在 onDestroy() 裏把記錄着的片段 ID 保存在系統中,這樣下次再次打開程序時就可以接着上次繼續這愛的表白。
注:文章參加“ 首屆Google暑期大學生博客分享大賽——2010 Andriod篇”