TTS(從文本到語音(TextToSpeech))
TTS是Text To Speech的縮寫,即“從文本到語音”,是人機對話的一部分,讓機器能夠說話。
它是同時運用語言學和心理學的杰出之作,在內置芯片的支持之下,通過神經網絡的設計,把文字智能地轉化為自然語音流。TTS技術對文本文件進行實時轉換,轉換時間之短可以秒計算。在其特有智能語音控制器作用下,文本輸出的語音音律流暢,使得聽者在聽取信息時感覺自然,毫無機器語音輸出的冷漠與生澀感。TTS語音合成技術 [1] 即將覆蓋國標一、二級漢字,具有英文接口,自動識別中、英文,支持中英文混讀。所有聲音采用真人普通話為標準發音,實現了120-150個漢字/分鐘的快速語音合成,朗讀速度達3-4個漢字/秒,使用戶可以聽到清晰悅耳的音質和連貫流暢的語調。現在有少部分MP3隨身聽具有了TTS功能。
TTS是語音合成應用的一種,它將儲存于電腦中的文件,如幫助文件或者網頁,轉換成自然語音輸出。TTS不僅能幫助有視覺障礙的人閱讀計算機上的信息,更能增加文本文檔的可讀性。現在的TTS應用包括語音驅動的郵件以及聲音敏感系統,并常與聲音識別程序一起使用。
從上面我們了解了把文字轉化為語音是需要TTS技術,同時也簡單的介紹了TTS技術是什么。
從Android官網了解到實現把文字轉為語音,需要使用到TextToSpeech類。來看一下這個類。
TextToSpeech
將文字快速轉化為語音進行播放或者保存為音頻文件。
TextToSpeech
必須被實例化之后才能使用.實現TextToSpeech.OnInitListener
方法來獲取實例化結果的監聽。當你已經使用完TextToSpeech
實例之后, 應該調用shutdown()
方法來釋放TextToSpeech
所使用的本地資源。-
構造方法
- //使用默認的引擎
TextToSpeech(Context context, TextToSpeech.OnInitListener listener)
//使用指定的引擎
TextToSpeech(Context context, TextToSpeech.OnInitListener listener, String engine)
- //使用默認的引擎
知道它(TextToSpeech)是干什么的了,我們來簡單使用一下。看下面代碼。
activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<android.support.v7.widget.AppCompatEditText
android:id="@+id/main_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:hint="請您輸入要朗讀的文字"
tools:ignore="HardcodedText" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/main_btn_read"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="朗讀"
tools:ignore="HardcodedText" />
</android.support.v7.widget.LinearLayoutCompat>
activity_main.xml里面一個輸入控件(被朗讀的文字),一個按鈕控件(點擊按鈕開始朗讀)。
MainActivity.java文件
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.AppCompatEditText;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;
import java.util.Locale;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, TextToSpeech.OnInitListener {
private AppCompatEditText main_edit_text;
private AppCompatButton main_btn_read;
// TTS對象
private TextToSpeech mTextToSpeech;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initTextToSpeech();
}
private void initTextToSpeech() {
// 參數Context,TextToSpeech.OnInitListener
mTextToSpeech = new TextToSpeech(this, this);
// 設置音調,值越大聲音越尖(女生),值越小則變成男聲,1.0是常規
mTextToSpeech.setPitch(1.0f);
// 設置語速
mTextToSpeech.setSpeechRate(0.5f);
}
private void initView() {
main_edit_text = (AppCompatEditText) findViewById(R.id.main_edit_text);
main_btn_read = (AppCompatButton) findViewById(R.id.main_btn_read);
main_btn_read.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_btn_read:
submit();
break;
default:
break;
}
}
private void submit() {
// validate
String text = main_edit_text.getText().toString().trim();
if (TextUtils.isEmpty(text)) {
Toast.makeText(this, "請您輸入要朗讀的文字", Toast.LENGTH_SHORT).show();
return;
}
// TODO validate success, do something
if (mTextToSpeech != null && !mTextToSpeech.isSpeaking()) {
/*
TextToSpeech的speak方法有兩個重載。
// 執行朗讀的方法
speak(CharSequence text,int queueMode,Bundle params,String utteranceId);
// 將朗讀的的聲音記錄成音頻文件
synthesizeToFile(CharSequence text,Bundle params,File file,String utteranceId);
第二個參數queueMode用于指定發音隊列模式,兩種模式選擇
(1)TextToSpeech.QUEUE_FLUSH:該模式下在有新任務時候會清除當前語音任務,執行新的語音任務
(2)TextToSpeech.QUEUE_ADD:該模式下會把新的語音任務放到語音任務之后,
等前面的語音任務執行完了才會執行新的語音任務
*/
mTextToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
}
/**
* 用來初始化TextToSpeech引擎
*
* @param status SUCCESS或ERROR這2個值
*/
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
/*
使用的是小米手機進行測試,打開設置,在系統和設備列表項中找到更多設置,
點擊進入更多設置,在點擊進入語言和輸入法,見語言項列表,點擊文字轉語音(TTS)輸出,
首選引擎項有三項為Pico TTs,科大訊飛語音引擎3.0,度秘語音引擎3.0。其中Pico TTS不支持
中文語言狀態。其他兩項支持中文。選擇科大訊飛語音引擎3.0。進行測試。
如果自己的測試機里面沒有可以讀取中文的引擎,
那么不要緊,我在該Module包中放了一個科大訊飛語音引擎3.0.apk,將該引擎進行安裝后,進入到
系統設置中,找到文字轉語音(TTS)輸出,將引擎修改為科大訊飛語音引擎3.0即可。重新啟動測試
Demo即可體驗到文字轉中文語言。
*/
// setLanguage設置語言
int result = mTextToSpeech.setLanguage(Locale.CHINA);
// TextToSpeech.LANG_MISSING_DATA:表示語言的數據丟失
// TextToSpeech.LANG_NOT_SUPPORTED:不支持
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Toast.makeText(this, "數據丟失或不支持", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onStop() {
super.onStop();
// 不管是否正在朗讀TTS都被打斷
mTextToSpeech.stop();
// 關閉,釋放資源
mTextToSpeech.shutdown();
}
@Override
protected void onDestroy() {
if (mTextToSpeech != null) {
mTextToSpeech.stop();
mTextToSpeech.shutdown();
mTextToSpeech = null;
}
super.onDestroy();
}
}
代碼注釋已經寫的很清楚了呢。
OK,開始測試Demo吧。
點擊朗讀,即可聽到手機傳出暖暖的云陽呢的聲音。恩恩,聲音很是美妙(技術帶給我的快樂)。