当前位置: 代码迷 >> Android >> Android TTS学习——用五种外语说出“小弟我爱你”(转)
  详细解决方案

Android TTS学习——用五种外语说出“小弟我爱你”(转)

热度:100   发布时间:2016-05-01 20:39:56.0
Android TTS学习——用五种外语说出“我爱你”(转)

?

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

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

一.?简单介绍

在上一篇里

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

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

二.?实例分析

我们希望做的效果如下:

?

图1?实现效果图

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

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

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

?

[xhtml]?view plaincopy
  1. <?xml?version="1.0"?encoding="utf-8"?>??
  2. <LinearLayout?xmlns: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. ????<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. ????<Spinner?android: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 plaincopy
  1. public?class?AndroidTTSDemoSecond?extends?Activity?implements?OnInitListener{??
  2. ????/**?Called?when?the?activity?is?first?created.?*/??
  3. ????private?EditText?inputText?=?null;??
  4. ????private?Button?speakBtn?=?null;??
  5. ????private?static?final?int?REQ_TTS_STATUS_CHECK?=?0;??
  6. ????private?static?final?String?TAG?=?"TTS?Demo";??
  7. ????private?TextToSpeech?mTts;??
  8. ????@Override??
  9. ????public?void?onCreate(Bundle?savedInstanceState)?{??
  10. ????????super.onCreate(savedInstanceState);??
  11. ????????setContentView(R.layout.main);??
  12. ??????????
  13. ????????//检查TTS数据是否已经安装并且可用??
  14. ????????Intent?checkIntent?=?new?Intent();??
  15. ????????checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);??
  16. ????????startActivityForResult(checkIntent,?REQ_TTS_STATUS_CHECK);??
  17. ??????????
  18. ????????inputText?=?(EditText)findViewById(R.id.inputText);??
  19. ????????speakBtn?=?(Button)findViewById(R.id.speakBtn);??????????
  20. ????????inputText.setText("This?is?an?example?of?speech?synthesis.");??
  21. ????????speakBtn.setOnClickListener(new?OnClickListener()?{??
  22. ??????????????
  23. ????????????public?void?onClick(View?v)?{??
  24. ????????????????//?TODO?Auto-generated?method?stub??
  25. ????????????????mTts.speak(inputText.getText().toString(),?TextToSpeech.QUEUE_ADD,?null);??
  26. ????????????????//朗读输入框里的内容??
  27. ????????????}??
  28. ????????????});??
  29. ????}??
  30. ??????
  31. ????//实现TTS初始化接口??
  32. ????@Override??
  33. ????public?void?onInit(int?status)?{??
  34. ????????//?TODO?Auto-generated?method?stub??
  35. ????????//TTS?Engine初始化完成??
  36. ????????if(status?==?TextToSpeech.SUCCESS)??
  37. ????????{??
  38. ????????????int?result?=?mTts.setLanguage(Locale.US);??
  39. ????????????//设置发音语言??
  40. ????????????if(result?==?TextToSpeech.LANG_MISSING_DATA?||?result?==?TextToSpeech.LANG_NOT_SUPPORTED)??
  41. ????????????//判断语言是否可用??
  42. ????????????{??
  43. ????????????????Log.v(TAG,?"Language?is?not?available");??
  44. ????????????????speakBtn.setEnabled(false);??
  45. ????????????}??
  46. ????????????else??
  47. ????????????{??
  48. ????mTts.speak("This?is?an?example?of?speech?synthesis.",?TextToSpeech.QUEUE_ADD,?null);??
  49. ????????????????speakBtn.setEnabled(true);??
  50. ????????????}??
  51. ????????}??
  52. ??????????
  53. ????}??
  54. ??????
  55. ????protected??void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)?{??
  56. ????????if(requestCode?==?REQ_TTS_STATUS_CHECK)??
  57. ????????{??
  58. ????????????switch?(resultCode)?{??
  59. ????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:??
  60. ????????????????//这个返回结果表明TTS?Engine可以用??
  61. ????????????{??
  62. ????????????????mTts?=?new?TextToSpeech(this,?this);??
  63. ????????????????Log.v(TAG,?"TTS?Engine?is?installed!");??
  64. ??????????????????
  65. ????????????}??
  66. ??????????????????
  67. ????????????????break;??
  68. ????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:??
  69. ????????????????//需要的语音数据已损坏??
  70. ????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:??
  71. ????????????????//缺少需要语言的语音数据??
  72. ????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:??
  73. ????????????????//缺少需要语言的发音数据??
  74. ????????????{??
  75. ????????????????//这三种情况都表明数据有错,重新下载安装需要的数据??
  76. ????????????????Log.v(TAG,?"Need?language?stuff:"+resultCode);??
  77. ????????????????Intent?dataIntent?=?new?Intent();??
  78. ????????????????dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);??
  79. ????????????????startActivity(dataIntent);??
  80. ??????????????????
  81. ????????????}??
  82. ????????????????break;??
  83. ????????????case?TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:??
  84. ????????????????//检查失败??
  85. ????????????default:??
  86. ????????????????Log.v(TAG,?"Got?a?failure.?TTS?apparently?not?available");??
  87. ????????????????break;??
  88. ????????????}??
  89. ????????}??
  90. ????????else??
  91. ????????{??
  92. ????????????//其他Intent返回的结果??
  93. ????????}??
  94. ????????}??
  95. ??????
  96. ????@Override??
  97. ????protected?void?onPause()?{??
  98. ????????//?TODO?Auto-generated?method?stub??
  99. ????????super.onPause();??
  100. ????????if(mTts?!=?null)??
  101. ????????????//activity暂停时也停止TTS??
  102. ????????{??
  103. ????????????mTts.stop();??
  104. ????????}??
  105. ????}??
  106. ??????
  107. ????@Override??
  108. ????protected?void?onDestroy()?{??
  109. ????????//?TODO?Auto-generated?method?stub??
  110. ????????super.onDestroy();??
  111. ????????//释放TTS的资源??
  112. ????????mTts.shutdown();??
  113. ????????}??
  114. ????}??

?

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

首先是实现?OnInitListener?这个接口,这个接口中只有一个抽象函数?void??onInit(?int??status),在?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?实例,

public?TextToSpeech?(?Context??context,??TextToSpeech.OnInitListener??listener)

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

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


?

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

public?int?speak?(?String??text,?int?queueMode,??HashMap?<?String?,??String?>?params)

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

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

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

?

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

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

?

[java]?view plaincopy
  1. private?Spinner?langSelect?=?null;??
  2. private?String?languages[]={"English","French","German","Italian","Spanish"};??

?

接着添加?Spinner?的使用,

?

[java]?view plaincopy
  1. langSelect?=?(Spinner)findViewById(R.id.langSelect);??
  2. ??????????
  3. ????????inputText.setText("I?love?you");??
  4. ??????????
  5. ????????ArrayAdapter<String>?adapter?=?new?ArrayAdapter<String>(this,?android.R.layout.simple_spinner_item,?languages);??
  6. ????????adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);??
  7. ????????langSelect.setAdapter(adapter);??
  8. ????????langSelect.setSelection(0);??

?

TTS?相关的部分是?Spinner?控件的?item?selected事件的处理,

?

[java]?view plaincopy
  1. ????langSelect.setOnItemSelectedListener(new?OnItemSelectedListener()?{??
  2. public?void?onItemSelected(AdapterView<?>?parent,?View?view,??
  3. ????????int?position,?long?id)?{??
  4. ????//?TODO?Auto-generated?method?stub??
  5. ????int?pos?=?langSelect.getSelectedItemPosition();??
  6. ????int?result?=?-1;??
  7. ????switch?(pos)?{??
  8. ????case?0:??
  9. ????{??
  10. ????????inputText.setText("I?love?you");??
  11. ????????result?=?mTts.setLanguage(Locale.US);??
  12. ????}??
  13. ??????????
  14. ????????break;??
  15. ????case?1:??
  16. ????{??
  17. ????????inputText.setText("Je?t'aime");??
  18. ????????result?=?mTts.setLanguage(Locale.FRENCH);??
  19. ????}??
  20. ????????break;??
  21. ????case?2:??
  22. ????{??
  23. ????????inputText.setText("Ich?liebe?dich");??
  24. ????????result?=?mTts.setLanguage(Locale.GERMAN);??
  25. ????}??
  26. ????????break;??
  27. ????case?3:??
  28. ????{??
  29. ????????inputText.setText("Ti?amo");??
  30. ????????result?=?mTts.setLanguage(Locale.ITALIAN);??
  31. ????}??
  32. ????????break;??
  33. ????case?4:??
  34. ????{??
  35. ????????inputText.setText("Te?quiero");??
  36. ????????result?=?mTts.setLanguage(new?Locale("spa",?"ESP"));??
  37. ????}??
  38. ????????break;??
  39. ????default:??
  40. ????????break;??
  41. ????}??
  42. ????//设置发音语言??
  43. ????if(result?==?TextToSpeech.LANG_MISSING_DATA?||?result?==?TextToSpeech.LANG_NOT_SUPPORTED)??
  44. ????//判断语言是否可用??
  45. ????{??
  46. ????????Log.v(TAG,?"Language?is?not?available");??
  47. ????????speakBtn.setEnabled(false);??
  48. ????}??
  49. ????else??
  50. ????{??
  51. ????????speakBtn.setEnabled(true);??
  52. ????}??
  53. }??
  54. public?void?onNothingSelected(AdapterView<?>?arg)?{??
  55. ????//?TODO?Auto-generated?method?stub??
  56. ??????
  57. }??
  58. );??

?

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

TTS?引擎设置语言的?API?为

public?int?setLanguage?(?Locale??loc)?

使用Locale?这个表示语言及国家区域的类来设置语言,目前支持?English?French??German??Italian?Spanish??5大语言,?返回的结果为

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

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

??

2??简单效果图

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

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

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

  相关解决方案