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

二. 实例开发

 

我们希望做的效果如下:

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

 

实现效果图

 

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

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

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

 

[xhtml]  view plain copy
  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 plain copy
  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)