1. 程式人生 > >基於TextToSpeech(tts)引擎的朗讀demo,很好玩的一個功能

基於TextToSpeech(tts)引擎的朗讀demo,很好玩的一個功能

<span style="font-size:18px;">package com.xu.texttospeak;

import java.io.File;
import java.util.Date;
import java.util.Locale;

import com.xu.xutexttospeak.R;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

/**
 * 
 * @author DaJian35 
 * 用於朗讀輸入的內容O(∩_∩)O~很好玩的東西 目前tts不支援中文朗讀。
 * (如果不能朗讀語音,可以看看手機設定-->語言和輸入法-->文字轉語音(TTS)輸出-->將語言設定成英文(美國))
 * 
 */
public class XuTextToSpeech extends Activity implements OnClickListener,
		OnInitListener {
	private Button speak; // 朗讀按鈕
	private Button record; // 記錄按鈕
	private EditText speakInfo; // 用於獲取需要朗讀的內容
	private TextToSpeech tts; // texttospeech引擎
	private String editInfo; // 獲取edittext的內容
	private Toast toast;
	private String pathRoot; // 聲音記錄的路徑
	private Date date; // 用於記錄聲音的檔名

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView(); // 初始化
	}

	// 初始化
	private void initView() {
		speak = (Button) findViewById(R.id.speak);
		record = (Button) findViewById(R.id.record);
		speakInfo = (EditText) findViewById(R.id.speakInfo);
		// 兩個button的監聽
		speak.setOnClickListener(XuTextToSpeech.this);
		record.setOnClickListener(XuTextToSpeech.this);
		date = new Date();
		// 建立texttospeech物件
		tts = new TextToSpeech(XuTextToSpeech.this, XuTextToSpeech.this);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		// 朗讀按鈕的監聽事件
		case R.id.speak:
			/*
			 * 第二個引數中, TextToSpeech.QUEUE_FLUSH表示:
			 * 當tts物件呼叫speak方法時,它會中斷當前例項正在執行的任務。(可以理解為清除當前語音任務,轉而執行新的語音任務)
			 * TextToSpeech.QUEUE_ADD表示:當tts物件呼叫speak方法時,會把新的發音任務新增到當前發音任務列隊之後
			 */
			if (getEditText().trim().length() == 0) {
				CenterToast("請填寫需要記錄的內容,且內容不能為空~~"); // 呼叫自定義的toast方法
			} else {
				tts.speak(getEditText(), TextToSpeech.QUEUE_FLUSH, null);
				CenterToast("speak"); // 呼叫自定義的toast方法
			}
			break;
		// 記錄聲音按鈕的監聽
		case R.id.record:
			if (isHaveIdCard()) {
				if (getEditText().trim().length() == 0) {
					CenterToast("請填寫需要記錄的內容,且內容不能為空~~"); // 呼叫自定義的toast方法
				} else {
					pathRoot = Environment.getExternalStorageDirectory()
							.getAbsolutePath() + "/XuTextToSpeech";
					File pathFile = new File(pathRoot);
					if (!pathFile.exists()) {
						pathFile.mkdirs();
					}
					tts.synthesizeToFile(getEditText(), null,
							pathRoot + "/" + date.getDay() + date.getHours()
									+ date.getMinutes() + date.getSeconds()
									+ ".wav");
					CenterToast("聲音記錄成功!!");
				}
			} else {
				CenterToast("SD卡不存在,不能記錄語音內容~");
			}
			break;

		default:
			break;
		}
	}

	// 實現OnInitListener介面方法
	@Override
	public void onInit(int status) {
		// 如果裝載tts引擎成功
		if (status == TextToSpeech.SUCCESS) {
			// 設定朗讀的語言
			int result = tts.setLanguage(Locale.US);
			if (result != TextToSpeech.LANG_COUNTRY_AVAILABLE
					&& result != TextToSpeech.LANG_AVAILABLE) {
				CenterToast("TTS暫時不支援這種語言的朗讀!~~"); // 呼叫自定義toast提示
			}
		} else {
			CenterToast("裝載tts引擎不成功!"); // 呼叫自定義toast提示
		}
	}

	// 自定義Toast(看起來比較美觀)
	public void CenterToast(String content) {
		toast = Toast
				.makeText(XuTextToSpeech.this, content, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER, 0, 20);
		toast.show();
	}

	// 獲得edittext的內容
	public String getEditText() {
		editInfo = speakInfo.getText().toString();
		return editInfo;
	}

	// 判斷SD是否存在
	public boolean isHaveIdCard() {
		if (Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED)) {
			return true;
		} else {
			return false;
		}
	}

	// tts的銷燬
	@Override
	protected void onDestroy() {
		if (tts != null) {
			tts.shutdown();
		}
	}
}</span>

前段時間在《android的瘋狂講義》書上看到了用tts引擎做一個自動朗讀的介紹。很好玩的一個東西,我參考裡面的內容,自己添加了一些嚴謹性的判斷。看上去 好像很多程式碼,其實大部分都是為了嚴謹性而新增的if判斷語句,還有裡面標記了很多註釋,希望能幫助有需要的朋友O(∩_∩)O~

 ps:如果還有什麼不懂的,可以提出來,我們一起共同進步~!= =

demo下載地址:http://download.csdn.net/detail/dajian35/8345015