Android TTS学习——继续爱的表白

一. 简单介绍

在上一篇里

http://blog.csdn.net/ichliebephone/archive/2010/08/10/5802739.aspx

我们讲到了TTS 最主要的一个API

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

其中我们介绍了前两个参数,第三个参数设置了null ,并没有具体介绍。

而且我们在介绍Android TTS 提供的功能时,说到TTS 提供了两个接口,第一个初始化接口OnInitListener 我们已经使用过了,而第二个接口OnUtteranceCompletedListener 我们还没有使用到。

首先我们就来简单介绍一下这个接口的使用方式。TTS 引擎进行语音合成的每个语音片段叫做"utterance ", 而且在送给speak 函数进行语音合成时,可以为这次的语音片段"utterance " 设置一个IDOnUtteranceCompletedListener 这个接口里定义了一个回调函数,当设置了ID 的语音片段"utterance " 语音合成结束后就会调用这个回调函数。然后我们就可以在这回调函数里进行我们需要的操作,比如在某个特定ID 的语音片段结束后播放音乐,或者跟踪记录哪些文本内容已经被朗读等。

       下面利用这个接口的功能完成一个Demo 例子,朗读一段爱的表白,并且在程序退出后可以记住这次表白到哪了,下次在她再次打开程序时,就可以继续这爱的表白。

二. 实例分析

我们希望做的效果如下:

1 实现效果图

在界面上体现不出这个Demo 的特点,除了一长串英文的爱的表白外,还有一个Speak 按钮。但当点击了Speak 按钮开始朗读上面的表白后,在没有读完就退出程序后,下次再启动后还会接着上次的继续朗读。

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

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

Java 文件的编写:

这次要实现 OnInitListener OnUtteranceCompletedListener 两个接口

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

因为通过前面的两个 Demo ,我们知道已经安装了 TTS 需要的数据,因此这里我们可以在 onCreate 函数中直接创建一个 TextToSpeech 实例,

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

和前面的 Demo 相比,这里多了一句 mTts .setOnUtteranceCompletedListener( this );

就是设置语音片段结束后的回调函数。

 

接着在 onCreate 函数中设置 EditText Button 的使用:

SpeakBtn onClick 事件中,先把输入框中的内容按 ',' '.' 分割成一个个短的部分并保存在字符串数组中,然后调用我们写的 speakText() 函数来进行朗读。

speakText() 函数的定义如下:

lastUtterance 变量保存上一个语音片段的 ID params HashMap<String, String> 类型,键值对形式的变量,在这里我们的键 name TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID ,是一个 UTTERANCE_ID ,值 value String.valueOf(i) ,其实只要是任何字符串变量都行,为了方便我们设置的为有顺序的数字。然后把这个键值对变量添加给 speak 函数, TTS 引擎就会在这个语音片段朗读结束后通知我们,调用设置好的回调函数 onUtteranceCompleted(String utteranceId) ,这个回调函数的内容如下:

很简单,主要就是把当前刚结束的这个语音片段 ID--utteranceId 保存到 lastUtterance 变量中,这样在程序退出时,我们就可以保存这个变量,

首先是释放 TTS 资源,然后把 lastUtterance 变量的值以键值对的方式保存在系统中,这样下次启动程序时 lastUtterance 就可以从系统中读取上次退出时保存的值。在 onCreate 函数中添加获取保存的 lastUtterance 代码:

至此,这个 Demo 完成了,运行后点击 Speak 按钮会朗读文本框中的经典的爱的表白,一小段一小段朗读,每朗读完一小段程序都会调用回调函数 onUtteranceCompleted 记录刚朗读完的那个小段的 ID ,当所有的表白没朗读完就按返回退出程序时,程序在 onDestroy() 里把记录着的片段 ID 保存在系统中,这样下次再次打开程序时就可以接着上次继续这爱的表白。

 

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章