一. 简单介绍
在上一篇里
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 " 设置一个ID 。OnUtteranceCompletedListener 这个接口里定义了一个回调函数,当设置了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篇”