1.TTS定義
TextToSpeech簡稱 TTS,稱為語音合成,是Android 從1.6版本開始支持的新功能,能將所指定的文本轉(zhuǎn)成不同語言音頻輸出,文字轉(zhuǎn)語音(text-to-speech,TTS)系統(tǒng)是將一般語言的文字轉(zhuǎn)換為語音。
TTS功能需要有TTS?Engine的支持,下面我們就來了解下android提供的TTS?Engine。
Android使用了叫Pico的支持多種語言的語音合成引擎,Pico在后臺負(fù)責(zé)把分析輸入的文本,把分本分成他能識別的各個片段,再把合成的各個語音片段以聽起來比較自然的方式連接在一起,這個過程Android系統(tǒng)幫我們做,我們只把他當(dāng)做一個神奇的過程就可以了。
TTS?engine依托于當(dāng)前?Android?Platform?所支持的幾種主要的語言:?English?、?French?、?German?、?Italian?和Spanish?五大語言?(暫時也是沒有對中文提供支持)。?TTS可以將文本隨意的轉(zhuǎn)換成以上任意五種語言的語音輸出。與此同時,對于個別的語言版本將取決于不同的時區(qū),例如:對于?English?,在?TTS?中可以分別輸出美式和英式兩種不同的版本?。
2.語音合成歷史
早在17世紀(jì)就有法國人研發(fā)機(jī)械式的說話裝置。直到19世紀(jì),貝爾實驗室對于電子語音合成技術(shù)的研究,才開啟近代語音合成技術(shù)的發(fā)展。貝爾實驗室在1939年制作出第一個電子語音合成器VODER,是一種利用共振峰原理所制作的合成器。
1960年,瑞典語言學(xué)家G. Fant則提出利用線性預(yù)測編碼技術(shù)(LPC)來作為語音合成分析技術(shù),并推動了日后的發(fā)展。后來1980年代Moulines E和Charpentier F提出新的語音合成算法PSOLA,此技術(shù)可以合成比較自然的語音。
3.TTS 實例 (?了解 Android 的 TTS 使用方法 )
要求:在文本框中輸入英文句子,點擊按鈕然后朗讀出來。
框架:
1.先用?startActivityForResult()?檢查 TTS 數(shù)據(jù)是否已經(jīng)安裝并且可用
2.用?onInit()實現(xiàn)TTS初始化接口
3.實現(xiàn)按鈕的?OnClickListener() 接口, 接口中調(diào)用?speak(inputText.getText().toString(), TextToSpeech.QUEUE_ADD, null)?朗讀輸入框里的內(nèi)容.
Java代碼:
package?com.example.androidttsdemo1; 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; 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; ????@Override ????public?void?onCreate(Bundle?savedInstanceState)?{ ????????super.onCreate(savedInstanceState); ????????setContentView(R.layout.fragment_main); ????????//檢查TTS數(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)容 ????????????} ????????}); ????} ????//實現(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ā)音語言 ????????????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); ????????????} ????????} ????} ????protected?void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)?{ ????????if?(requestCode?==?REQ_TTS_STATUS_CHECK)?{ ????????????switch?(resultCode)?{ ????????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_PASS: ????????????????????//這個返回結(jié)果表明TTS?Engine可以用 ????????????????{ ????????????????????mTts?=?new?TextToSpeech(this,?this); ????????????????????Log.v(TAG,?"TTS?Engine?is?installed!"); ????????????????} ????????????????break; ????????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA: ????????????????????//需要的語音數(shù)據(jù)已損壞 ????????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA: ????????????????????//缺少需要語言的語音數(shù)據(jù) ????????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME: ????????????????????//缺少需要語言的發(fā)音數(shù)據(jù) ????????????????{ ????????????????????//這三種情況都表明數(shù)據(jù)有錯,重新下載安裝需要的數(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暫停時也停止TTS ????????{ ????????????mTts.stop(); ????????} ????} ????@Override ????protected?void?onDestroy()?{ ????????//?TODO?Auto-generated?method?stub ????????super.onDestroy(); ????????//釋放TTS的資源 ????????mTts.shutdown(); ????} }
下面簡單介紹下上面代碼中和TTS相關(guān)的一些API使用。
1. 首先是實現(xiàn)OnInitListener這個接口,這個接口中只有一個抽象函數(shù)void onInit(int status),在TextToSpeech引擎初始化完成后調(diào)用,在這個函數(shù)里就可以根據(jù)狀態(tài)status(為TextToSpeech.SUCCESS或者TextToSpeech.Error)判斷TTS初始化成功與否進(jìn)行相應(yīng)的操作。
2. 接著在使用TTS時,會先啟動一個Activity檢查TTS引擎需要的TTS數(shù)據(jù)是否已經(jīng)安裝并且可用,checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);這個Activity會返回如下結(jié)果之一:CHECK_VOICE_DATA_PASS, CHECK_VOICE_DATA_FAIL, CHECK_VOICE_DATA_BAD_DATA,
CHECK_VOICE_DATA_MISSING_DATA, 或者CHECK_VOICE_DATA_MISSING_VOLUME.?
只有第一個結(jié)果CHECK_VOICE_DATA_PASS表明TTS數(shù)據(jù)可用,其他都是數(shù)據(jù)不可用的結(jié)果,可以啟動一個Activity去安裝需要的TTS數(shù)據(jù),dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
3. 當(dāng)數(shù)據(jù)可用時,就可以創(chuàng)建一個TextToSpeech實例,
public TextToSpeech (Context context, TextToSpeech.OnInitListener?listener)
這里需要兩個參數(shù),一個是TTS實例運行的Context;
另一個是初始化接口的實現(xiàn),在實例的創(chuàng)建過程中,如果TTS引擎沒有運行的話,則會初始化TTS引擎,并且在初始化完成后調(diào)用其第二個參數(shù)listener。
4. 有了TextToSpeech實例,接下來就可以對文本進(jìn)行語音合成并發(fā)音了,對應(yīng)的API為
public int speak (String text, int queueMode, HashMap