Android TTS学习——用五种外语说出“我爱你”

本文详细介绍了如何在Android应用中使用TTS(Text To Speech)功能,让应用能够用英语、法语、德语、意大利语和西班牙语这五种外语表达'我爱你'。通过增加Spinner控件实现语言选择,用户可以切换不同语言进行语音合成。文章还讲解了相关TTS API的使用,包括初始化、设置语言和语音合成的方法。

一. 简单介绍

在上一篇里

http://blog.youkuaiyun.com/ichliebephone/archive/2010/08/10/5802044.aspx

我们简单的介绍了Android里的TTS功能并实现了一个最简单的Demo例子--AndroidTTSDemoFirst,在这篇文章中我们将具体介绍用到的TTS API,并给上一个Demo增加语言选择功能,可以使用TTS引擎支持的 English French German Italian Spanish 5大语言来进行相应的语音合成,并用这 5 种外语向她说出“我爱你”。

二. 实例分析

我们希望做的效果如下:

图1 实现效果图

有了上一个例子做基础,这个Demo比较好实现,主要是增加了一个语言选择的控件Spinner,选择不同的语言,就会用对应的语言表达“我爱你”。

接下来就边实现这个Demo边讲解用到的TTS API。也是先创建一个Android工程,工程名为AndroidTTSDemoSecond,其中SDK必须选择1.6版本及以上。

其中Main.xml文件也还是很简单,在前一个AndroidTTSDemoFirst例子的基础上增加了一个Spinner控件, 如下所示:

Java文件的编写:

因为这个Demo例子只是在上一个AndroidTTSDemoFirst基础上的增加,因此可以使用上一个编写的java文件,只要把class名字改为AndroidTTSDemoSecond,如下所示:

下面简单介绍下上面代码中和TTS相关的一些API使用。

首先是实现 OnInitListener 这个接口,这个接口中只有一个抽象函数 void  onInit( int  status) ,在 TextToSpeech 引擎初始化完成后调用,在这个函数里就可以根据状态 status(为 TextToSpeech.SUCCESS 或者 TextToSpeech. Error )判断TTS 初始化成功与否进行相应的操作。


 

接着在使用TTS 时,会先启动一个 Activity 检查 TTS 引擎需要的 TTS 数据是否已经安装并且可用, checkIntent. setAction ( TextToSpeech .Engine. ACTION_CHECK_TTS_DATA );

这个 Activity会返回如下结果之一: CHECK_VOICE_DATA_PASS CHECK_VOICE_DATA_FAIL CHECK_VOICE_DATA_BAD_DATA CHECK_VOICE_DATA_MISSING_DATA 或者 CHECK_VOICE_DATA_MISSING_VOLUME

只有第一个结果 CHECK_VOICE_DATA_PASS 表明 TTS数据可用,其他都是数据不可用的结果,可以启动一个 Activity 去安装需要的 TTS 数据,

dataIntent.setAction(TextToSpeech.Engine. ACTION_INSTALL_TTS_DATA );


 

当数据可用时,就可以创建一个TextToSpeech 实例,

public TextToSpeech ( Context  context,  TextToSpeech.OnInitListener  listener)

这里需要两个参数,一个是 TTS 实例运行的 Context

另一个是初始化接口的实现,在实例的创建过程中,如果TTS 引擎没有运行的话,则会初始化 TTS 引擎,并且在初始化完成后调用其第二个参数 listener


 

有了 TextToSpeech实例,接下来就可以对文本进行语音合成并发音了,对应的 API

public int speak ( String  text, int queueMode,  HashMap < String String > params)

这里需要三个参数,第一个为要合成的文本;

第二个为使用 TTS队列的方式,因为使用TTS合成语音时需要时间,TTS引擎就会把还没有轮到的部分放在其队列中排队,后来的内容有两种使用队列的方式: QUEUE_ADD   或者   QUEUE_FLUSH QUEUE_ADD 表示把当前需要合成的内容添加到 TTS队列的后面,等前面的都完成了后再轮到他, QUEUE_FLUSH 表示清除队列中原有的内容,直接使 TTS引擎对当前内容进行语音合成,一般来说适合比较紧急的情况使用,但因为在 Android 中可能不止你一个程序使用 TTS 引擎,因此为了不破坏其他人的数据,建议使用 QUEUE_ADD 参数;

第三个为键值对表示的一个参数,我们后面再来介绍,目前可以使其为 null

 

前半部分简单的介绍了前一个Demo 用到的 API ,下半部分添加这个 Demo 中新的语言选择部分。

首先为 Spinner 控件 新增加两个变量,

接着添加 Spinner 的使用,

TTS 相关的部分是 Spinner 控件的 item selected事件的处理,

在选择不同的 item时,为 inputText 设置不同语言“我爱你”对应的文本,并且为 TTS实例设置语言。

TTS 引擎设置语言的 API

public int setLanguage ( Locale  loc)

使用Locale 这个表示语言及国家区域的类来设置语言,目前支持 English French German Italian Spanish 5大语言, 返回的结果为

LANG_AVAILABLE LANG_COUNTRY_AVAILABLE LANG_COUNTRY_VAR_AVAILABLE LANG_MISSING_DATA   LANG_NOT_SUPPORTED 。其中 LANG_MISSING_DATA   LANG_NOT_SUPPORTED 表示无法使用当前进行设置的语言,另外的几个表示设置的语言有效。

    至此,增加了语言选择的新的Demo 完成了,程序运行后可以选择不同的语言说出“我爱你”,简单效果图如下所示:

简单效果图

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

    http://download.youkuaiyun.com/source/2611687

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

 

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值