您的位置:首页 > 移动开发 > Android开发

Android TTS说中文

2016-03-12 10:38 453 查看
昨天在家看一本有关物联网开发的Android书籍时,看到了用TTS说中文的小例子,觉得蛮好的,就写篇学习记录吧!
Android虽然很早版本就开始支持TTS(Text To Speech) ,English 、 French 、 German 、 Italian 和 Spanish 五大语言,
居然没有几千年历史的汉语。好在开源框架http://code.google.com/p/eyes-free/提供了中文TTS功能,所以我们用它来实现中文朗读。


//http://code.google.com/p/eyes-free/
//开始之前记录在项目中添加相关jar包:TTS_library_stub_3.0_market.jar,我也是在网上下载的。
public class MainActivity extends Activity implements OnInitListener {
private EditText edt;
private Button speak;
private TextToSpeechBeta mTts;
private static final int CODE = 100;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkTTS();
initViewsAndEvents();
}

/**
* 初始化控件及监听事件
*/
private void initViewsAndEvents() {
edt = (EditText) findViewById(R.id.edt);
speak = (Button) findViewById(R.id.speak);
speak.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String edtStr = edt.getText().toString().trim();
if (!TextUtils.isEmpty(edtStr)) {
// 朗读我们输入的文字
mTts.speak(edtStr, TextToSpeechBeta.QUEUE_ADD, null);
}
}
});
}

/**
* 检查TTS是否可以使用
*/
private void checkTTS() {
Intent in = new Intent();
in.setAction(TextToSpeechBeta.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(in, CODE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CODE) {
switch (resultCode) {
case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_PASS:
Toast.makeText(this, "恭喜您,TTS可用", Toast.LENGTH_SHORT).show();
mTts = new TextToSpeechBeta(this, this);
break;
case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_BAD_DATA:// 发音数据已经损坏
case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_MISSING_DATA: // 需要的语音数据已丢失
case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_MISSING_VOLUME: // 发音数据丢失
// 下载TTS对应的资源
Intent dataIntent = new Intent(
TextToSpeechBeta.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(dataIntent);
break;
case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_FAIL:
// 发音失败
break;

}
}
}

@Override
public void onInit(int arg0, int arg1) {
if (arg1 == -1) {
// 提示安装所需要的数据
installTTS();
} else {
// 完成TTS的初始化
if (arg0 == TextToSpeechBeta.SUCCESS) {
// 设置TTS引擎,com.google.tts即eSpeak支持的语言包含中文
mTts.setEngineByPackageNameExtended("com.google.tts");
// 设置发音语言Locale.CHINA
int result = mTts.setLanguage(Locale.CHINA);
// 检查语言是否可用
if (result == TextToSpeechBeta.LANG_MISSING_DATA
|| result == TextToSpeechBeta.LANG_NOT_SUPPORTED) {
speak.setEnabled(false);
Toast.makeText(this, "语言功能不可用", Toast.LENGTH_SHORT).show();
} else {
speak.setEnabled(true);
}
} else {
Toast.makeText(this, "TTS初始化失败", Toast.LENGTH_SHORT).show();
}
}
}

/**
* 安装语音相关资源包
*/
private void installTTS() {
Builder alertInstall = new AlertDialog.Builder(this)
.setTitle("缺少语音包")
.setMessage("下载语音包")
.setPositiveButton("去下载",
new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog,
int which) {
// 下载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("取消", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alertInstall.create().show();
}

}


//布局文件很简单
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical" >

<EditText
android:id="@+id/edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:gravity="left|center"
android:hint="请输入您想说的话!"
android:textSize="15sp" />

<Button
android:id="@+id/speak"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:hint="开始讲话"
android:textSize="16sp" />

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: