天天看點

Text-to-speech 入門與進階學習筆記(android)1,入門:讓TEXT朗讀起來

<a target="_blank" href="http://blog.51cto.com/attachment/201202/222639811.jpg"></a>

//1,先寫一個用來檢查tts是否安裝的方法 private final static int CHECK_CODE = 1;       

public void checkTts(){           

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

startActivityForResult(checkIntent, CHECK_CODE);               }       

//建立一個TTS       

private TextToSpeech mTts;         

//這個自己先去了解下onActivityResult是怎麼回事,這裡不作詳解       

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {           

// TODO Auto-generated method stub         super.onActivityResult(requestCode, resultCode, data);           

if(requestCode == CHECK_CODE){               

if(resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS){                   

//成功建立一個TTS                   

mTts = new TextToSpeech(this, this);               

}else{                   

//否則安裝一個                   

Intent installIntent = new Intent();                 installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);                 startActivity  

(installIntent);             }         }     }   

//2,讓TTS朗讀起來   

//onCreate方法中   

//檢查TTS是否正常 checkTts();             

//建立用元件 private speakValue = (EditText)   

findViewById(R.id.speakValue);   

private speakButton = (Button)   

findViewById(R.id.sayHello);             

speakButton.setOnClickListener(new OnClickListener() {                             

@Override              

public void onClick(View v) {                   

// TODO Auto-generated method stub                   

String text = speakValue.getText().toString();                   

Log.d("result","text--&amp;gt;" +text);                 sayTts(text);             }         });   

//TTs朗讀用 private void sayTts(String text){   

//最簡單的例子 mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null);                           

}   

//補充,使用TTS朗讀,一定要實作OnInitListener 接口   

//TTs對象建立後初始化   

@Overridepublic void onInit(int status) {             

if(status == TextToSpeech.SUCCESS){   

//設定語言區域 int result = mTts.setLanguage(Locale.US);   

//如果是不支援語言   

if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED){   

Log.e("error","不支援");             }         }     } 

<a target="_blank" href="http://blog.51cto.com/attachment/201202/222646790.png"></a>

就這麼點代碼就可以正常運作了…

//更改播放使用的流類型   

//在sayTts作以下修改   

//TTs朗讀用 private void sayTts(String text) { HashMap&lt;String, String&gt; myAlarm = new HashMap();   

//把播放類型,通過鬧鐘流實作 myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));     

//你播放的tts在音頻播放的鬧鐘類型流中 mTts.speak(text, TextToSpeech.QUEUE_FLUSH, myAlarm);     

//英語原文是這樣,我了解的就是以上我注釋的内容   

//我感覺不是很了解,希望有人幫幫   

//On Android, each audio stream that is played is associated with one   

//stream type, as defined in android.media.AudioManager. For a talking   

//alarm clock, we would like our text to be played on the   

//AudioManager.STREAM_ALARM stream type so that it respects the alarm   

//settings the user has chosen on the device.             

//在sayTts()中實作..   

//需要實作OnUtteranceCompletedListener這個接口   

//TTs朗讀用     

private Toast toast; prvate Context context = getApplicationContext();   

private void sayTts(String text) { HashMap&lt;String, String&gt; myAlarm = new HashMap();   mTts.setOnUtteranceCompletedListener(this);   

myAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "me too");     

toast = Toast.makeText(context, "me too", Toast.LENGTH_LONG);   

//最簡單的例子 mTts.speak(text, TextToSpeech.QUEUE_FLUSH, myAlarm); }     

//回調函數 @Overridepublic void onUtteranceCompleted(String utteranceId) { speakPlayBack(utteranceId); }   

private void speakPlayBack(String str) { Log.d("result","playBack--&gt;" + str); toast.show(); } 

<a target="_blank" href="http://blog.51cto.com/attachment/201202/222653366.png"></a>

//把TTS朗讀結果儲存   

private void sayTofile(String text) {   

HashMap&lt;String, String&gt; ttsRender = new HashMap&lt;String, String&gt;();   

String destFileName = "/sdcard/tts/"+text+".wav"; ttsRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, text); mTts.synthesizeToFile(text, ttsRender, destFileName);   

//在  

<a target="_blank" href="http://blog.51cto.com/attachment/201202/222659919.png"></a>

你就可以看到你剛才朗讀的Text被儲存了

//自定義文字播放   

private void sayTrue(String text) {   

String destFileName = "/sdcard/tts/"+text+".wav"; mTts.addSpeech(text, destFileName);   

mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null); }   

//在onclick方法中運作 sayTrue(); 

<a target="_blank" href="http://blog.51cto.com/attachment/201202/222706828.png"></a>

親測,MP3也可以播放…

@Overrideprotected void onDestroy() {        super.onDestroy();       

if(mTts != null){           

mTts.stop();           

mTts.shutdown();     } } 

繼續閱讀