Android TTS学习——用五种外语说出“我爱你”

10521人阅读 评论(14) 收藏 举报

一.简单介绍

在上一篇里

http://blog.csdn.net/ichliebephone/archive/2010/08/10/5802044.aspx

我们简单的介绍了Android里的TTS功能并实现了一个最简单的Demo例子--AndroidTTSDemoFirst,在这篇文章中我们将具体介绍用到的TTSAPI,并给上一个Demo增加语言选择功能,可以使用TTS引擎支持的EnglishFrenchGermanItalianSpanish5大语言来进行相应的语音合成,并用这5种外语向她说出“我爱你”。

二.实例分析

我们希望做的效果如下:

Android TTS学习——用五种外语说出“我爱你”Android TTS学习——用五种外语说出“我爱你”

图1实现效果图

有了上一个例子做基础,这个Demo比较好实现,主要是增加了一个语言选择的控件Spinner,选择不同的语言,就会用对应的语言表达“我爱你”。

接下来就边实现这个Demo边讲解用到的TTSAPI。也是先创建一个Android工程,工程名为AndroidTTSDemoSecond,其中SDK必须选择1.6版本及以上。

其中Main.xml文件也还是很简单,在前一个AndroidTTSDemoFirst例子的基础上增加了一个Spinner控件,如下所示:

[xhtml] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <EditTextandroid:id="@+id/inputText"
  8. android:hint="Inputthetexthere!"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content">
  11. </EditText>
  12. <Buttonandroid: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. <Spinnerandroid:id="@+id/langSelect"
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:layout_gravity="center_horizontal">
  23. </Spinner>
  24. </LinearLayout>

Java文件的编写:

因为这个Demo例子只是在上一个AndroidTTSDemoFirst基础上的增加,因此可以使用上一个编写的java文件,只要把class名字改为AndroidTTSDemoSecond,如下所示:

[java] view plain copy
  1. publicclassAndroidTTSDemoSecondextendsActivityimplementsOnInitListener{
  2. /**Calledwhentheactivityisfirstcreated.*/
  3. privateEditTextinputText=null;
  4. privateButtonspeakBtn=null;
  5. privatestaticfinalintREQ_TTS_STATUS_CHECK=0;
  6. privatestaticfinalStringTAG="TTSDemo";
  7. privateTextToSpeechmTts;
  8. @Override
  9. publicvoidonCreate(BundlesavedInstanceState){
  10. super.onCreate(savedInstanceState);
  11. setContentView(R.layout.main);
  12. //检查TTS数据是否已经安装并且可用
  13. IntentcheckIntent=newIntent();
  14. checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
  15. startActivityForResult(checkIntent,REQ_TTS_STATUS_CHECK);
  16. inputText=(EditText)findViewById(R.id.inputText);
  17. speakBtn=(Button)findViewById(R.id.speakBtn);
  18. inputText.setText("Thisisanexampleofspeechsynthesis.");
  19. speakBtn.setOnClickListener(newOnClickListener(){
  20. publicvoidonClick(Viewv){
  21. //TODOAuto-generatedmethodstub
  22. mTts.speak(inputText.getText().toString(),TextToSpeech.QUEUE_ADD,null);
  23. //朗读输入框里的内容
  24. }
  25. });
  26. }
  27. //实现TTS初始化接口
  28. @Override
  29. publicvoidonInit(intstatus){
  30. //TODOAuto-generatedmethodstub
  31. //TTSEngine初始化完成
  32. if(status==TextToSpeech.SUCCESS)
  33. {
  34. intresult=mTts.setLanguage(Locale.US);
  35. //设置发音语言
  36. if(result==TextToSpeech.LANG_MISSING_DATA||result==TextToSpeech.LANG_NOT_SUPPORTED)
  37. //判断语言是否可用
  38. {
  39. Log.v(TAG,"Languageisnotavailable");
  40. speakBtn.setEnabled(false);
  41. }
  42. else
  43. {
  44. mTts.speak("Thisisanexampleofspeechsynthesis.",TextToSpeech.QUEUE_ADD,null);
  45. speakBtn.setEnabled(true);
  46. }
  47. }
  48. }
  49. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  50. if(requestCode==REQ_TTS_STATUS_CHECK)
  51. {
  52. switch(resultCode){
  53. caseTextToSpeech.Engine.CHECK_VOICE_DATA_PASS:
  54. //这个返回结果表明TTSEngine可以用
  55. {
  56. mTts=newTextToSpeech(this,this);
  57. Log.v(TAG,"TTSEngineisinstalled!");
  58. }
  59. break;
  60. caseTextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:
  61. //需要的语音数据已损坏
  62. caseTextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:
  63. //缺少需要语言的语音数据
  64. caseTextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:
  65. //缺少需要语言的发音数据
  66. {
  67. //这三种情况都表明数据有错,重新下载安装需要的数据
  68. Log.v(TAG,"Needlanguagestuff:"+resultCode);
  69. IntentdataIntent=newIntent();
  70. dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
  71. startActivity(dataIntent);
  72. }
  73. break;
  74. caseTextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:
  75. //检查失败
  76. default:
  77. Log.v(TAG,"Gotafailure.TTSapparentlynotavailable");
  78. break;
  79. }
  80. }
  81. else
  82. {
  83. //其他Intent返回的结果
  84. }
  85. }
  86. @Override
  87. protectedvoidonPause(){
  88. //TODOAuto-generatedmethodstub
  89. super.onPause();
  90. if(mTts!=null)
  91. //activity暂停时也停止TTS
  92. {
  93. mTts.stop();
  94. }
  95. }
  96. @Override
  97. protectedvoidonDestroy(){
  98. //TODOAuto-generatedmethodstub
  99. super.onDestroy();
  100. //释放TTS的资源
  101. mTts.shutdown();
  102. }
  103. }

下面简单介绍下上面代码中和TTS相关的一些API使用。

首先是实现OnInitListener这个接口,这个接口中只有一个抽象函数voidonInit(intstatus),在TextToSpeech引擎初始化完成后调用,在这个函数里就可以根据状态status(为TextToSpeech.SUCCESS或者TextToSpeech.Error)判断TTS初始化成功与否进行相应的操作。


接着在使用TTS时,会先启动一个Activity检查TTS引擎需要的TTS数据是否已经安装并且可用,checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);

这个Activity会返回如下结果之一:CHECK_VOICE_DATA_PASS,CHECK_VOICE_DATA_FAIL,CHECK_VOICE_DATA_BAD_DATA,CHECK_VOICE_DATA_MISSING_DATA,或者CHECK_VOICE_DATA_MISSING_VOLUME.

只有第一个结果CHECK_VOICE_DATA_PASS表明TTS数据可用,其他都是数据不可用的结果,可以启动一个Activity去安装需要的TTS数据,

dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);


当数据可用时,就可以创建一个TextToSpeech实例,

publicTextToSpeech(Contextcontext,TextToSpeech.OnInitListenerlistener)

这里需要两个参数,一个是TTS实例运行的Context;

另一个是初始化接口的实现,在实例的创建过程中,如果TTS引擎没有运行的话,则会初始化TTS引擎,并且在初始化完成后调用其第二个参数listener


有了TextToSpeech实例,接下来就可以对文本进行语音合成并发音了,对应的API为

publicintspeak(Stringtext,intqueueMode,HashMap<String,String>params)

这里需要三个参数,第一个为要合成的文本;

第二个为使用TTS队列的方式,因为使用TTS合成语音时需要时间,TTS引擎就会把还没有轮到的部分放在其队列中排队,后来的内容有两种使用队列的方式:QUEUE_ADD或者QUEUE_FLUSHQUEUE_ADD表示把当前需要合成的内容添加到TTS队列的后面,等前面的都完成了后再轮到他,QUEUE_FLUSH表示清除队列中原有的内容,直接使TTS引擎对当前内容进行语音合成,一般来说适合比较紧急的情况使用,但因为在Android中可能不止你一个程序使用TTS引擎,因此为了不破坏其他人的数据,建议使用QUEUE_ADD参数;

第三个为键值对表示的一个参数,我们后面再来介绍,目前可以使其为null

前半部分简单的介绍了前一个Demo用到的API,下半部分添加这个Demo中新的语言选择部分。

首先为Spinner控件新增加两个变量,

[java] view plain copy
  1. privateSpinnerlangSelect=null;
  2. privateStringlanguages[]={"English","French","German","Italian","Spanish"};

接着添加Spinner的使用,

[java] view plain copy
  1. langSelect=(Spinner)findViewById(R.id.langSelect);
  2. inputText.setText("Iloveyou");
  3. ArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_spinner_item,languages);
  4. adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  5. langSelect.setAdapter(adapter);
  6. langSelect.setSelection(0);

TTS相关的部分是Spinner控件的itemselected事件的处理,

[java] view plain copy
  1. langSelect.setOnItemSelectedListener(newOnItemSelectedListener(){
  2. publicvoidonItemSelected(AdapterView<?>parent,Viewview,
  3. intposition,longid){
  4. //TODOAuto-generatedmethodstub
  5. intpos=langSelect.getSelectedItemPosition();
  6. intresult=-1;
  7. switch(pos){
  8. case0:
  9. {
  10. inputText.setText("Iloveyou");
  11. result=mTts.setLanguage(Locale.US);
  12. }
  13. break;
  14. case1:
  15. {
  16. inputText.setText("Jet'aime");
  17. result=mTts.setLanguage(Locale.FRENCH);
  18. }
  19. break;
  20. case2:
  21. {
  22. inputText.setText("Ichliebedich");
  23. result=mTts.setLanguage(Locale.GERMAN);
  24. }
  25. break;
  26. case3:
  27. {
  28. inputText.setText("Tiamo");
  29. result=mTts.setLanguage(Locale.ITALIAN);
  30. }
  31. break;
  32. case4:
  33. {
  34. inputText.setText("Tequiero");
  35. result=mTts.setLanguage(newLocale("spa","ESP"));
  36. }
  37. break;
  38. default:
  39. break;
  40. }
  41. //设置发音语言
  42. if(result==TextToSpeech.LANG_MISSING_DATA||result==TextToSpeech.LANG_NOT_SUPPORTED)
  43. //判断语言是否可用
  44. {
  45. Log.v(TAG,"Languageisnotavailable");
  46. speakBtn.setEnabled(false);
  47. }
  48. else
  49. {
  50. speakBtn.setEnabled(true);
  51. }
  52. }
  53. publicvoidonNothingSelected(AdapterView<?>arg){
  54. //TODOAuto-generatedmethodstub
  55. }
  56. );

在选择不同的item时,为inputText设置不同语言“我爱你”对应的文本,并且为TTS实例设置语言。

TTS引擎设置语言的API

publicintsetLanguage(Localeloc)

使用Locale这个表示语言及国家区域的类来设置语言,目前支持EnglishFrenchGermanItalianSpanish5大语言,返回的结果为

LANG_AVAILABLE,LANG_COUNTRY_AVAILABLE,LANG_COUNTRY_VAR_AVAILABLE,LANG_MISSING_DATALANG_NOT_SUPPORTED。其中LANG_MISSING_DATALANG_NOT_SUPPORTED表示无法使用当前进行设置的语言,另外的几个表示设置的语言有效。

至此,增加了语言选择的新的Demo完成了,程序运行后可以选择不同的语言说出“我爱你”,简单效果图如下所示:

Android TTS学习——用五种外语说出“我爱你”Android TTS学习——用五种外语说出“我爱你”Android TTS学习——用五种外语说出“我爱你”

2简单效果图

文章对应的完整代码例子可以在这里下载:

http://download.csdn.net/source/2611687

注:文章参加“首届Google暑期大学生博客分享大赛——2010 Andriod篇

更多相关文章

  1. android 直接进行数据库操作
  2. android数据的五种存储方式
  3. Android Launcher7.0首次数据加载逻辑
  4. android 连接数据库
  5. Android 数据存取
  6. Android 之 使用File类在SD卡中读取数据文件
  7. android SQLite数据库用法图文详解(附源码)
  8. [android]数据库SQLiteDatabase简介

随机推荐

  1. Linux安装MySQL(使用yum)
  2. Android(安卓)Studio error: Unable to s
  3. android实现开机自启动服务
  4. Android中发送短信和彩信
  5. Android开发教程网址
  6. FlexboxLayout使用指南
  7. 相机 android java.lang.RuntimeExceptio
  8. 实验三、AndroidUI组件
  9. android对大图片的缓存处理
  10. android亮屏、暗屏、解锁、关闭系统对话