android tts語音使用的一些資料(轉)


  TextToSpeech簡稱 TTS,是Android 1.6版本中比較首要 的新功能。將所指定的文本轉成不同語言音頻輸出。它可以方便的嵌入到遊戲或者使用 程序中,增強用戶體驗。 

   在講解TTS API和將這項功能使用 到你的實際項目中的要領 之前,先對這套TTS引擎有個初步的明白 。 
對TTS資源的大體明白 : 
   TTS engine依託於當前Android Platform所支持的幾種首要 的語言:English、French、German、Italian和Spanish五大語言(暫時沒有咱們 偉大的中文,至少Google的科學家們還沒有把中文玩到爐火純青的地步,先易後難也是理所當然。)TTS可以將文本隨意的轉換成以上任意五種語言的語音輸出。與此同時,對於個別的語言版本將取決於不同的時區,例如:對於English,在TTS中可以分別輸出美式和英式兩種不同的版本(由此看出Google的做事風格真夠細緻,而正因爲如此估計Google不參加 中文的另外一種理由是中文的方言太多了)。 
能支持如此龐大的數據量,TTS 引擎對於資源的優化採取預加載的要領 。根據一系列的參數信息(參數的用法將在後邊有細緻 的推薦 )從庫中提取相應的資源,並加載到當前系統中。 
   儘管當前大部分加載有Android操作系統的裝備 都通過這套引擎來提供TTS功能,但由於一些裝備 的存儲空間特別 有限而影響到TTS無法 最大限度的發揮功能,算是當前的一個瓶頸。爲此,開發小組引入了檢測模塊,讓運用 這項技能 的使用 程序或者遊戲針對於不同的裝備 可以有相應的優化調整,從而防止 由於此項功能的限定 ,影響到整個使用 程序的運用 。比較穩妥的做法是讓用戶自行挑選 能無法 有足夠的空間或者需求來加載此項資源,下邊給出一個規則 的檢測要領 :

 

 Intent checkIntent = new Intent();          checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA;  startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); 

 

    假如 當前系統准許 建立 一個 “android.speech.tts.TextToSpeech” 的Object, 說明已經提供TTS功能的支持,將檢測返回結果中給出“CHECK_VOICE_DATA_PASS” 的標記。假如 系統不支持這項功能,那麼用戶可以挑選 能無法 加載這項功能,從而讓裝備 支持輸出多國語言的語音功能“Multi-lingual Talking”。“ACTION_INSTALL_TTS_DATA” intent將用戶引入Android market中的TTS下載界面。下載完成後將自動完成安裝,下邊是實現這一流程 的完整代碼 (androidres.com) :

 

 private TextToSpeech mTts;

 

Java代碼  收藏代碼
  1.  protected void onActivityResult( int requestCode, int resultCode, Intent data) {  
  2.  if (requestCode == MY_DATA_CHECK_CODE) {   
  3.        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS){   
  4. // success, create the TTS instance  
  5.  mTts = new TextToSpeech(thisthis);  
  6.         } else   
  7. // missing data, install it   
  8. Intent installIntent = new Intent();           

 

Java代碼  收藏代碼
  1.  installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);  
  2.  startActivity(installIntent);   
  3. }  
  4.  }   
  5. }   

 

 

TextToSpeech實體和OnInitListener都須要 引用當前Activity的Context作爲構造參數。OnInitListener()的用處是通知系統當前TTS Engine已經加載完成,並處於可用狀態。 
根據需求配置 語言參數: 
早在Google I/O大會上,官方給出了一段關於使用 這項功能的鮮活體驗,將翻譯結果直接通過五種不同國家語言的語音輸出。加載語言的要領 特別 基本 :
mTts.setLanguage(Locale.US); 
上邊代碼示意 當前TTS實體加載美式英語。其參數並沒有指示某種語言的名稱,而是運用 國家代碼來示意 ,這樣做的優點 是不但可以確定語言的挑選 ,而且可以根據地區的不同而有所區別。例如:英語作爲最廣泛被使用 的語種,在多個不同的地區都有一定的差別。判斷當前系統能無法 支持某個地區的語言資源,可以通過調用isLanguageAvailable()要領 的返回值,根據返回值的描述來挑選 正確的處理方式。讓使用 某些絢麗功能的使用 程序更加健壯,這個是貫穿整個開發流程 都要思慮 的技能 環節。下邊是一些使用 實例 (androidres.com) :
mTts.isLanguageAvailable(Locale.UK)) mTts.isLanguageAvailable(Locale.FRANCE)) mTts.isLanguageAvailable(new Locale("spa", "ESP"))) 
假如 返回值是 “TextToSpeech.LANG_COUNTRY_AVAILABLE” 說明所挑選 的地區被包含在當前TTS系統中。假如 系統中已經建立 了TTS實體,那麼可以運用 isLanguageAvailable()要領 來替代 Start“ACTION_CHECK_TTS_DATA” intent 檢測。當無法 找到任何可用資源匹配所指定的參數時,將會返回 “TextToSpeech.LANG_MISSING_DATA”的結果。下邊給出另外兩個返回其它不同狀態信息的例子:
mTts.isLanguageAvailable(Locale.CANADA_FRENCH)) mTts.isLanguageAvailable(new Locale("spa")) 
兩個語句的返回值均爲 “TextToSpeech.LANG_AVAILABLE” 。第一個是檢測當前系統能無法 支持加拿大法語,由於系統在資源庫中無法 找到這個地區的法語分支,其意思 是僅支持這項語言(法語),而不支持當前地區的語言分支。 
另外,相比於上面強制用戶使用 預定的語音配置 ,更加提倡運用 Locale.getDefault()要領 根據用戶默認的地區配置 來挑選 合適的語言庫。 
執行Speak的詳細 要領 : 
根據上邊的推薦 ,基本實現了TextToSpeech的原始 化和參數配置。下面是一個相關 鬧鐘的使用 實例,運用 Speak()要領 可以直接在使用 程序中發揮強悍 的語音功能。沒錯,用起來就是這麼基本 :

 

String myText1 = "This Translation is from androidRes.com"; String myText2 = "I hope so, because it's time to wake up."; mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null); mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null); 
TTS Engine的工作原理: 
每個獨立的使用 程序都可以單獨建立 一個TTS實體,而他們須要 執行的語音消息列隊(Queue)都統一由TTS Engine維護 和語音合成。


名詞解釋: 
synthesize
[?s?nθ?sa?z]DJ['s?nθ??sa?z]KK:to produce sounds, music or speech using electronic equipment (音響)合成 
utterances[??t?r?ns] DJ [??t?r?ns] KK:說話方式,語音/語調。


每個獨立的TTS實例維護 語音消息列隊請求的優先級和順序等。當引用 “TextToSpeech.QUEUE_FLUSH” 調用Speak()要領 時,會中斷當前實例正在運行的任務(也可以理會 爲清理 當前語音任務,轉而執行新的列隊任務)。引用 “TextToSpeech.QUEUE_ADD”標籤的發音任務將被添加到當前任務列隊之後。 
爲語音任務關聯Stream Type: 
在Android操作系統中所有的Audio Stream任務都是通過AudioManager類來實現,而它會針對不同的Stream Type來改動 語音的播放模式。StreamType可以理會 爲語音的播放屬性,這個屬性是用戶根據自己的須要 在系統中配置的使用 方案。假如 將語音任務都清楚的分門別類,可以方便的統一維護 相同類別任務的屬性。基於上一個Alarm Clock例子的基礎上,將Speak()要領 的結尾 一個Null參數替換成具有實際意思 的數值。這個參數的類型是HashMap,假如 期盼 將當前的Stream Type配置 爲系統中Alarm類型,對上一個例子稍作改動:
HashMap myHashAlarm = new HashMap(); myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm); mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm); 
使用 語音功能的Completion Callback: 
TTS中的Speak()的是異步調用,無論使用 QUEUE_FLUSH或者QUEUE_ADD作爲參數都可以通過定義Listener監聽當前任務的完成狀態。可以運用 這個要領 追加Speak()執行之後的一些額外操作。下接下來的例子中,當完成第二次Speak()要領 調用之後,運用 OnUtteranceCompletedListener接口來調用其它要領 :

 

mTts.setOnUtteranceCompletedListener(this); myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm); myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "end of wakeup message ID"); // myHashAlarm now contains two optional parameters mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm); 
下邊是定義Listener的代碼,類似與監聽按鈕或者其它View Events的要領 。在這裏將會把Speak()中HashMap參數傳進Listener中,作爲條件的判斷依據:
public void onUtteranceCompleted(String uttId) { if (uttId == "end of wakeup message ID") { playAnnoyingMusic(); } } 
“烘焙”當前實時的語音數據: 
看到烘焙兩個字,就會讓**想到香噴噴的麪包。軟件開發要重視 於能無法 可以最大限度的實現資源的複用,特別是針對資源有限的手機使用 平臺。那麼對於TTS這麼奢侈的使用 如何 才能更高效的運用 資源呢?這次一起來體驗比烘焙麪包更加讓人激動的功能,將TTS Engine輸出的Audio Stream作爲長久 的音頻文件保存在當前的存儲空間中(SDCard)。這樣可以對須要 重複播放的某些語音內容實現高速 的回放功能,從而實現國際倡導的“減排”目的,能省就省吧!在下邊的例子用通過TTS的synthesizeToFile要領 ,將合成的語音Stream保存在參數所指定的地址中。
HashMap myHashRender = new HashMap(); String wakeUpText = "Are you up yet?"; String destFileName = "/sdcard/myAppCache/wakeUp.wav"; myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText); mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName); 
當完成以上操作之後會收到系統的完成通知,同時可以像其它音頻資源一樣,通過android.media.MediaPlayer要領 來播放。但這有悖於TextToSpeech的使用 流程,可以將剛剛輸出的語音資源通過addSpeech()的要領 將其語音和文字描述一同存儲於TTS庫中。
mTts.addSpeech(wakeUpText, destFileName); 
在當前的TTS Instance中,任何運用 Speak()要領 執行相同內容的調用都將複用剛剛所生成的音頻文件。假如 資源丟失或者SDCard等存儲裝備 移除,那麼系統將再次通過TTS Engine合成所指定的語音內容。

 

mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm); 
回收TTS: 
當確定使用 程序不再須要 TTS的相關 功能後,可以在Activity的OnDestroy()要領 中調用shutDown()釋放當前TTS實體所佔用的資源。 
雜談: 
想必在你的腦袋中已經冒出好多可以很好運用 這個功能的Idea!那麼現在就停止想象,開始付諸於行動吧!無論是給手機用戶帶來方便,或是提高 遊戲體驗等。Let’s move! 
查看原文:Android官方Blog 

 

(出處:http://endual.iteye.com/blog/1545192

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章