Android TTS学习——TTS初体验

系统 1932 0

 

Android TTS学习——TTS初体验

  8456人阅读   评论 (18)   收藏   举报

一.   基础知识

TextToSpeech   简称    TTS     称为语音合成,     Android      1.6版本   开始支持   的新功能   ,能   将所指定的文本转成不同语言音频输出。

在具体介绍前我们先来看下Adnroid系统带的TTS设置界面,点击Settings->Speech synthesis,如下图所示:

Android TTS学习——TTS初体验

图 1 Android TTS设置界面

    当点击“Listen to an example”时,会发出“ This is an example of speech synthesis in English.   ”,如果没有安装   TTS Data的话可以点击第二项安装,在  Default settings  可以设置  Speech rate  和  Language  ,如下图  2  所示可以知道  TTS  支持的语言。

Android TTS学习——TTS初体验

2 TTS  语言选择

    如果勾选“ Always use my settings  ”时要注意,设置了这个选项后那么我们就不能在程序中对 speech rate  和  Languages  进行设置了,这里的设置回覆盖我们程序中的设置。

TTS功能需要有TTS Engine的支持,下面我们就来了解下android提供的TTS Engine。

Android使用了叫Pico的支持多种语言的语音合成引擎,Pico在后台负责把分析输入的文本,把分本分成他能识别的各个片段,再把合成的各个语音片段以听起来比较自然的方式连接在一起,这个过程Android系统帮我们做,我们只把他当做一个神奇的过程就可以了。

TTS engine 依托于当前  Android Platform  所支持的几种主要的语言:  English   French   German   Italian  Spanish  五大语言   (暂时也是没有对中文提供支持)。   TTS 可以将文本随意的转换成以上任意五种语言的语音输出。与此同时,对于个别的语言版本将取决于不同的时区,例如:对于  English  ,在  TTS  中可以分别输出美式和英式两种不同的版本  

二.   实例分析

下面我们先做一个具体的实例来亲自体会一下Android的TTS的效果。

我们做一个简单的输入英文句子然后朗读出来的例子,了解Android的TTS使用方法。

在具体做之前给个AndroidTTS的API的链接,

http://androidappdocs.appspot.com/reference/android/speech/tts/package-summary.html

可以先看下大概了解TTS提供的功能。

Android TTS学习——TTS初体验

图3 Android TTS API

可以看到TTS提供了两个接口和两个类。

我们希望做的效果如下:

Android TTS学习——TTS初体验

图4 实现效果图

上面一个输入框,点击Speak按钮则朗读上面的文字内容。

创建一个Android工程,工程名为AndroidTTSDemoFirst,其中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. </ LinearLayout >   

 

Java文件的编写:

要使用TTS得实现OnInitListener接口

 

  1. public   class  AndroidTTSDemoFirst  extends  Activity  implements  OnInitListener {  
  2.      /** Called when the activity is first created. */   
  3.      @Override   
  4.      public   void  onCreate(Bundle savedInstanceState) {  
  5.          super .onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.     }  
  8.    //实现TTS初始化接口   
  9.      @Override   
  10.      public   void  onInit( int  status) {  
  11.          // TODO Auto-generated method stub   
  12.           
  13.     }  
  14. }  

 

接着定义好下面要用到的几个变量:

 

  1. private  EditText inputText =  null ;  
  2. private  Button speakBtn =  null ;  
  3.     private   static   final   int  REQ_TTS_STATUS_CHECK =  0 ;  
  4.     private   static   final  String TAG =  "TTS Demo" ;  
  5. private  TextToSpeech mTts;  

 

虽然安装Android1.6版本及之后的Android机器都默认安装了TTS引擎,但某些设备可能会因为存储容量的限制而缺少安装和语言对应的资源文件,因此在使用TTS前,得先要检查是否安装了TTS语言数据,在onCreate函数中添加以下内容:

 

  1. //检查TTS数据是否已经安装并且可用   
  2.   Intent checkIntent =  new  Intent();  
  3.   checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);  
  4.   startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);  

 

这里启动一个新的Intent去检查TTS数据是否已经安装,我们根据其返回的结果进行处理,如下所示:

 

  1. protected    void  onActivityResult( int  requestCode,  int  resultCode, Intent data) {  
  2.          if (requestCode == REQ_TTS_STATUS_CHECK)  
  3.         {  
  4.              switch  (resultCode) {  
  5.              case  TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:  
  6.                  //这个返回结果表明TTS Engine可以用   
  7.             {  
  8.                 mTts =  new  TextToSpeech( this this );  
  9.                 Log.v(TAG,  "TTS Engine is installed!" );  
  10.                   
  11.             }  
  12.                   
  13.                  break ;  
  14.              case  TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:  
  15.                  //需要的语音数据已损坏   
  16.              case  TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:  
  17.                  //缺少需要语言的语音数据   
  18.              case  TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:  
  19.                  //缺少需要语言的发音数据   
  20.             {  
  21.                  //这三种情况都表明数据有错,重新下载安装需要的数据   
  22.                 Log.v(TAG,  "Need language stuff:" +resultCode);  
  23.                 Intent dataIntent =  new  Intent();  
  24.                 dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);  
  25.                 startActivity(dataIntent);  
  26.                   
  27.             }  
  28.                  break ;  
  29.              case  TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:  
  30.                  //检查失败   
  31.              default :  
  32.                 Log.v(TAG,  "Got a failure. TTS apparently not available" );  
  33.                  break ;  
  34.             }  
  35.         }  
  36.          else   
  37.         {  
  38.              //其他Intent返回的结果   
  39.         }  
  40.         }  

 

如果返回CHECK_VOICE_DATA_PASS表示检查成功,可以新建一个   TextToSpeech   ,否则就去下载   TTS数据。

当TTS数据检测成功创建一个TextToSpeech后,就会调用接口OnInitListener中定义的回调函数

 

  1.   //实现TTS初始化接口   
  2. @Override   
  3. public   void  onInit( int  status) {  
  4.      // TODO Auto-generated method stub   
  5.      //TTS Engine初始化完成   
  6.      if (status == TextToSpeech.SUCCESS)  
  7.     {  
  8.          int  result = mTts.setLanguage(Locale.US);  
  9.          //设置发音语言   
  10.          if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
  11.          //判断语言是否可用   
  12.         {  
  13.             Log.v(TAG,  "Language is not available" );  
  14.             speakBtn.setEnabled( false );  
  15.         }  
  16.          else   
  17.         {  
  18. mTts.speak( "This is an example of speech synthesis." , TextToSpeech.QUEUE_ADD,  null );  
  19.             speakBtn.setEnabled( true );  
  20.         }  
  21.     }  
  22.       
  23. }  

 

在这个回调函数里,我们设置语言,然后就可以进行使用   TTS引擎进行操作了。

创建一个TextToSpeech是需要占用资源的,因此我们要适时的释放这个资源:

 

  1. @Override   
  2. protected   void  onPause() {  
  3.      // TODO Auto-generated method stub   
  4.      super .onPause();  
  5.      if (mTts !=  null )  
  6.          //activity暂停时也停止TTS   
  7.     {  
  8.         mTts.stop();  
  9.     }  
  10. }  
  11.   
  12. @Override   
  13. protected   void  onDestroy() {  
  14.      // TODO Auto-generated method stub   
  15.      super .onDestroy();  
  16.      //释放TTS的资源   
  17.     mTts.shutdown();  
  18.     }  

 

最后,在onCreate函数中设置   EditText和Button的使用:

 

  1.      inputText = (EditText)findViewById(R.id.inputText);  
  2.      speakBtn = (Button)findViewById(R.id.speakBtn);          
  3.   inputText.setText( "This is an example of speech synthesis." );  
  4.      speakBtn.setOnClickListener( new  OnClickListener() {  
  5.   
  6. public   void  onClick(View v) {  
  7.      // TODO Auto-generated method stub   
  8.     mTts.speak(inputText.getText().toString(), TextToSpeech.QUEUE_ADD,  null );  
  9.      //朗读输入框里的内容   
  10. }  
  11. });  

 

至此,我们的   Demo就完成了,当启动程序后,首先会朗读“ This is an example of speech synthesis in English.   ”,然后你在EditText中输入内容,点击Speak按钮就能把内容给朗读出来。

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

http://download.csdn.net/source/2610740

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

Android TTS学习——TTS初体验


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

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

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

【本文对您有帮助就好】

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

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