当前位置: 代码迷 >> Android >> Android TTS学习——封存对你的喜欢(转)
  详细解决方案

Android TTS学习——封存对你的喜欢(转)

热度:31   发布时间:2016-05-01 20:39:52.0
Android TTS学习——保存对你的喜欢(转)

Android TTS学习——保存对你的喜欢

分类:?Google Android?Android TTS?1100人阅读?评论(4)?收藏?举报

一.?简单介绍

在上一篇里

http://blog.csdn.net/ichliebephone/archive/2010/08/13/5810370.aspx

我们介绍了TTS提供的接口?OnUtteranceCompletedListener?的使用,这个接口的作用是监听语音片段的朗读,并在语音片段朗读结束后调用其定义的回调函数,在回调函数里可以进行需要的操作。

在这一篇里我们介绍一下TTS提供的另一个有用的功能,把合成的语音以音频文件的形式保存在系统里,然后就可以直接用播放音频文件的方式来播放。

这个功能调用的函数为:

public?int??synthesizeToFile?(?String??text,??HashMap?<?String?,??String?>?params,?String??filename)

第一个参数为要进行语音合成的文本;第二个参数我们在上一个Demo中有所介绍,是一个键值对形式的HashMap类型变量,可以设置语音片段的ID等;第三个参数为保存到系统中的文件名。

当你想和朋友分享一份精彩的文本合成语音后的效果时,你可以使用这个功能把它保存为音频文件发送给朋友,这样即使朋友的手机不具备TTS功能,也可以用播放音频的方式分享到;当你要对同一段较长的文本多次进行语音合成时,你可以把这段文本的语音保存为音频文件,然后使用时播放,这样会更省资源,运行速度更快,因为使用TTS是比较费资源的一个过程。因此我们会在某些场合用到这个功能。

下面我们就用这个功能完成一个Demo例子,当你害羞当面向她表白你对她的喜欢时,让Android帮你语音合成你想说的话,然后你就可以向她发送保存了对她喜欢的这个音频文件。

二.?实例开发

?

我们希望做的效果如下:

?

1?实现效果图

?

第一个文本框里可以输入需要语音合成的文本,第二个文本框里输入要保存成的音频文件的文件名,点击第一个Speak?按钮你可以预听一下TTS?语音合成的效果,点击第二个Record?按钮,就会以音频文件的形式保存,然后就可以点击第三个Play?按钮播放保存的这个音频文件。

创建一个Android?工程,工程名为AndroidTTSDemoFourth?,其中SDK?版本需选择1.6?及以上。

其中Main.xml?文件很简单,如下所示:

?

[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. ????<TextView?android:id="@+id/filenameLabel"??
  20. ????????????????android:text="Save?as:"??
  21. ????????????????android:layout_width="fill_parent"???
  22. ????????????????android:layout_height="wrap_content"??????????????????
  23. ????????????????></TextView>?????
  24. ????<EditText?android:id="@+id/filenameText"??
  25. ????????????????android:hint="Input?the?saving?file?name?here!"??
  26. ????????????????android:layout_width="fill_parent"???
  27. ????????????????android:layout_height="wrap_content">??????????????????
  28. ????????????????></EditText>??
  29. ????<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??
  30. ????????????????????android:orientation="horizontal"??
  31. ????????????????????android:layout_width="fill_parent"??
  32. ????????????????????android:layout_height="fill_parent"??
  33. ????????????????????android:gravity="center_horizontal"??
  34. ????????????????????>??
  35. ????????<Button?android:id="@+id/recordBtn"??
  36. ????????????????????android:text="Record"??
  37. ????????????????????android:layout_width="wrap_content"???
  38. ????????????????????android:layout_height="wrap_content"??
  39. ????????????????????></Button>??
  40. ????????<Button?android:id="@+id/playBtn"??
  41. ????????????????????android:text="Play"??
  42. ????????????????????android:layout_width="wrap_content"???
  43. ????????????????????android:layout_height="wrap_content"??
  44. ????????????????????android:enabled="false"??
  45. ????????????????????></Button>??
  46. ????</LinearLayout>?????????????????????????????
  47. </LinearLayout>??

?

?

Java?文件的编写:

有了前面这些Demo?的实例开发,这个Demo?实现起来就比较简单了,程序的代码如下所示:

?

[java]?view plaincopy
  1. public?class?AndroidTTSDemoFourth?extends?Activity?implements?OnInitListener{??
  2. ????//实现初始接口??
  3. ????/**?Called?when?the?activity?is?first?created.?*/??
  4. ????//定义变量??
  5. ????private?EditText?inputText?=?null;??
  6. ????private?Button?speakBtn?=?null;??
  7. ????private?EditText?filenameText?=?null;??
  8. ????private?Button?recordBtn?=?null;??
  9. ????private?Button?playBtn?=?null;??
  10. ????private?TextToSpeech?mTts;??
  11. ????private?static?final?String?TAG?=?"TTS?Demo";??
  12. ????private?static?final?String?loveConfession?=?"jia?jia,?I?love?you.?";??
  13. ????private?String?loveFileName?=?null;??
  14. ????private?File?loveFile?=?null;??
  15. ????private?MediaPlayer?player?=?null;??
  16. ??????
  17. ????@Override??
  18. ????public?void?onCreate(Bundle?savedInstanceState)?{??
  19. ????????super.onCreate(savedInstanceState);??
  20. ????????setContentView(R.layout.main);??
  21. ????????//创建TextToSpeech实例,初始化完成后会调用OnInitListener(第二个参数)的回调函数??
  22. ????????mTts?=?new?TextToSpeech(this,??
  23. ????????????????this??//?TextToSpeech.OnInitListener??
  24. ????????????????);??
  25. ????????//设置控件??
  26. ????????inputText?=?(EditText)findViewById(R.id.inputText);??
  27. ????????speakBtn?=?(Button)findViewById(R.id.speakBtn);??
  28. ????????filenameText?=?(EditText)findViewById(R.id.filenameText);??
  29. ????????recordBtn?=?(Button)findViewById(R.id.recordBtn);??
  30. ????????playBtn?=?(Button)findViewById(R.id.playBtn);??
  31. ????????????????
  32. ????????inputText.setText(loveConfession);????
  33. ????????filenameText.setText("/sdcard/love.wav");??
  34. ????????speakBtn.setOnClickListener(new?OnClickListener()?{???????
  35. ????????????public?void?onClick(View?v)?{??
  36. ????????????????//?TODO?Auto-generated?method?stub??
  37. ????????????????//朗读输入框里的内容??
  38. ????????????????mTts.speak(inputText.getText().toString(),?TextToSpeech.QUEUE_ADD,?null);??
  39. ????????????}??
  40. ????????});??
  41. ????????recordBtn.setOnClickListener(new?OnClickListener()?{??????????????
  42. ????????????@Override??
  43. ????????????public?void?onClick(View?v)?{??
  44. ????????????????//?TODO?Auto-generated?method?stub??
  45. ????????????????//把TTS语音合成的结果保存为音频文件??
  46. ????????????????loveFileName?=?filenameText.getText().toString();??
  47. ????????????????loveFile?=?new?File(loveFileName);??
  48. ????????????????if(loveFile.exists())??
  49. ????????????????{??
  50. ????????????????????loveFile.delete();??
  51. ????????????????}??
  52. ????????????????//把语音合成的结果保存到文件中??
  53. ????????????????if(TextToSpeech.SUCCESS?==?mTts.synthesizeToFile(inputText.getText().toString(),?null,?loveFileName))??
  54. ????????????????{??
  55. ????????????????????Toast.makeText(getBaseContext(),?"sound?file?created!",?Toast.LENGTH_SHORT).show();??
  56. ????????????????????playBtn.setEnabled(true);??
  57. ????????????????}??
  58. ????????????????else??
  59. ????????????????{??
  60. ????????????????????Toast.makeText(getBaseContext(),?"failed?to?create?sound?file!",?Toast.LENGTH_SHORT).show();??
  61. ????????????????}??
  62. ????????????}??
  63. ????????});??
  64. ????????playBtn.setOnClickListener(new?OnClickListener()?{????????????
  65. ????????????@Override??
  66. ????????????public?void?onClick(View?v)?{??
  67. ????????????????//?TODO?Auto-generated?method?stub??
  68. ????????????????//播放保存着的音频文件??
  69. ????????????????try??
  70. ????????????????{??
  71. ????????????????????player?=?new?MediaPlayer();??
  72. ????????????????????player.setDataSource(loveFileName);??
  73. ????????????????????player.prepare();??
  74. ????????????????????player.start();??
  75. ????????????????}??
  76. ????????????????catch?(Exception?e)?{??
  77. ????????????????????//?TODO:?handle?exception??
  78. ????????????????????Toast.makeText(getBaseContext(),?"failed?to?play?sound?file!",?Toast.LENGTH_SHORT).show();??
  79. ????????????????????e.printStackTrace();??
  80. ????????????????}??
  81. ????????????}??
  82. ????????});??
  83. ????}??
  84. ??????
  85. ????public?void?onInit(int?status)?{??
  86. ????????//?TODO?Auto-generated?method?stub??
  87. ????????//TTS?Engine初始化完成??
  88. ????????if(status?==?TextToSpeech.SUCCESS)??
  89. ????????{??
  90. ????????????int?result?=?mTts.setLanguage(Locale.US);??
  91. ????????????//设置发音语言??
  92. ????????????if(result?==?TextToSpeech.LANG_MISSING_DATA?||?result?==?TextToSpeech.LANG_NOT_SUPPORTED)??
  93. ????????????//判断语言是否可用??
  94. ????????????{??
  95. ????????????????Log.v(TAG,?"Language?is?not?available");??
  96. ????????????????speakBtn.setEnabled(false);??
  97. ????????????}??
  98. ????????????else??
  99. ????????????{??
  100. ????????????????speakBtn.setEnabled(true);??
  101. ????????????}??
  102. ????????}??
  103. ????}??
  104. ??????
  105. ????@Override??
  106. ????protected?void?onDestroy()?{??
  107. ????????//?TODO?Auto-generated?method?stub??
  108. ????????//释放TTS的资源??
  109. ????????if(mTts?!=?null)??
  110. ????????{??
  111. ????????????mTts.stop();??
  112. ????????????mTts.shutdown();??
  113. ????????}?????
  114. ????????super.onDestroy();??
  115. ????}??
  116. }??

?

?

TTS?相关的新的部分为recordBtn?的onClick?事件的处理,先根据指定的文件名创建一个File?变量,来判断文件是否已经存在,如果已存在就先删除。然后调用函数

mTts?.synthesizeToFile(?inputText?.getText().toString(),?null?,?loveFileName?)

把文本框中的内容语音合成后保存到文件中。

另一个playBtn?的onClick?事件的处理,主要就是创建一个MediaPlayer?实例,播放上一步保存的音频文件。

?

至此,这个Demo?就完成了,但是在运行前,需创建一个带SD?卡的AVD?,因为要往SD?卡上保存文件,如下所示:

2?必须创建带SD?卡的AVD

?

同时还需在AndroidManifest.xml?文件中添加写外部存储设备的权限:

<?uses-permission?android:name?=?"android.permission.WRITE_EXTERNAL_STORAGE"?></uses-permission?>

接着就可以运行这个Demo?了,运行程序后在Eclipse?中切换到DDMS?视图,接着选择查看File Explorer?,我们看到在没有点击程序的Record?按钮进行语音合成到文件保存时,sdcard?目录下没有额外的文件,如下图所示:

?

3?原始的SD?卡目录

?

?

然后我们在程序中点击Record?按钮,让TTS?把语音合成到文件,合成成功的话会弹出“sound file created!?”的提示,并且Play?按钮变成可用。点击Play?按钮就会播放刚刚保存的音频文件,和点击第一个的Speak?按钮朗读的内容是一样的。这时,我们再来查看下SD?卡的目录,会发现多了一个文件:love.wav?,正是我们设定保存的文件名,如下图所示:

?

4?语音合成到文件后的SD?卡目录

?

?

并且,我们还可以使用adb pull?命令把这个文件从SD?卡上提取出来,在CMD?窗口中运行adb pull ./sdcard/love.wav?就可以把SD?卡上的这个音频文件保存的当前目录下,如下图所示:

?

5?提取SD?卡上保存的音频文件

最后,也可以在电脑上播放记录了你对她的喜欢的这个音频文件了,或者也可以把这个文件发送给你喜欢的她。

?

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

  相关解决方案