把合成的語音以音頻文件的形式保存在系統(tǒng)里,然后就可以直接用播放音頻文件的方式來播放。
這個功能調(diào)用的函數(shù)為:
public?int??synthesizeToFile?(?String??text,??HashMap?<?String?,??String?>?params,?String??filename)
第一個參數(shù)為要進行語音合成的文本;第二個參數(shù)我們在上一個Demo中有所介紹,是一個鍵值對形式的HashMap類型變量,可以設置語音片段的ID等;第三個參數(shù)為保存到系統(tǒng)中的文件名。
當你想和朋友分享一份精彩的文本合成語音后的效果時,你可以使用這個功能把它保存為音頻文件發(fā)送給朋友,這樣即使朋友的手機不具備TTS功能,也可以用播放音頻的方式分享到;當你要對同一段較長的文本多次進行語音合成時,你可以把這段文本的語音保存為音頻文件,然后使用時播放,這樣會更省資源,運行速度更快,因為使用TTS是比較費資源的一個過程。因此我們會在某些場合用到這個功能。
下面我們就用這個功能完成一個Demo例子,當你害羞當面向她表白你對她的喜歡時,讓Android幫你語音合成你想說的話,然后你就可以向她發(fā)送保存了對她喜歡的這個音頻文件。
布局代碼:
>
Java代碼:
package?com.example.androidttsdemo3; 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.Button; import?android.widget.EditText; import?android.widget.Toast; import?android.media.MediaPlayer?; import?java.io.File; public?class?MainActivity?extends?Activity?implements?OnInitListener{ ????//實現(xiàn)初始接口 ????/**?Called?when?the?activity?is?first?created.?*/ ????//定義變量 ????private?EditText?inputText?=?null; ????private?Button?speakBtn?=?null; ????private?EditText?filenameText?=?null; ????private?Button?recordBtn?=?null; ????private?Button?playBtn?=?null; ????private?TextToSpeech?mTts; ????private?static?final?String?TAG?=?"TTS?Demo"; ????private?static?final?String?loveConfession?=?"Lan?Hua,?I?love?you.?"; ????private?String?loveFileName?=?null; ????private?File?loveFile?=?null; ????private?MediaPlayer?player?=?null; ????@Override ????public?void?onCreate(Bundle?savedInstanceState)?{ ????????super.onCreate(savedInstanceState); ????????setContentView(R.layout.fragment_main); ????????//創(chuàng)建TextToSpeech實例,初始化完成后會調(diào)用OnInitListener(第二個參數(shù))的回調(diào)函數(shù) ????????mTts?=?new?TextToSpeech(this, ????????????????this??//?TextToSpeech.OnInitListener ????????); ????????//設置控件 ????????inputText?=?(EditText)findViewById(R.id.inputText); ????????speakBtn?=?(Button)findViewById(R.id.speakBtn); ????????filenameText?=?(EditText)findViewById(R.id.filenameText); ????????recordBtn?=?(Button)findViewById(R.id.recordBtn); ????????playBtn?=?(Button)findViewById(R.id.playBtn); ????????inputText.setText(loveConfession); ????????filenameText.setText("/sdcard/love.wav"); ????????speakBtn.setOnClickListener(new?OnClickListener()?{ ????????????public?void?onClick(View?v)?{ ????????????????//?TODO?Auto-generated?method?stub ????????????????//朗讀輸入框里的內(nèi)容 ????????????????mTts.speak(inputText.getText().toString(),?TextToSpeech.QUEUE_ADD,?null); ????????????} ????????}); ????????recordBtn.setOnClickListener(new?OnClickListener()?{ ????????????@Override ????????????public?void?onClick(View?v)?{ ????????????????//?TODO?Auto-generated?method?stub ????????????????//把TTS語音合成的結果保存為音頻文件 ????????????????loveFileName?=?filenameText.getText().toString(); ????????????????loveFile?=?new?File(loveFileName); ????????????????if(loveFile.exists()) ????????????????{ ????????????????????loveFile.delete(); ????????????????} ????????????????//把語音合成的結果保存到文件中 ????????????????if(TextToSpeech.SUCCESS?==?mTts.synthesizeToFile(inputText.getText().toString(),?null,?loveFileName)) ????????????????{ ????????????????????Toast.makeText(getBaseContext(),?"sound?file?created!",?Toast.LENGTH_SHORT).show(); ????????????????????playBtn.setEnabled(true); ????????????????} ????????????????else ????????????????{ ????????????????????Toast.makeText(getBaseContext(),?"failed?to?create?sound?file!",?Toast.LENGTH_SHORT).show(); ????????????????} ????????????} ????????}); ????????playBtn.setOnClickListener(new?OnClickListener()?{ ????????????@Override ????????????public?void?onClick(View?v)?{ ????????????????//?TODO?Auto-generated?method?stub ????????????????//播放保存著的音頻文件 ????????????????try ????????????????{ ????????????????????player?=?new?MediaPlayer(); ????????????????????player.setDataSource(loveFileName); ????????????????????player.prepare(); ????????????????????player.start(); ????????????????} ????????????????catch?(Exception?e)?{ ????????????????????//?TODO:?handle?exception ????????????????????Toast.makeText(getBaseContext(),?"failed?to?play?sound?file!",?Toast.LENGTH_SHORT).show(); ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????}); ????} ????public?void?onInit(int?status)?{ ????????//?TODO?Auto-generated?method?stub ????????//TTS?Engine初始化完成 ????????if(status?==?TextToSpeech.SUCCESS) ????????{ ????????????int?result?=?mTts.setLanguage(Locale.US); ????????????//設置發(fā)音語言 ????????????if(result?==?TextToSpeech.LANG_MISSING_DATA?||?result?==?TextToSpeech.LANG_NOT_SUPPORTED) ????????????//判斷語言是否可用 ????????????{ ????????????????Log.v(TAG,?"Language?is?not?available"); ????????????????speakBtn.setEnabled(false); ????????????} ????????????else ????????????{ ????????????????speakBtn.setEnabled(true); ????????????} ????????} ????} ????@Override ????protected?void?onDestroy()?{ ????????//?TODO?Auto-generated?method?stub ????????//釋放TTS的資源 ????????if(mTts?!=?null) ????????{ ????????????mTts.stop(); ????????????mTts.shutdown(); ????????} ????????super.onDestroy(); ????} }