一. ? 基礎知識
TextToSpeech ? 簡稱? ? TTS ? , ? 稱為語音合成, ? 是 ? Android? ? 從 ? 1.6版本 ? 開始支持 ? 的新功能 ? ,能 ? 將所指定的文本轉成不同語言音頻輸出。
在具體介紹前我們先來看下Adnroid系統帶的TTS設置界面,點擊Settings->Speech?synthesis,如下圖所示:
圖?1?Android?TTS設置界面
??? 當點擊“Listen?to?an?example”時,會發出“ This?is?an?example?of?speech?synthesis?in?English. ? ”,如果沒有安裝 ? TTS?Data的話可以點擊第二項安裝,在? Default?settings ?可以設置? Speech?rate ?和? Language ?,如下圖? 2 ?所示可以知道? TTS ?支持的語言。
圖 2?TTS ?語言選擇
??? 如果勾選“ Always?use?my?settings ?”時要注意,設置了這個選項后那么我們就不能在程序中對 speech?rate ?和? Languages ?進行設置了,這里的設置回覆蓋我們程序中的設置。
TTS功能需要有TTS?Engine的支持,下面我們就來了解下android提供的TTS?Engine。
Android使用了叫Pico的支持多種語言的語音合成引擎,Pico在后臺負責把分析輸入的文本,把分本分成他能識別的各個片段,再把合成的各個語音片段以聽起來比較自然的方式連接在一起,這個過程Android系統幫我們做,我們只把他當做一個神奇的過程就可以了。
TTS?engine 依托于當前 ?Android?Platform? 所支持的幾種主要的語言: ?English? 、 ?French? 、 ?German? 、 ?Italian? 和 Spanish? 五大語言 ? (暫時也是沒有對中文提供支持)。 ? TTS 可以將文本隨意的轉換成以上任意五種語言的語音輸出。與此同時,對于個別的語言版本將取決于不同的時區,例如:對于 ?English? ,在 ?TTS? 中可以分別輸出美式和英式兩種不同的版本 ? 。
二. ? 實例分析
下面我們先做一個具體的實例來親自體會一下Android的TTS的效果。
我們做一個簡單的輸入英文句子然后朗讀出來的例子,了解Android的TTS使用方法。
在具體做之前給個AndroidTTS的API的鏈接,
http://androidappdocs.appspot.com/reference/android/speech/tts/package-summary.html
可以先看下大概了解TTS提供的功能。
圖3?Android?TTS?API
可以看到TTS提供了兩個接口和兩個類。
我們希望做的效果如下:
圖4?實現效果圖
上面一個輸入框,點擊Speak按鈕則朗讀上面的文字內容。
創建一個Android工程,工程名為AndroidTTSDemoFirst,其中SDK必須選擇1.6版本及以上。
其中Main.xml文件很簡單,如下所示:
?
- <? xml ? version = "1.0" ? encoding = "utf-8" ?> ??
- < LinearLayout ? xmlns:android = "http://schemas.android.com/apk/res/android" ??
- ???? android:orientation = "vertical" ??
- ???? android:layout_width = "fill_parent" ??
- ???? android:layout_height = "fill_parent" ??
- ???? > ??
- ???? < EditText ? android:id = "@+id/inputText" ???
- ???????????????? android:hint = "Input?the?text?here!" ???
- ???????????????? android:layout_width = "fill_parent" ???
- ???????????????? android:layout_height = "wrap_content" > ??
- ???????????????? </ EditText > ??
- ???? < Button ? android:text = "Speak" ???
- ???????????????? android:id = "@+id/speakBtn" ???
- ???????????????? android:layout_width = "wrap_content" ???
- ???????????????? android:layout_height = "wrap_content" ??
- ???????????????? android:layout_gravity = "center_horizontal" ??
- ???????????????? android:enabled = "false" ??
- ???????????????? > </ Button > ??
- </ LinearLayout > ??
?
Java文件的編寫:
要使用TTS得實現OnInitListener接口
?
- public ? class ?AndroidTTSDemoFirst? extends ?Activity? implements ?OnInitListener?{??
- ???? /**?Called?when?the?activity?is?first?created.?*/ ??
- ???? @Override ??
- ???? public ? void ?onCreate(Bundle?savedInstanceState)?{??
- ???????? super .onCreate(savedInstanceState);??
- ????????setContentView(R.layout.main);??
- ????}??
- ?? //實現TTS初始化接口 ??
- ???? @Override ??
- ???? public ? void ?onInit( int ?status)?{??
- ???????? //?TODO?Auto-generated?method?stub ??
- ??????????
- ????}??
- }??
?
接著定義好下面要用到的幾個變量:
?
- private ?EditText?inputText?=? null ;??
- private ?Button?speakBtn?=? null ;??
- ??? private ? static ? final ? int ?REQ_TTS_STATUS_CHECK?=? 0 ;??
- ??? private ? static ? final ?String?TAG?=? "TTS?Demo" ;??
- private ?TextToSpeech?mTts;??
?
雖然安裝Android1.6版本及之后的Android機器都默認安裝了TTS引擎,但某些設備可能會因為存儲容量的限制而缺少安裝和語言對應的資源文件,因此在使用TTS前,得先要檢查是否安裝了TTS語言數據,在onCreate函數中添加以下內容:
?
- //檢查TTS數據是否已經安裝并且可用 ??
- ??Intent?checkIntent?=? new ?Intent();??
- ??checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);??
- ??startActivityForResult(checkIntent,?REQ_TTS_STATUS_CHECK);??
?
這里啟動一個新的Intent去檢查TTS數據是否已經安裝,我們根據其返回的結果進行處理,如下所示:
?
- protected ?? void ?onActivityResult( int ?requestCode,? int ?resultCode,?Intent?data)?{??
- ???????? if (requestCode?==?REQ_TTS_STATUS_CHECK)??
- ????????{??
- ???????????? switch ?(resultCode)?{??
- ???????????? case ?TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:??
- ???????????????? //這個返回結果表明TTS?Engine可以用 ??
- ????????????{??
- ????????????????mTts?=? new ?TextToSpeech( this ,? this );??
- ????????????????Log.v(TAG,? "TTS?Engine?is?installed!" );??
- ??????????????????
- ????????????}??
- ??????????????????
- ???????????????? break ;??
- ???????????? case ?TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:??
- ???????????????? //需要的語音數據已損壞 ??
- ???????????? case ?TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:??
- ???????????????? //缺少需要語言的語音數據 ??
- ???????????? case ?TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:??
- ???????????????? //缺少需要語言的發音數據 ??
- ????????????{??
- ???????????????? //這三種情況都表明數據有錯,重新下載安裝需要的數據 ??
- ????????????????Log.v(TAG,? "Need?language?stuff:" +resultCode);??
- ????????????????Intent?dataIntent?=? new ?Intent();??
- ????????????????dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);??
- ????????????????startActivity(dataIntent);??
- ??????????????????
- ????????????}??
- ???????????????? break ;??
- ???????????? case ?TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:??
- ???????????????? //檢查失敗 ??
- ???????????? default :??
- ????????????????Log.v(TAG,? "Got?a?failure.?TTS?apparently?not?available" );??
- ???????????????? break ;??
- ????????????}??
- ????????}??
- ???????? else ??
- ????????{??
- ???????????? //其他Intent返回的結果 ??
- ????????}??
- ????????}??
?
如果返回CHECK_VOICE_DATA_PASS表示檢查成功,可以新建一個 ? TextToSpeech ? ,否則就去下載 ? TTS數據。
當TTS數據檢測成功創建一個TextToSpeech后,就會調用接口OnInitListener中定義的回調函數
?
- ? //實現TTS初始化接口 ??
- @Override ??
- public ? void ?onInit( int ?status)?{??
- ???? //?TODO?Auto-generated?method?stub ??
- ???? //TTS?Engine初始化完成 ??
- ???? if (status?==?TextToSpeech.SUCCESS)??
- ????{??
- ???????? int ?result?=?mTts.setLanguage(Locale.US);??
- ???????? //設置發音語言 ??
- ???????? if (result?==?TextToSpeech.LANG_MISSING_DATA?||?result?==?TextToSpeech.LANG_NOT_SUPPORTED)??
- ???????? //判斷語言是否可用 ??
- ????????{??
- ????????????Log.v(TAG,? "Language?is?not?available" );??
- ????????????speakBtn.setEnabled( false );??
- ????????}??
- ???????? else ??
- ????????{??
- mTts.speak( "This?is?an?example?of?speech?synthesis." ,?TextToSpeech.QUEUE_ADD,? null );??
- ????????????speakBtn.setEnabled( true );??
- ????????}??
- ????}??
- ??????
- }??
?
在這個回調函數里,我們設置語言,然后就可以進行使用 ? TTS引擎進行操作了。
創建一個TextToSpeech是需要占用資源的,因此我們要適時的釋放這個資源:
?
- @Override ??
- protected ? void ?onPause()?{??
- ???? //?TODO?Auto-generated?method?stub ??
- ???? super .onPause();??
- ???? if (mTts?!=? null )??
- ???????? //activity暫停時也停止TTS ??
- ????{??
- ????????mTts.stop();??
- ????}??
- }??
- ??
- @Override ??
- protected ? void ?onDestroy()?{??
- ???? //?TODO?Auto-generated?method?stub ??
- ???? super .onDestroy();??
- ???? //釋放TTS的資源 ??
- ????mTts.shutdown();??
- ????}??
?
最后,在onCreate函數中設置 ? EditText和Button的使用:
?
- ?????inputText?=?(EditText)findViewById(R.id.inputText);??
- ?????speakBtn?=?(Button)findViewById(R.id.speakBtn);??????????
- ??inputText.setText( "This?is?an?example?of?speech?synthesis." );??
- ?????speakBtn.setOnClickListener( new ?OnClickListener()?{??
- ??
- public ? void ?onClick(View?v)?{??
- ???? //?TODO?Auto-generated?method?stub ??
- ????mTts.speak(inputText.getText().toString(),?TextToSpeech.QUEUE_ADD,? null );??
- ???? //朗讀輸入框里的內容 ??
- }??
- });??
?
至此,我們的 ? Demo就完成了,當啟動程序后,首先會朗讀“ This?is?an?example?of?speech?synthesis?in?English. ? ”,然后你在EditText中輸入內容,點擊Speak按鈕就能把內容給朗讀出來。
文章對應的完整代碼例子可以在這里下載:
http://download.csdn.net/source/2610740
注:文章參加“
?首屆Google暑期大學生博客分享大賽——2010 Andriod篇
”
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
