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

系统 1689 0

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帮你语音合成你想说的话,然后你就可以向她发送保存了对她喜欢的这个音频文件。

二.   实例开发

 

我们希望做的效果如下:

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

 

实现效果图

 

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

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

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

 

  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  实现起来就比较简单了,程序的代码如下所示:

 

  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  卡上保存文件,如下所示:

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

必须创建带 SD  卡的 AVD

 

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

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

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

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

 

原始的 SD  卡目录

 

 

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

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

 

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

 

 

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

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

 

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

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

 

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

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论