`
ming_fanglin
  • 浏览: 223465 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 自动朗读(TTS)

阅读更多
TextToSpeech简称 TTS,是Android 1.6版本中比较重要的新功能。将所指定的文本转成不同语言音频输出。它可以方便的嵌入到游戏或者应用程序中,增强用户体验。

  在讲解TTS API和将这项功能应用到你的实际项目中的方法之前,先对这套TTS引擎有个初步的了解。

  对TTS资源的大体了解:

  TTS engine依托于当前Android Platform所支持的几种主要的语言:English、French、German、Italian和Spanish五大语言(暂时没有我们伟大的中文,至少Google的科学家们还没有把中文玩到炉火纯青的地步,先易后难也是理所当然。)TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时,对于个别的语言版本将取决于不同的时区,例如:对于English,在TTS中可以分别输出美式和英式两种不同的版本(由此看出Google的做事风格真够细致,而正因为如此估计Google不加入中文的另外一种理由是中文的方言太多了)。

  能支持如此庞大的数据量,TTS 引擎对于资源的优化采取预加载的方法。根据一系列的参数信息(参数的用法将在后边有详细的介绍)从库中提取相应的资源,并加载到当前系统中。

  尽管当前大部分加载有Android操作系统的设备都通过这套引擎来提供TTS功能,但由于一些设备的存储空间非常有限而影响到TTS无法最大限度的发挥功能,算是当前的一个瓶颈。为此,开发引入了检测模块,让利用这项技术的应用程序或者游戏针对于不同的设备可以有相应的优化调整,从而避免由于此项功能的限制,影响到整个应用程序的使用。比较稳妥的做法是让用户自行选择是否有足够的空间或者需求来加载此项资源,下边给出一个标准的检测方法:

  Intent checkIntent = new Intent();

   checkIntent.setAction(TextToSpeech.Engine.ACTION_C HECK_TTS_DATA);

  startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);

  如果当前系统允许创建一个 “android.speech.tts.TextToSpeech” 的彩虹简谱字库 下载Object, 说明已经提供TTS功能的支持,将检测返回结果中给出“ CHECK_VOICE_DATA_PASS ” 的标记。如果系统不支持这项功能,那么用户可以选择是否加载这项功能,从而让设备支持输出多国语言的语音功能“Multi-lingual Talking”。“ACTION_INSTALL_TTS_DATA” intent将用户引入Android market中的TTS下载界面。下载完成后将自动完成安装,下边是实现这一过程的完整代码 (androidres) :

   private TextToSpeech mTts;

  protected void onActivityResult(

  int requestCode, int resultCode, Intent data) {

  if (requestCode == MY_DATA_CHECK_CODE) {

  if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {

  // sess, create the TTS instance

  mTts = new TextToSpeech(this, this);

  } else {

  // missing data, install it

  Intent installIntent = new Intent();

  installIntent.setAction(

  TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);

   startActivity(installIntent);

  }

  }

  }

  TextToSpeech实体和OnInitListener都需要引用当前Activity的Context作为构造参数。 OnInitListener()的用处是通知系统当前TTS Engine已经加载完成,并处于可用状态。

  根据需求设置语言参数:

  早在Google I/O大会上,官方给出了一段关于应用这项功能的鲜活体验,将翻译结果直接通过五种不同国家语言的语音输出。加载语言的方法非常简单:

  mTts.setLanguage(Locale.US);

  上边代码表示当前TTS实体加载美式英语。其参数并没有指示某种语言的名称,而是利用国家代码来表示,这样做的好处是不但可以确定语言的选择,而且可以根据地区的不同而有所区别。例如:英语作为最广泛被应用的语种,在多个不同的地区都有一定的差别。判断当前系统是否支持某个地区的语言资源,可以通过调用isLanguageAvailable()方法的返回值,根据返回值的描述来选择正确的处理方式。让应用某些绚丽功能的应用程序更加健壮,这个是贯穿整个开发过程都要考虑的技术环节。下边是一些应用实例 (androidres) :

  mTts.isLanguageAvailable(Locale.UK))

   mTts.isLanguageAvailable(Locale.FRANCE))

   mTts.isLanguageAvailable(new Locale("spa", "ESP")))

  如果返回值是“ TextToSpeech.LANG_COUNTRY_AVAILABLE ” 说明所选择的地区被包含在当前TTS系统中。如果系统中已经创建了TTS实体,那么可以利用isLanguageAvailable()方法来替代 Start “ACTION_CHECK_TTS_DATA ” intent 检测。当无法找到任何可用资源匹配所指定的参数时,将会返回“ TextToSpeech.LANG_MISSING_DATA ”的结果。下边给出另外两个返回其它不同状态信息的例子:

   mTts.isLanguageAvailable(Locale.CANADA_FRENCH))

   mTts.isLanguageAvailable(new Locale("spa"))

  两个语句的返回值均为“ TextToSpeech.LANG_AVAILABLE ” 。第一个是检测当前系统是否支持加拿*****语,由于系统在资源库中无法找到这个地区的法语分支,其含义是仅支持这项语言(法语),而不支持当前紫光 v4.0下载地区的语言分支。

  另外,相比于上面强制用户应用预定的语音设置,更加提倡利用Locale.getDefault() 方法根据用户默认的地区设置来选择合适的语言库。

  执行Speak的具体方法:

  根据上边的介绍,基本实现了 TextToSpeech的初始化和参数配置。下面是一个有关闹钟的应用实例,利用Speak()方法可以直接在应用程序中发挥强大的语音功能。没错,用起来就是这么简单:

  String myText1 = "This Translation is from androidRes";

  String myText2 = "I hope so, because it's time to wake up.";

  mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);

  mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);

  TTS Engine的工作原理:

  每个独立的应用程序都可以单独创建一个TTS实体,而他们需要执行的语音消息列队(Queue)都统一由TTS Engine管理和语音合成。

  名词解释:

  synthesize [snθsaz] DJ ['snθsaz] KK:to produce sounds, music or speech using electronic equipment (音响)合成

  utterances [trns] DJ [trns] KK :说话方式,语音/语调。

  每个独立的TTS实例管理语音消息列队请求的优先级和顺序等。当引用 “TextToSpeech.QUEUE_FLUSH” 调用Speak()方法时,会中断当前实例正在运行的任务(也可以理解为清除当前语音任务,转而执行新的列队任务)。引用 “TextToSpeech.QUEUE_ADD”标签的发音任务将被添加到当前任务列队之后。

  为语音任务关联Stream Type:

  在Android操作系统中所有的Audio Stream任务都是通过AudioManager类来实现,而它会针对不同的Stream Type来改变语音的播放模式。StreamType可以理解为语音的播放属性,这个属性是用户根据自己的需要在系统中配置的应用方案。如果将语音任务都清楚的分门别类,可以方便的统一管理相同类别任务的属性。基于上一个Alarm Clock例子的基础上,将Speak()方法的最后一个Null参数替换成具有实际含义的数值。这个参数的类型是HashMap,如果希望将当前的 Stream Type设置为系统中Alarm类型,对上一个例子稍作改动:

  HashMap myHashAlarm = new HashMap();

  myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STRE AM,

  String.valueOf(AudioManager.STREAM_ALARM));

   mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);

   mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);

  应用语音功能的Completion Callback:

  TTS中的Speak()的是异步调用,无论应用QUEUE_FLUSH 或者QUEUE_ADD作为参数都可以通过定义Listener监听当前任务的完成状态。可以利用这个方法追加Speak()执行之后的一些额外操作。下接下来的例子中,当完成第二次Speak()方法调用之后,利用OnUtteranceCompletedListener接口来调用其它方法:

  mTts.setOnUtteranceCompletedListener(this);

   myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STRE AM,

   String.valueOf(AudioManager.STREAM_ALARM));

   mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);

   myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTE RANCE_ID,

   "end of wakeup message ID");

  // myHashAlarm now contains two optional parameters

  mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);

  下边是定义Listener的代码,类似与监听按 CuteFTP Home 8.3.3.0054下载钮或者其它View Events的方法。在这里将会把Speak()中HashMap参数传进Listener中,作为条件的判断依据:

  public void onUtteranceCompleted(String uttId) {

  if (uttId == "end of wakeup message ID") {

  playAnnoyingMusic();

  }

  }

  “烘焙”当前实时的语音数据:

  看到烘焙两个字,就会让人联想到香喷喷的面包。软件开发要关注于是否可以最大限度的实现资源的复用,特别是针对资源有限的手机应用平台。那么对于TTS这么奢侈的应用如何才能更高效的使用资源呢?这次一起来体验比烘焙面包更加让人激动的功能,将TTS Engine输出的Audio Stream作为永久的音频文件保存在当前的存储空间中(SDCard)。这样可以对需要重复播放的某些语音内容实现快速的回放功能,从而实现国际倡导的 “减排”目的,能省就省吧!在下边的例子用通过TTS的synthesizeToFile方法,将合成的语音Stream保存在参数所指定的地址中。

  HashMap myHashRender = new HashMap();

  String wakeUpText = "Are you up yet?";

  String destFileName = "/sdcard/myAppCache/wakeUp.wav";

   myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTT ERANCE_ID, wakeUpText);

  mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName);

  当完成以上操作之后会收到系统的完成通知,同时可以像其它音频资源一样,通过 android.media.MediaPlayer方法来播放。但这有悖于TextToSpeech的应用流程,可以将刚刚输出的语音资源通过 addSpeech()的方法将其语音和文字描述一同存储于TTS库中。

  mTts.addSpeech(wakeUpText, destFileName);

  在当前的TTS Instance中,任何利用Speak()方法执行相同内容的调用都将复用刚刚所生成的音频文件。如果资源丢失或者SDCard等存储设备移除,那么系统将再次通过TTS Engine合成所指定的语音内容。

  mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm);

  回收TTS:

  当确定应用程序不再需要TTS的相关功能后,可以在Activity的OnDestroy()方法中调用shutDown()释放当前TTS实体所占用的资源。
分享到:
评论
6 楼 wv1124 2010-06-08  
想一想把我们的山寨机上的功能整一块,可能很强大奥!
5 楼 wv1124 2010-06-08  
TTS在台电MP3很不错的,不是技术不行,恐怕有其他原因!
4 楼 imcaptor 2010-04-29  
我用了,英文,中文效果很差,很难听懂。
3 楼 xintao222 2010-03-30  
我刷的1.6上面有中文tts还有粤语呢
2 楼 yzhong_sa 2010-03-26  
大哥 来一个demo试一下。。
1 楼 void1898 2010-03-24  
Sounds good...

相关推荐

    android 自动朗读功能

    在Android平台上,自动朗读功能,也称为Text-to-Speech(TTS)服务,是一种将文本转换为语音输出的技术。这种技术广泛应用于各种场景,如辅助视力障碍者使用手机、阅读电子书、智能助手对话等。本文将深入探讨...

    Android开发之自动朗读TTS用法分析

    在Android开发中,Text To Speech(TTS)是一项强大的功能,它允许应用程序将文本转换成语音,实现自动朗读。TTS技术自Android 1.6版本起被引入,为开发者提供了新的交互方式,尤其在增强用户体验方面发挥了重要作用...

    Android TTS测试

    Android提供了自动朗读支持。自动朗读支持可以对指定文本内容进行朗读,从而发生声音;不仅如此,Android的自动朗读支持还 * 允许把文本对应的音频录制成音频文件,方便以后播放。这种自动朗读支持的英文名称为Text...

    Android开发之文本内容自动朗读功能实现方法

    本文实例讲述了Android开发之文本内容自动朗读功能实现方法。分享给大家供大家参考,具体如下: Android提供了自动朗读支持。自动朗读支持可以对指定文本内容进行朗读,从而发生声音;不仅如此,Android的自动朗读...

    android tts demo

    自Android 1.6版本开始,系统就已经内置了对TTS的支持,使得开发者可以方便地集成到自己的应用中,为用户提供朗读服务,尤其适用于阅读障碍、视力不佳或者驾驶等场景。 在Android中,TTS的使用主要包括以下几个关键...

    语音朗读 支持英文

    在IT领域,语音朗读技术,也称为文本转语音(TTS, Text-to-Speech),是一种将文字信息转化为可听见的语音输出的技术。在移动应用开发中,尤其是在Android平台上,语音朗读功能常用于帮助视力障碍用户或者为用户提供...

    基于Android的语音朗读-语音识别-语音.zip

    在Android平台上,语音技术已经成为移动应用的一个重要组成部分,它包括语音朗读(Text-to-Speech, TTS)和语音识别(Speech Recognition)。本资源包"基于Android的语音朗读-语音识别-语音.zip"提供了相关的代码...

    安卓Android源码——调用安卓自带文本朗读.zip

    在本项目"安卓Android源码——调用安卓自带文本朗读.zip"中,重点涉及了如何利用Android系统内置的文本转语音(Text-to-Speech, TTS)服务来实现文本的朗读功能。以下是对这一主题的详细解释: 1. **Android Text-...

    TTS语音朗读实例.rar

    TTS技术允许程序将文本转换为可听见的语音输出,这对于视觉障碍用户、或者需要自动化语音反馈的系统来说尤其有用。 描述中提到的"发音线程"是关键概念。在多线程编程中,每个发音任务被视为一个独立的工作单元,...

    安卓Android源码——语音朗读-语音识别-语音.zip

    在安卓(Android)平台上,开发语音相关的应用是一个常见的需求,涉及到的主要技术有语音朗读(Text-to-Speech, TTS)和语音识别(Speech Recognition)。本文将深入探讨这两个技术,并结合给定的压缩包文件“安卓...

    Android应用源码之调用安卓自带文本朗读.zip

    在Android应用开发中,有时我们需要实现一个功能,让应用程序能够自动朗读屏幕上的文本,这在教育、无障碍或辅助功能方面特别有用。本教程将详细讲解如何利用Android系统的内置文本朗读功能,即Text-to-Speech(TTS...

    罕见的自动读QQ消息的软件

    QQ消息自动朗读软件是一种创新的技术应用,它旨在帮助用户在忙碌时或不方便查看屏幕时,也能及时了解接收到的QQ消息。这种软件通过语音合成技术将文字信息转化为语音输出,实现了无需盯着屏幕就能获取消息的功能,...

    科大讯飞语音引擎3.0+TTS使用.zip

    4. 自动驾驶:在自动驾驶汽车中,TTS技术可以将导航信息转化为语音,确保驾驶员安全驾驶。 5. 客服系统:自动语音应答系统采用TTS技术,提供24小时不间断的服务。 四、TTS.txt文件分析 在提供的压缩包中,"TTS.txt...

    调用安卓自带文本朗读.zip

    【标题】"调用安卓自带文本朗读"指的是在Android应用程序中使用系统内置的文本转语音(TTS,Text-to-Speech)服务来将文本内容转化为可听见的语音输出。这是Android平台上的一项重要功能,尤其对于视力障碍或者阅读...

    语音朗读易模块 1.0.rar

    它集成了先进的文本转语音(TTS,Text-to-Speech)技术,能够将输入的文本转化为自然流畅的语音输出,极大地提高了信息传达的效率,尤其适用于有视力障碍或者阅读不便的用户,以及需要自动化语音播报的场景。...

    安卓Android源码——androidtalk_2010_11_17语音朗读-语音识别-语音.zip

    这篇文档将深入探讨Android操作系统中的语音相关功能,包括语音朗读和语音识别,基于提供的压缩包文件信息。首先,我们来看看这些文件可能包含的内容: 1. Androidtalk Project Report.mm:这可能是一个项目报告,...

    TTS_master.zip

    讯飞语音合成(支持安卓5.0).apk是科大讯飞针对Android 5.0及以上版本开发的TTS引擎,具备高效的运行效率和良好的兼容性。它不仅提供标准的普通话服务,还支持各地方言和多种外语,满足多样化的语音需求。此外,其...

    语音朗读-语音识别-语音.zip

    最后,调用`speak()`方法传入要朗读的文本和相关参数,系统就会自动将其读出。 语音识别,即Speech-to-Text,是将用户的语音输入转换为文本的过程。在Android中,Google提供了SpeechRecognizer类来支持这一功能。...

Global site tag (gtag.js) - Google Analytics