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

TTS语音朗读

 
阅读更多

TextToSpeech简称 TTS,是Android 1.6版本中比较重要的新功能。将所指定的文本转成不同语言音频输出。它可以方便的嵌入到游戏或者应用程序 中,增强用户体验。
在讲解TTS API和将这项功能应用到你的实际项目中的方法之前,先对这套TTS引擎有个初步的了解。

对TTS资源的大体了解:

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

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

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

Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_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.com) :


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) {
// success, 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.com) :


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 ” 。第一个是检测当前系统是否支持加拿*****语,由于系统在资源库中无法找到这个地区的法语分支,其含义是仅支持这项语言(法语),而不支持当前地区的语言分支。

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

执行Speak的具体方法:

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


String myText1 = "This Translation is from androidRes.com";
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 [ˈsɪnθəsaɪz] DJ ['sɪnθəˈsaɪz] KK:to produce sounds, music or speech using electronic equipment (音响)合成

utterances [ˈʌtərəns] DJ [ˈʌtərəns] 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_STREAM,
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_STREAM,
String.valueOf(AudioManager.STREAM_ALARM));
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
"end of wakeup message ID");
// myHashAlarm now contains two optional parameters
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);
下边是定义Listener的代码,类似与监听按钮或者其它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_UTTERANCE_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实体所占用的资源。

分享到:
评论

相关推荐

    基于TTS语音朗读(VB源代码)

    基于TTS语音朗读(VB源代码)基于TTS语音朗读(VB源代码)基于TTS语音朗读(VB源代码)基于TTS语音朗读(VB源代码)基于TTS语音朗读(VB源代码)基于TTS语音朗读(VB源代码)基于TTS语音朗读(VB源代码)基于TTS语音朗读(VB源代码)...

    TTS语音朗读软件

    《TTS语音朗读软件详解》 TTS(Text-to-Speech)技术,即文本转语音,是一种将计算机上的文字信息转化为可听见的语音输出的技术。在本文中,我们将深入探讨一个基于MFC(Microsoft Foundation Classes)框架,利用...

    vb6_TTS语音朗读sdk自动选中文语音库.zip

    本项目"vb6_TTS语音朗读sdk自动选中文语音库.zip"就是利用VB6结合TTS技术,实现了一个能够自动选择中文语音库的语音朗读SDK。 SAPI(Speech Application Programming Interface)是由微软提供的一个接口,使得...

    科大讯飞离线TTS语音朗读引擎 windws sdk ,c代码 封装成dll使用C#调用(unity插件)

    科大讯飞离线TTS语音朗读引擎 windws sdk ,c代码 封装成dll使用C#调用 由于讯飞的离线sdk与appid 是捆绑的,所以需要在讯飞开发平台生成自己的应用和appid 并下载 windows 离线语音合成 sdk ,能够运行 demo 里的 ...

    TTS语音朗读实例.rar

    标题中的"TTS语音朗读实例"表明这是一个关于文本转语音(Text To Speech,简称TTS)技术的应用案例,主要集中在C#编程语言中。TTS技术允许程序将文本转换为可听见的语音输出,这对于视觉障碍用户、或者需要自动化...

    Qt TTS 语音朗读 文本 朗读 为我们的应用增加嘴巴

    Qt TTS 语音朗读 文本 朗读 为我们的应用增加嘴巴; TTS 语音朗读 是开发中常用的功能,Qt已经给封装完成,我们只需要调用; 博文:https://blog.csdn.net/q610098308/article/details/130949726

    人机交互-TTS语音朗读.doc

    人机交互-TTS语音朗读.doc

    TTS语音朗读程序(源码+程序)

    delphi中开发需要先导入TTS的ActiveX控件, 方法如下:在Delphi开发界面的Project菜单下Import Type Library, 对话框里会有一个 Micosoft Speech Object Library ...朗读中文需要例如NeoSpeech.TTS系列等的中文语音库.

    微软TTS语音引擎实现文本朗读代码

    TTS语音引擎有微软TTS语音引擎等。微软TTS语音引擎提供了Windows Speech SDK开发包供编程者使用。Windows Speech SDK包含语音合成SS引擎和语音识别SR引擎两种,语音合成引擎用于将文字转换成语音输出,语音识别...

    易语言TTS引擎语音朗读

    在“易语言TTS引擎语音朗读”这个主题中,我们主要会探讨以下几个核心知识点: 1. **TTS引擎**:TTS引擎是实现文本到语音的核心组件,它负责解析文本,生成音频流并播放出来。易语言中的TTS引擎可能提供了丰富的...

    用delphi开发基于ms的tts语音朗读程序

    在本文中,我们将深入探讨如何使用Delphi开发一个基于Microsoft Speech API (SAPI) 的文本转语音(TTS)朗读程序。SAPI是微软提供的一个强大的接口,它允许开发者将文本转换为自然、流畅的语音输出。Delphi,作为一款...

    易语言TTS引擎语音朗读源码

    易语言TTS引擎语音朗读源码是一种使用易语言编程实现的文本转语音(Text-to-Speech,简称TTS)技术。易语言是中国自主研发的一种简单易学的编程语言,其设计目标是降低编程门槛,让普通用户也能进行软件开发。在...

    TTS引擎语音朗读.rar

    在本压缩包文件“TTS引擎语音朗读.rar”中,包含的是易语言编写的TTS引擎语音朗读的源码,这为我们提供了一个深入了解和学习TTS技术的实践平台。 首先,我们需要理解TTS引擎的工作原理。TTS系统通常由三个主要部分...

    android实现语音朗读 支持中文朗读 TTS 讯飞语音库

    android下实现对文本的语音朗读,TTS技术,支持中文朗读。Android SDK 4.04下测试通过。 附件包含测试源代码及语音库文件 这是语音合成测试工程,如果需要朗读中文请安装中文引擎。我采用的是讯飞语音库,手机版本...

    易语言源码易语言TTS引擎语音朗读源码.rar

    在本压缩包“易语言源码易语言TTS引擎语音朗读源码.rar”中,包含的是易语言编写的文本转语音(Text-to-Speech,简称TTS)引擎的源代码,这个引擎能够将文字转化为语音进行朗读。 TTS引擎是计算机科学中的一个重要...

    VB版TTS语音朗读功能的简单示例

    内容索引:VB源码,多媒体技术,语音 VB版TTS语音朗读功能的简单示例,有意思的程序,朗读时小人还有动画表情,你可以随意输入一句英语,它都能正确朗读出来,唯一遗憾的是如果你电脑上没有安装  TTS中文引擎,那它就...

    文本语音朗读源码(TTS)

    文本语音朗读(TTS,Text-to-Speech)技术是一种将文字信息转化为可听见的语音输出的技术,广泛应用于各种场景,如智能助手、有声读物、无障碍设施等。在这个项目中,我们有一个名为“文本语音朗读源码(TTS)”的...

    免费共享版-逍遥语音朗读工具

    逍遥语音朗读工具是一款专为用户打造的文字转语音(TTS)应用,它集成了多种功能,如语音朗读、语音报时以及语音提醒,帮助用户实现文本到音频的便捷转换,尤其适合需要将文字内容转化为语音输出的场景。这款免费...

Global site tag (gtag.js) - Google Analytics