AndroidTTS学习——TTS初体验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AndroidTTS学习——TTS初体验⼀.基础知识
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的链接,
可以先看下⼤概了解TTS提供的功能。

图3 Android TTS API
可以看到TTS提供了两个接⼝和两个类。

我们希望做的效果如下:
图4 实现效果图
上⾯⼀个输⼊框,点击Speak按钮则朗读上⾯的⽂字内容。

创建⼀个Android⼯程,⼯程名为AndroidTTSDemoFirst,其中SDK必须选择1.6版本及以上。

其中Main.xml⽂件很简单,如下所⽰:
view plaincopy to clipboardprint?
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="/apk/res/android"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7. <EditText android:id="@+id/inputText"
8. android:hint="Input the text here!"
9. android:layout_width="fill_parent"
10. android:layout_height="wrap_content">
11. </EditText>
12. <Button android:text="Speak"
13. android:id="@+id/speakBtn"
14. android:layout_width="wrap_content"
15. android:layout_height="wrap_content"
16. android:layout_gravity="center_horizontal"
17. android:enabled="false"
18. ></Button>
19. </LinearLayout>
Java⽂件的编写:
要使⽤TTS得实现OnInitListener接⼝
view plaincopy to clipboardprint?
1. public class AndroidTTSDemoFirst extends Activity implements OnInitListener {
2. /** Called when the activity is first created. */
3. @Override
4. public void onCreate(Bundle savedInstanceState) {
5. super.onCreate(savedInstanceState);
6. setContentView(yout.main);
7. }
8. //实现TTS初始化接⼝
9. @Override
10. public void onInit(int status) {
11. // TODO Auto-generated method stub
12.
13. }
14. }
接着定义好下⾯要⽤到的⼏个变量:
view plaincopy to clipboardprint?
1. private EditText inputText = null;
2. private Button speakBtn = null;
3. private static final int REQ_TTS_STATUS_CHECK = 0;
4. private static final String TAG = "TTS Demo";
5. private TextToSpeech mTts;
虽然安装Android1.6版本及之后的Android机器都默认安装了TTS引擎,但某些设备可能会因为存储容量的限制⽽缺少安装和语⾔对应的资源⽂件,因此在使⽤TTS前,得先要检查是否安装了TTS语⾔数据,在onCreate函数中添加以下内容:
view plaincopy to clipboardprint?
1. //检查TTS数据是否已经安装并且可⽤
2. Intent checkIntent = new Intent();
3. checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
4. startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);
这⾥启动⼀个新的Intent去检查TTS数据是否已经安装,我们根据其返回的结果进⾏处理,如下所⽰:
view plaincopy to clipboardprint?
1. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
2. if(requestCode == REQ_TTS_STATUS_CHECK)
3. {
4. switch (resultCode) {
5. case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:
6. //这个返回结果表明TTS Engine可以⽤
7. {
8. mTts = new TextToSpeech(this, this);
9. Log.v(TAG, "TTS Engine is installed!");
10.
11. }
12.
13. break;
14. case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:
15. //需要的语⾳数据已损坏
16. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:
17. //缺少需要语⾔的语⾳数据
18. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:
19. //缺少需要语⾔的发⾳数据
20. {
21. //这三种情况都表明数据有错,重新下载安装需要的数据
22. Log.v(TAG, "Need language stuff:"+resultCode);
23. Intent dataIntent = new Intent();
24. dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
25. startActivity(dataIntent);
26.
27. }
28. break;
29. case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:
30. //检查失败
31. default:
32. Log.v(TAG, "Got a failure. TTS apparently not available");
33. break;
34. }
35. }
36. else
37. {
38. //其他Intent返回的结果
39. }
40. }
如果返回CHECK_VOICE_DATA_PASS表⽰检查成功,可以新建⼀个TextToSpeech,否则就去下载TTS数据。

当TTS数据检测成功创建⼀个TextToSpeech后,就会调⽤接⼝OnInitListener中定义的回调函数
view plaincopy to clipboardprint?
1. //实现TTS初始化接⼝
2. @Override
3. public void onInit(int status) {
4. // TODO Auto-generated method stub
5. //TTS Engine初始化完成
6. if(status == TextToSpeech.SUCCESS)
7. {
8. int result = mTts.setLanguage();
9. //设置发⾳语⾔
10. if(result == NG_MISSING_DATA || result ==
NG_NOT_SUPPORTED)
11. //判断语⾔是否可⽤
12. {
13. Log.v(TAG, "Language is not available");
14. speakBtn.setEnabled(false);
15. }
16. else
17. {
18. mTts.speak("This is an example of speech synthesis.", TextToSpeech.QUEUE_ADD,
null);
19. speakBtn.setEnabled(true);
20. }
21. }
22.
23. }
在这个回调函数⾥,我们设置语⾔,然后就可以进⾏使⽤TTS引擎进⾏操作了。

创建⼀个TextToSpeech是需要占⽤资源的,因此我们要适时的释放这个资源:
view plaincopy to clipboardprint?
1. @Override
2. protected void onPause() {
3. // TODO Auto-generated method stub
4. super.onPause();
5. if(mTts != null)
6. //activity暂停时也停⽌TTS
7. {
8. mTts.stop();
9. }
10. }
11.
12. @Override
13. protected void onDestroy() {
14. // TODO Auto-generated method stub
15. super.onDestroy();
16. //释放TTS的资源
17. mTts.shutdown();
18. }
最后,在onCreate函数中设置EditText和Button的使⽤:
view plaincopy to clipboardprint?
1. inputText = (EditText)findViewById(R.id.inputText);
2. speakBtn = (Button)findViewById(R.id.speakBtn);
3. inputText.setText("This is an example of speech synthesis.");
4. speakBtn.setOnClickListener(new OnClickListener() {
5.
6. public void onClick(View v) {
7. // TODO Auto-generated method stub
8. mTts.speak(inputText.getText().toString(), TextToSpeech.QUEUE_ADD, null);
9. //朗读输⼊框⾥的内容
10. }
11. });
⾄此,我们的Demo就完成了,当启动程序后,⾸先会朗读“This is an example of speech synthesis in English.”,然后你在EditText中输⼊内容,点击Speak按钮就能把内容给朗读出来。

⽂章对应的完整代码例⼦可以在这⾥下载:
注:⽂章参加“⾸届Google暑期⼤学⽣博客分享⼤赛——2010 Andriod篇”。

相关文档
最新文档