一、基礎知識
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://go.rritw.com/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://go.rritw.com/download.csdn.net/source/2610740
http://go.rritw.com/blog.csdn.net/ichliebephone/article/details/6373184
一. 基礎知識
Android 從1.6 版本開始支持Text To Speech ,使用的是Pico 語音合成引擎,但是只支持 English 、 French 、 German 、 Italian 和 Spanish 五大語言,暫時沒有對中文提供支持。因此使用 Android 默認的 TTS Engine 是沒法朗讀中文的。
不過有開源項目 eyes-free (http://go.rritw.com/code.google.com/p/eyes-free/ , Android 上的 TTS 功能應該也是基於這個開源項目提供的)除了提供 Pico 外,還把支持其他更多語言語音合成的另一個 TTS 引擎 eSpeak 也移植到了 Android 平台,其中就支持中文的語音合成。
因此在安裝了 eyes-free 提供的 TTS Service Extended 的 apk 後,就可以在程序中使用 eyes-free 提供的 TTS library ,並把 TTS Engine 設置为不是默認的 Pico ,而是 eSpeak ,就可以實現朗讀中文了。不過經過測試,實際的效果還是很差的,只能說勉強可以朗讀而已。
二. 實例分析
下面我們就通過一個具體的例子來說明朗讀中文的實現過程。
希望實現的效果和之前的類似:
圖 1 實現效果圖
上面一個輸入框,點擊 “我說” 按鈕則朗讀上面的文字內容。
首先我們要到 eyes-free 那下載需要的 TTS library 的 jar 包 (http://go.rritw.com/code.google.com/p/eyes-free/downloads/detail?name=TTS_library_stub_3.0_market.jar&can=2&q=) 。
創建一個 Android 工程,工程名为 NiHaoTTS ,並且把下載的 jar 包放在 assets 文件夾下。右鍵點擊工程,選擇 properties , Java Build Path , Libraries , Add JARs, 往工程中添加進 assets 下的 jar 包 , 如下圖所示:
圖2 添加 TTS library jar 包
其中 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"
Java 文件的編寫:
Java 文件和之前的類似,只是因为使用了 eyes-free 的 TTS API ,而不是 Android 自帶的 TTS API ,因此有些許改變。相關的 API 参考: http://go.rritw.com/eyes-free.googlecode.com/svn/trunk/documentation/tts/com/google/tts/package-summary.html ,其中我們可以看到基本和 Android 的 API ()類似,其中一個明顯的區別是創建 TTS 對象這裏使用的是TextToSpeechBeta ,而之前我們使用的是TextToSpeech 。
Java 完整的代碼为:
- public class NiHaoTTS extends Activity implements OnInitListener{
- /** Called when the activity is first created. */
- private Button mBtn;
- private EditText mText;
- //使用com.google.tts包中的TextToSpeechBeta
- private TextToSpeechBeta mTTS;
基本和我們之前學過的類似,其中不同的地方有:
( 1 ) TTS 的初始化回調函數多了一個版本號参數 version,
public void onInit( int status, int version) ,
如果返回的版本號 version 等於 -1 ,則表明還沒有安裝 eyes-free 提供的 TTS Service Extended ,提示進行下載和安裝。
// 提示安裝所需的 TTS 數據
alertInstallEyesFreeTTSData();
主要就是彈出對話框進行提示,然後鏈接到eyes-free 的網站進行下載對應的 apk 。
// 彈出對話框提示安裝所需的 TTS 數據
private void alertInstallEyesFreeTTSData()
{
Builder alertInstall = new AlertDialog.Builder(this )
.setTitle( " 缺少需要的語音包 " )
.setMessage( " 下載安裝缺少的語音包 " )
.setPositiveButton( " 確定 " , newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
// TODO Auto-generated method stub
// 下載 eyes-free 的語音數據包
String ttsDataUrl = "http://eyes-free.googlecode.com/files/tts_3.1_market.apk";
Uri ttsDataUri = Uri.parse (ttsDataUrl);
Intent ttsIntent = new Intent(Intent.ACTION_VIEW , ttsDataUri);
startActivity(ttsIntent);
}
})
.setNegativeButton( " 取消 " , newDialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,int which) {
// TODO Auto-generated method stub
finish();
}
});
alertInstall.create().show();
}
下載完進行安裝,然後重新启動程序就可以運行。
( 2 )如果已經安裝了,則可以進設置 TTS引擎和需要合成的語言。
// 設置 TTS 引擎, com.google.tts 即 eSpeak支持的語言包含中文,使用 Android 系統默認的 pico 可以設置为 com.svox.pico
mTTS .setEngineByPackageNameExtended("com.google.tts" );
int result = mTTS .setLanguage(Locale.CHINA );
// 設置發音語言
其中如果設置为 com.google.tts 則表示使用eSpeak 引擎,其包括對中文語音合成的支持。如果設置为 com.svox.pico 則表示使用Pico 引擎,實際效果就是使用 Android 自帶的 Pico 的效果,不過只支持 5 中語言,不支持中文。
除了這兩塊,其他和我們之前的程序基本一样。
然後就可以運行程序。因为模擬器開始時沒有安裝需要的 eyes-free 的 TTS Service Extended 的 apk ,因此會彈出提示對話框,點擊確定開始下載,下載完進行安裝,如下圖所示。
圖3 安裝eyes-free的TTS
安裝完會在應用程序中看到對應的圖標,並且在 TTS 的設置中也會增加 eSpeak TTS 一項,如下圖所示:
圖4 安裝了eyes-free的TTS
安裝完後就可以再次打開 NiHaoTTS 程序,這時會有個選擇詢問使用哪個 TTS ,選擇第二項,然後就可以在輸入框中輸入中文來朗讀了。
圖5 選擇TTS
不過經過簡單測試就知道了,中文朗讀的效果基本沒法實際使用的。
文章對應的完整代碼例子可以在這裏下載:
http://go.rritw.com/download.csdn.net/source/3237373
http://go.rritw.com/download.csdn.net/download/leiwuluan/3894785
留言列表