一. 基础知识
TextToSpeech 简称 TTS , 称为语音合成, 是 Android 从 1.6版本 开始支持 的新功能 ,能 将所指定的文本转成不同语言音频输出。
在具体介绍前我们先来看下Adnroid系统带的TTS设置界面,点击Settings->Speech synthesis,如下图所示:
图 1 Android TTS设置界面
当点击“Listen to an example”时,会发出“ This is an example of speech synthesis in English. ”,如果没有安装 TTS Data的话可以点击第二项安装,在 Default settings 可以设置 Speech rate 和 Language ,如下图 2 所示可以知道 TTS 支持的语言。
图2 TTS 语言选择
如果勾选“Always use my settings ”时要注意,设置了这个选项后那么我们就不能在程序中对 speech rate 和 Languages 进行设置了,这里的设置回覆盖我们程序中的设置。
TTS功能需要有TTS Engine的支持,下面我们就来了解下android提供的TTS Engine。
Android使用了叫Pico的支持多种语言的语音合成引擎,Pico在后台负责把分析输入的文本,把分本分成他能识别的各个片段,再把合成的各个语音片段以听起来比较自然的方式连接在一起,这个过程Android系统帮我们做,我们只把他当做一个神奇的过程就可以了。
TTS engine依托于当前 Android Platform 所支持的几种主要的语言: English 、 French 、 German 、 Italian 和 Spanish 五大语言 (暂时也是没有对中文提供支持)。 TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时,对于个别的语言版本将取决于不同的时区,例如:对于 English ,在 TTS 中可以分别输出美式和英式两种不同的版本 。
二. 实例分析
下面我们先做一个具体的实例来亲自体会一下Android的TTS的效果。
我们做一个简单的输入英文句子然后朗读出来的例子,了解Android的TTS使用方法。
在具体做之前给个AndroidTTS的API的链接,
http://androidappdocs.appspot.com/reference/android/speech/tts/package-summary.html
可以先看下大概了解TTS提供的功能。
图3 Android TTS API
可以看到TTS提供了两个接口和两个类。
我们希望做的效果如下:
图4 实现效果图
上面一个输入框,点击Speak按钮则朗读上面的文字内容。
创建一个Android工程,工程名为AndroidTTSDemoFirst,其中SDK必须选择1.6版本及以上。
其中Main.xml文件很简单,如下所示:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/inputText" android:hint="Input the text here!" android:layout_width="fill_parent" android:layout_height="wrap_content"> </EditText> <Button android:text="Speak" android:id="@+id/speakBtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:enabled="false" ></Button> </LinearLayout>
Java文件的编写:
要使用TTS得实现OnInitListener接口
public class AndroidTTSDemoFirst extends Activity implements OnInitListener { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } //实现TTS初始化接口 @Override public void onInit(int status) { // TODO Auto-generated method stub } }
接着定义好下面要用到的几个变量:
private EditText inputText = null; private Button speakBtn = null; private static final int REQ_TTS_STATUS_CHECK = 0; private static final String TAG = "TTS Demo"; private TextToSpeech mTts;
虽然安装Android1.6版本及之后的Android机器都默认安装了TTS引擎,但某些设备可能会因为存储容量的限制而缺少安装和语言对应的资源文件,因此在使用TTS前,得先要检查是否安装了TTS语言数据,在onCreate函数中添加以下内容:
//检查TTS数据是否已经安装并且可用 Intent checkIntent = new Intent(); checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);
这里启动一个新的Intent去检查TTS数据是否已经安装,我们根据其返回的结果进行处理,如下所示:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQ_TTS_STATUS_CHECK) { switch (resultCode) { case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS: //这个返回结果表明TTS Engine可以用 { mTts = new TextToSpeech(this, this); Log.v(TAG, "TTS Engine is installed!"); } break; case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA: //需要的语音数据已损坏 case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA: //缺少需要语言的语音数据 case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME: //缺少需要语言的发音数据 { //这三种情况都表明数据有错,重新下载安装需要的数据 Log.v(TAG, "Need language stuff:"+resultCode); Intent dataIntent = new Intent(); dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); startActivity(dataIntent); } break; case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL: //检查失败 default: Log.v(TAG, "Got a failure. TTS apparently not available"); break; } } else { //其他Intent返回的结果 } }
如果返回CHECK_VOICE_DATA_PASS表示检查成功,可以新建一个 TextToSpeech ,否则就去下载 TTS数据。
当TTS数据检测成功创建一个TextToSpeech后,就会调用接口OnInitListener中定义的回调函数
//实现TTS初始化接口 @Override public void onInit(int status) { // TODO Auto-generated method stub //TTS Engine初始化完成 if(status == TextToSpeech.SUCCESS) { int result = mTts.setLanguage(Locale.US); //设置发音语言 if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) //判断语言是否可用 { Log.v(TAG, "Language is not available"); speakBtn.setEnabled(false); } else { mTts.speak("This is an example of speech synthesis.", TextToSpeech.QUEUE_ADD, null); speakBtn.setEnabled(true); } } }
在这个回调函数里,我们设置语言,然后就可以进行使用 TTS引擎进行操作了。
创建一个TextToSpeech是需要占用资源的,因此我们要适时的释放这个资源:
@Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); if(mTts != null) //activity暂停时也停止TTS { mTts.stop(); } } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); //释放TTS的资源 mTts.shutdown(); }
最后,在onCreate函数中设置 EditText和Button的使用:
inputText = (EditText)findViewById(R.id.inputText); speakBtn = (Button)findViewById(R.id.speakBtn); inputText.setText("This is an example of speech synthesis."); speakBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub mTts.speak(inputText.getText().toString(), TextToSpeech.QUEUE_ADD, null); //朗读输入框里的内容 } });
至此,我们的 Demo就完成了,当启动程序后,首先会朗读“ This is an example of speech synthesis in English. ”,然后你在EditText中输入内容,点击Speak按钮就能把内容给朗读出来。
文章对应的完整代码例子可以在这里下载:
http://download.csdn.net/source/2610740
注:文章参加“ 首届Google暑期大学生博客分享大赛——2010 Andriod篇”