Android TTS 實(shí)戰(zhàn)二:全世界都知道我愛(ài)你
1.簡(jiǎn)介
實(shí)戰(zhàn)而建立在實(shí)戰(zhàn)一的基礎(chǔ)上,只加了一個(gè) Spinner ,給上一個(gè) Demo 增加語(yǔ)言選擇功能,可以使用 TTS 引擎支持的English、French、German、Italian和Spanish這5大語(yǔ)言來(lái)進(jìn)行相應(yīng)的語(yǔ)音合成,并用這5種外語(yǔ)向她說(shuō)出“我愛(ài)你”。讓全世界都知道我愛(ài)你~-~wlh
2.實(shí)例
xml布局代碼
Java代碼
package?com.example.androidttsdemo2; import?java.util.Locale; import?android.app.Activity; import?android.content.Intent; import?android.os.Bundle; import?android.speech.tts.TextToSpeech; import?android.speech.tts.TextToSpeech.OnInitListener; import?android.util.Log; import?android.view.View; import?android.view.View.OnClickListener; import?android.widget.AdapterView; import?android.widget.ArrayAdapter; import?android.widget.Button; import?android.widget.EditText; import?android.widget.Spinner; import?android.widget.AdapterView.OnItemSelectedListener; public?class?MainActivity?extends?Activity?implements?OnInitListener?{ ????/** ?????*?Called?when?the?activity?is?first?created. ?????*/ ????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; ????private?Spinner?langSelect?=?null; ????private?String?languages[]?=?{"English",?"French",?"German",?"Italian",?"Spanish"}; ????@Override ????public?void?onCreate(Bundle?savedInstanceState)?{ ????????super.onCreate(savedInstanceState); ????????setContentView(R.layout.activity_main); ????????//檢查T(mén)TS數(shù)據(jù)是否已經(jīng)安裝并且可用 ????????Intent?checkIntent?=?new?Intent(); ????????checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); ????????startActivityForResult(checkIntent,?REQ_TTS_STATUS_CHECK); ????????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); ????????????????//朗讀輸入框里的內(nèi)容 ????????????} ????????}); ????????langSelect?=?(Spinner)?findViewById(R.id.langSelect); ????????inputText.setText("I?love?you"); ????????ArrayAdapteradapter?=?new?ArrayAdapter(this,?android.R.layout.simple_spinner_item,?languages); ????????adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); ????????langSelect.setAdapter(adapter); ????????langSelect.setSelection(0); ????????langSelect.setOnItemSelectedListener(new?OnItemSelectedListener()?{ ????????????public?void?onItemSelected(AdapterView?parent,?View?view, ???????????????????????????????????????int?position,?long?id)?{ ????????????????//?TODO?Auto-generated?method?stub ????????????????int?pos?=?langSelect.getSelectedItemPosition(); ????????????????int?result?=?-1; ????????????????switch?(pos)?{ ????????????????????case?0:?{ ????????????????????????inputText.setText("I?love?you"); ????????????????????????result?=?mTts.setLanguage(Locale.US); ????????????????????} ????????????????????break; ????????????????????case?1:?{ ????????????????????????inputText.setText("Je?t'aime"); ????????????????????????result?=?mTts.setLanguage(Locale.FRENCH); ????????????????????} ????????????????????break; ????????????????????case?2:?{ ????????????????????????inputText.setText("Ich?liebe?dich"); ????????????????????????result?=?mTts.setLanguage(Locale.GERMAN); ????????????????????} ????????????????????break; ????????????????????case?3:?{ ????????????????????????inputText.setText("Ti?amo"); ????????????????????????result?=?mTts.setLanguage(Locale.ITALIAN); ????????????????????} ????????????????????break; ????????????????????case?4:?{ ????????????????????????inputText.setText("Te?quiero"); ????????????????????????result?=?mTts.setLanguage(new?Locale("spa",?"ESP")); ????????????????????} ????????????????????break; ????????????????????default: ????????????????????????break; ????????????????} ????????????????//設(shè)置發(fā)音語(yǔ)言 ????????????????if?(result?==?TextToSpeech.LANG_MISSING_DATA?||?result?==?TextToSpeech.LANG_NOT_SUPPORTED) ????????????????//判斷語(yǔ)言是否可用 ????????????????{ ????????????????????Log.v(TAG,?"Language?is?not?available"); ????????????????????speakBtn.setEnabled(false); ????????????????}?else?{ ????????????????????speakBtn.setEnabled(true); ????????????????} ????????????} ????????????public?void?onNothingSelected(AdapterView?arg)?{ ????????????????//?TODO?Auto-generated?method?stub ????????????} ????????}); ????} ????//實(shí)現(xiàn)TTS初始化接口 ????@Override ????public?void?onInit(int?status)?{ ????????//?TODO?Auto-generated?method?stub ????????//TTS?Engine初始化完成 ????????if?(status?==?TextToSpeech.SUCCESS)?{ ????????????int?result?=?mTts.setLanguage(Locale.US); ????????????//設(shè)置發(fā)音語(yǔ)言 ????????????if?(result?==?TextToSpeech.LANG_MISSING_DATA?||?result?==?TextToSpeech.LANG_NOT_SUPPORTED) ????????????//判斷語(yǔ)言是否可用 ????????????{ ????????????????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); ????????????} ????????} ????} ????protected?void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)?{ ????????if?(requestCode?==?REQ_TTS_STATUS_CHECK)?{ ????????????switch?(resultCode)?{ ????????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_PASS: ????????????????????//這個(gè)返回結(jié)果表明TTS?Engine可以用 ????????????????{ ????????????????????mTts?=?new?TextToSpeech(this,?this); ????????????????????Log.v(TAG,?"TTS?Engine?is?installed!"); ????????????????} ????????????????break; ????????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA: ????????????????????//需要的語(yǔ)音數(shù)據(jù)已損壞 ????????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA: ????????????????????//缺少需要語(yǔ)言的語(yǔ)音數(shù)據(jù) ????????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME: ????????????????????//缺少需要語(yǔ)言的發(fā)音數(shù)據(jù) ????????????????{ ????????????????????//這三種情況都表明數(shù)據(jù)有錯(cuò),重新下載安裝需要的數(shù)據(jù) ????????????????????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返回的結(jié)果 ????????} ????} ????@Override ????protected?void?onPause()?{ ????????//?TODO?Auto-generated?method?stub ????????super.onPause(); ????????if?(mTts?!=?null) ????????//activity暫停時(shí)也停止TTS ????????{ ????????????mTts.stop(); ????????} ????} ????@Override ????protected?void?onDestroy()?{ ????????//?TODO?Auto-generated?method?stub ????????super.onDestroy(); ????????//釋放TTS的資源 ????????mTts.shutdown(); ????} }
在選擇不同的item時(shí),為inputText設(shè)置不同語(yǔ)言“我愛(ài)你”對(duì)應(yīng)的文本,并且為T(mén)TS實(shí)例設(shè)置語(yǔ)言。
為T(mén)TS引擎設(shè)置語(yǔ)言的API為
public int setLanguage (Locale loc);
使用Locale這個(gè)表示語(yǔ)言及國(guó)家區(qū)域的類來(lái)設(shè)置語(yǔ)言,目前支持English、French、German、Italian和Spanish這5大語(yǔ)言,返回的結(jié)果為
LANG_AVAILABLE, LANG_COUNTRY_AVAILABLE, LANG_COUNTRY_VAR_AVAILABLE, LANG_MISSING_DATA 和LANG_NOT_SUPPORTED。
其中LANG_MISSING_DATA 和LANG_NOT_SUPPORTED表示無(wú)法使用當(dāng)前進(jìn)行設(shè)置的語(yǔ)言,另外的幾個(gè)表示設(shè)置的語(yǔ)言有效。