<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