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