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

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

一.简单介绍

在上一篇里

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

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

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

这个功能调用的函数为:

publicintsynthesizeToFile(Stringtext,HashMap<String,String>params,Stringfilename)

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

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

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

二.实例开发

我们希望做的效果如下:

1实现效果图

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

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

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

[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. <TextViewandroid:id="@+id/filenameLabel"
  20. android:text="Saveas:"
  21. android:layout_width="fill_parent"
  22. android:layout_height="wrap_content"
  23. ></TextView>
  24. <EditTextandroid:id="@+id/filenameText"
  25. android:hint="Inputthesavingfilenamehere!"
  26. android:layout_width="fill_parent"
  27. android:layout_height="wrap_content">
  28. ></EditText>
  29. <LinearLayoutxmlns: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. <Buttonandroid:id="@+id/recordBtn"
  36. android:text="Record"
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. ></Button>
  40. <Buttonandroid: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 plain copy
  1. publicclassAndroidTTSDemoFourthextendsActivityimplementsOnInitListener{
  2. //实现初始接口
  3. /**Calledwhentheactivityisfirstcreated.*/
  4. //定义变量
  5. privateEditTextinputText=null;
  6. privateButtonspeakBtn=null;
  7. privateEditTextfilenameText=null;
  8. privateButtonrecordBtn=null;
  9. privateButtonplayBtn=null;
  10. privateTextToSpeechmTts;
  11. privatestaticfinalStringTAG="TTSDemo";
  12. privatestaticfinalStringloveConfession="jiajia,Iloveyou.";
  13. privateStringloveFileName=null;
  14. privateFileloveFile=null;
  15. privateMediaPlayerplayer=null;
  16. @Override
  17. publicvoidonCreate(BundlesavedInstanceState){
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);
  20. //创建TextToSpeech实例,初始化完成后会调用OnInitListener(第二个参数)的回调函数
  21. mTts=newTextToSpeech(this,
  22. this//TextToSpeech.OnInitListener
  23. );
  24. //设置控件
  25. inputText=(EditText)findViewById(R.id.inputText);
  26. speakBtn=(Button)findViewById(R.id.speakBtn);
  27. filenameText=(EditText)findViewById(R.id.filenameText);
  28. recordBtn=(Button)findViewById(R.id.recordBtn);
  29. playBtn=(Button)findViewById(R.id.playBtn);
  30. inputText.setText(loveConfession);
  31. filenameText.setText("/sdcard/love.wav");
  32. speakBtn.setOnClickListener(newOnClickListener(){
  33. publicvoidonClick(Viewv){
  34. //TODOAuto-generatedmethodstub
  35. //朗读输入框里的内容
  36. mTts.speak(inputText.getText().toString(),TextToSpeech.QUEUE_ADD,null);
  37. }
  38. });
  39. recordBtn.setOnClickListener(newOnClickListener(){
  40. @Override
  41. publicvoidonClick(Viewv){
  42. //TODOAuto-generatedmethodstub
  43. //把TTS语音合成的结果保存为音频文件
  44. loveFileName=filenameText.getText().toString();
  45. loveFile=newFile(loveFileName);
  46. if(loveFile.exists())
  47. {
  48. loveFile.delete();
  49. }
  50. //把语音合成的结果保存到文件中
  51. if(TextToSpeech.SUCCESS==mTts.synthesizeToFile(inputText.getText().toString(),null,loveFileName))
  52. {
  53. Toast.makeText(getBaseContext(),"soundfilecreated!",Toast.LENGTH_SHORT).show();
  54. playBtn.setEnabled(true);
  55. }
  56. else
  57. {
  58. Toast.makeText(getBaseContext(),"failedtocreatesoundfile!",Toast.LENGTH_SHORT).show();
  59. }
  60. }
  61. });
  62. playBtn.setOnClickListener(newOnClickListener(){
  63. @Override
  64. publicvoidonClick(Viewv){
  65. //TODOAuto-generatedmethodstub
  66. //播放保存着的音频文件
  67. try
  68. {
  69. player=newMediaPlayer();
  70. player.setDataSource(loveFileName);
  71. player.prepare();
  72. player.start();
  73. }
  74. catch(Exceptione){
  75. //TODO:handleexception
  76. Toast.makeText(getBaseContext(),"failedtoplaysoundfile!",Toast.LENGTH_SHORT).show();
  77. e.printStackTrace();
  78. }
  79. }
  80. });
  81. }
  82. publicvoidonInit(intstatus){
  83. //TODOAuto-generatedmethodstub
  84. //TTSEngine初始化完成
  85. if(status==TextToSpeech.SUCCESS)
  86. {
  87. intresult=mTts.setLanguage(Locale.US);
  88. //设置发音语言
  89. if(result==TextToSpeech.LANG_MISSING_DATA||result==TextToSpeech.LANG_NOT_SUPPORTED)
  90. //判断语言是否可用
  91. {
  92. Log.v(TAG,"Languageisnotavailable");
  93. speakBtn.setEnabled(false);
  94. }
  95. else
  96. {
  97. speakBtn.setEnabled(true);
  98. }
  99. }
  100. }
  101. @Override
  102. protectedvoidonDestroy(){
  103. //TODOAuto-generatedmethodstub
  104. //释放TTS的资源
  105. if(mTts!=null)
  106. {
  107. mTts.stop();
  108. mTts.shutdown();
  109. }
  110. super.onDestroy();
  111. }
  112. }

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

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

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

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

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

2必须创建带SD卡的AVD

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

<uses-permissionandroid: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篇

更多相关文章

  1. ubuntu12.04 android studio 安装(装完后再重启系统挂了,请勿参考
  2. Android学习笔记之cyanogenmod编译篇
  3. 【Android(安卓)开发教程】PreferenceFragment
  4. Android设置全局字体大小,实现小中大字体功能
  5. Android: 缩放图片文件引起的OOM异常
  6. Android(安卓)gradle 统一依赖库版本
  7. 记录升级Android(安卓)studio3.0遇到的一些问题和解决方法
  8. 关于 android 远程控制(pc 控制手机)
  9. 将Android下的可执行文件以静态库的形式进行编译

随机推荐

  1. Android(安卓)Bundle类(简单实例)
  2. INSTALL_FAILED_INSUFFICIENT_STORAGE 这
  3. 引用 Android的DTMF处理(ToneGenerator)
  4. 常用的小方法,避免忘记,在此记录一下
  5. Android(安卓)SystemProperty
  6. android 制作的精美闹钟
  7. Android上使用Chrome DevTools 远程调试W
  8. Android与JS互调
  9. android 为activity添加optionMenu选项菜
  10. Android(安卓)adb shell 常用命令