<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Android Resource &#124; 资源 资讯 教程 &#187; TTS</title>
	<atom:link href="http://www.androidres.com/index.php/tag/tts/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.androidres.com</link>
	<description>Discuss developing Android applications using the Android framework and Collect android resource</description>
	<lastBuildDate>Tue, 12 Jan 2010 10:03:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<!-- Easy AdSense V2.82 -->
<!-- Post[count: 1] -->
<div class="ezAdsense adsense adsense-leadin" style="text-align:center;margin:12px;"><script type="text/javascript"><!--
google_ad_client = "pub-4703322803494425";
/* 468x60, Top_SinglePost */
google_ad_slot = "7939142022";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>	<item>
		<title>介绍Text-To-Speech在Android中的用法</title>
		<link>http://www.androidres.com/index.php/2009/09/29/an-introduction-to-text-to-speech-in-android/</link>
		<comments>http://www.androidres.com/index.php/2009/09/29/an-introduction-to-text-to-speech-in-android/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 16:15:01 +0000</pubDate>
		<dc:creator>EGGer</dc:creator>
				<category><![CDATA[Resource]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Text-To-Speech]]></category>
		<category><![CDATA[TTS]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=663</guid>
		<description><![CDATA[
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_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) {
       [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-664" style="border: 3px solid #e6e6e6;" title="Text-To-Speech" src="http://www.androidres.com/wp-content/uploads/2009/09/TextToSpeech.jpg" alt="Text-To-Speech" width="303" height="400" /></p>
<p>TextToSpeech简称 TTS，是<a target="_blank" href="http://android-developers.blogspot.com/2009/09/android-16-sdk-is-here.html" target="_blank">Android 1.6版本</a>中比较重要的新功能。将所指定的文本转成不同语言音频输出。它可以方便的嵌入到游戏或者应用程序中，增强用户体验。</p>
<p>在讲解TTS API和将这项功能应用到你的实际项目中的方法之前，先对这套TTS引擎有个初步的了解。<span id="more-663"></span></p>
<p><strong>对TTS资源的大体了解：</strong></p>
<p style="text-align: left;">TTS engine依托于当前Android Platform所支持的几种主要的语言：English、French、German、Italian和Spanish五大语言（暂时没有我们伟大的中文，至少Google的科学家们还没有把中文玩到炉火纯青的地步，先易后难也是理所当然。）TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时，对于个别的语言版本将取决于不同的时区，例如：对于English，在TTS中可以分别输出美式和英式两种不同的版本（由此看出Google的做事风格真够细致，而正因为如此估计Google不加入中文的另外一种理由是中文的方言太多了）。</p>
<p style="text-align: left;">能支持如此庞大的数据量，TTS 引擎对于资源的优化采取预加载的方法。根据一系列的参数信息（参数的用法将在后边有详细的介绍）从库中提取相应的资源，并加载到当前系统中。</p>
<p style="text-align: left;">尽管当前大部分加载有Android操作系统的设备都通过这套引擎来提供TTS功能，但由于一些设备的存储空间非常有限而影响到TTS无法最大限度的发挥功能，算是当前的一个瓶颈。为此，开发小组引入了检测模块，让利用这项技术的应用程序或者游戏针对于不同的设备可以有相应的优化调整，从而避免由于此项功能的限制，影响到整个应用程序的使用。比较稳妥的做法是让用户自行选择是否有足够的空间或者需求来加载此项资源，下边给出一个标准的检测方法：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);</pre>
<p style="text-align: left;">如果当前系统允许创建一个 “<span style="color: #008000;"><code>android.speech.tts.TextToSpeech</code></span>” 的Object, 说明已经提供TTS功能的支持，将检测返回结果中给出“ <span style="color: #008000;"><code>CHECK_VOICE_DATA_PASS</code></span> ” 的标记。如果系统不支持这项功能，那么用户可以选择是否加载这项功能，从而让设备支持输出多国语言的语音功能“Multi-lingual Talking”。“<span style="color: #008000;">ACTION_INSTALL_TTS_DATA</span>” intent将用户引入Android market中的TTS下载界面。下载完成后将自动完成安装，下边是实现这一过程的完整代码 (androidres.com) ：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">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);
        }
    }
}</pre>
<p style="text-align: left;">TextToSpeech实体和OnInitListener都需要引用当前Activity的Context作为构造参数。OnInitListener（）的用处是通知系统当前TTS Engine已经加载完成，并处于可用状态。</p>
<p style="text-align: left;"><strong>根据需求设置语言参数：</strong></p>
<p style="text-align: left;">早在Google I/O大会上，官方给出了一段关于应用这项功能的鲜活体验，将翻译结果直接通过五种不同国家语言的语音输出。加载语言的方法非常简单：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.setLanguage(Locale.US);</pre>
<p style="text-align: left;">上边代码表示当前TTS实体加载美式英语。其参数并没有指示某种语言的名称，而是利用国家代码来表示，这样做的好处是不但可以确定语言的选择，而且可以根据地区的不同而有所区别。例如：英语作为最广泛被应用的语种，在多个不同的地区都有一定的差别。判断当前系统是否支持某个地区的语言资源，可以通过调用isLanguageAvailable()方法的返回值，根据返回值的描述来选择正确的处理方式。让应用某些绚丽功能的应用程序更加健壮，这个是贯穿整个开发过程都要考虑的技术环节。下边是一些应用实例 (androidres.com) ：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.isLanguageAvailable(Locale.UK))
mTts.isLanguageAvailable(Locale.FRANCE))
mTts.isLanguageAvailable(new Locale("spa", "ESP")))</pre>
<p style="text-align: left;">如果返回值是 “<span style="color: #008000;"> TextToSpeech.LANG_COUNTRY_AVAILABLE</span> ” 说明所选择的地区被包含在当前TTS系统中。如果系统中已经创建了TTS实体，那么可以利用<code><span style="color: #008000;">isLanguageAvailable()</span>方法来替代 Start </code><code>“<span style="color: #008000;">ACTION_CHECK_TTS_DATA</span></code> ” intent 检测。当无法找到任何可用资源匹配所指定的参数时，将会返回 “<code><span style="color: #008000;"> TextToSpeech.LANG_MISSING_DATA</span> ”的结果。</code>下边给出另外两个返回其它不同状态信息的例子：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.isLanguageAvailable(Locale.CANADA_FRENCH))
mTts.isLanguageAvailable(new Locale("spa"))</pre>
<p style="text-align: left;">两个语句的返回值均为 “ <span style="color: #008000;"><code>TextToSpeech.LANG_AVAILABLE</code></span> ” 。第一个是检测当前系统是否支持加拿大法语，由于系统在资源库中无法找到这个地区的法语分支，其含义是仅支持这项语言（法语），而不支持当前地区的语言分支。</p>
<p style="text-align: left;">另外，相比于上面强制用户应用预定的语音设置，更加提倡利用Locale.getDefault()方法根据用户默认的地区设置来选择合适的语言库。</p>
<p style="text-align: left;"><strong>执行Speak的具体方法：</strong></p>
<p style="text-align: left;">根据上边的介绍，基本实现了TextToSpeech的初始化和参数配置。下面是一个有关闹钟的应用实例，利用Speak()方法可以直接在应用程序中发挥强大的语音功能。没错，用起来就是这么简单：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">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);</pre>
<p style="text-align: left;"><strong>TTS Engine的工作原理：</strong></p>
<p style="text-align: left;">每个独立的应用程序都可以单独创建一个TTS实体，而他们需要执行的语音消息列队（Queue）都统一由TTS Engine管理和语音合成。</p>
<blockquote>
<p style="text-align: left;"><span style="color: #808000;"><strong>名词解释：</strong></span></p>
<p style="text-align: left;"><span style="color: #808080;"><strong>synthesize </strong></span><span style="color: #808000;">[ˈsɪnθəsaɪz] <span title="Phonetic">DJ</span> ['sɪnθəˈsaɪz] <span title="Phonetic">KK</span></span>：to produce sounds, music or speech using electronic equipment （音响）合成</p>
<p style="text-align: left;"><strong><span style="color: #808080;">utterances</span></strong> <span style="color: #808000;">[ˈʌtərəns] DJ [ˈʌtərəns] KK </span>：说话方式，语音/语调。</p>
</blockquote>
<p style="text-align: left;">每个独立的TTS实例管理语音消息列队请求的优先级和顺序等。当引用 “<span style="color: #008000;">TextToSpeech.QUEUE_FLUSH</span>” 调用Speak（）方法时，会中断当前实例正在运行的任务（也可以理解为清除当前语音任务，转而执行新的列队任务）。引用 “<span style="color: #008000;">TextToSpeech.QUEUE_ADD</span>”标签的发音任务将被添加到当前任务列队之后。</p>
<p style="text-align: left;"><strong>为语音任务关联Stream Type：</strong></p>
<p style="text-align: left;">在Ａｎｄｒｏｉｄ操作系统中所有的Ａｕｄｉｏ　Ｓｔｒｅａｍ任务都是通过ＡｕｄｉｏＭａｎａｇｅｒ类来实现，而它会针对不同的Ｓｔｒｅａｍ　Ｔｙｐｅ来改变语音的播放模式。<a target="_blank" href="http://developer.android.com/reference/android/media/AudioManager.html" target="_blank">StreamＴｙｐｅ</a>可以理解为语音的播放属性，这个属性是用户根据自己的需要在系统中配置的应用方案。如果将语音任务都清楚的分门别类，可以方便的统一管理相同类别任务的属性。基于上一个<a href="http://www.androidres.com/index.php/2009/09/29/an-introductio…ech-in-android/">Alarm Clock</a>例子的基础上，将Speak()方法的最后一个Null参数替换成具有实际含义的数值。这个参数的类型是HashMap，如果希望将当前的Stream Type设置为系统中Alarm类型，对上一个例子稍作改动：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">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);</pre>
<p style="text-align: left;"><strong>应用语音功能的Completion Callback：</strong></p>
<p style="text-align: left;">TTS中的Speak()的是异步调用，无论应用<span style="color: #008000;"><code>QUEUE_FLUSH</code> </span><code>或者<span style="color: #008000;">QUEUE_ADD</span>作为参数都可以通过定义Listener监听当前任务的完成状态。可以利用这个方法追加Speak()执行之后的一些额外操作。下接下来的例子中，当完成第二次Speak()方法调用之后，利用<span style="color: #008000;">O</span></code><code><span style="color: #008000;">nUtteranceCompletedListener</span>接口</code><code>来调用其它方法：</code></p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">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);</pre>
<p style="text-align: left;">下边是定义Listener的代码，类似与监听按钮或者其它View Events的方法。在这里将会把Speak()中HashMap参数传进Listener中，作为条件的判断依据：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">public void onUtteranceCompleted(String uttId) {
    if (uttId == "end of wakeup message ID") {
        playAnnoyingMusic();
    }
}</pre>
<p style="text-align: left;"><strong>“烘焙”当前实时的语音数据：</strong></p>
<p style="text-align: left;">看到烘焙两个字，就会让人联想到香喷喷的面包。软件开发要关注于是否可以最大限度的实现资源的复用，特别是针对资源有限的手机应用平台。那么对于TTS这么奢侈的应用如何才能更高效的使用资源呢？这次一起来体验比烘焙面包更加让人激动的功能，将TTS Engine输出的<a target="_blank" href="http://developer.android.com/guide/topics/media/index.html" target="_blank"><span style="color: #008000;">Audio Stream</span></a>作为永久的音频文件保存在当前的存储空间中(<a target="_blank" href="../?p=128" target="_blank">SDCard</a>)。这样可以对需要重复播放的某些语音内容实现快速的回放功能，从而实现国际倡导的“减排”目的，能省就省吧！在下边的例子用通过TTS的synthesizeToFile方法，将合成的语音Stream保存在参数所指定的地址中。</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">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);</pre>
<p style="text-align: left;">当完成以上操作之后会收到系统的完成通知，同时可以像其它音频资源一样，通过<a target="_blank" title="MediaPlayer documentation on Android Developers" href="http://developer.android.com/reference/android/media/MediaPlayer.html">android.media.MediaPlayer</a>方法来播放。但这有悖于TextToSpeech的应用流程，可以将刚刚输出的语音资源通过addSpeech()的方法将其语音和文字描述一同存储于TTS库中。</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.addSpeech(wakeUpText, destFileName);</pre>
<p style="text-align: left;">在当前的TTS Instance中，任何利用Speak()方法执行相同内容的调用都将复用刚刚所生成的音频文件。如果资源丢失或者SDCard等存储设备移除，那么系统将再次通过TTS Engine合成所指定的语音内容。</p>
<pre class="brush: java; smart-tabs: true;toolbar: false" style="text-align: left;">mTts.speak(wakeUpText, TextToSpeech.QUEUE_ADD, myHashAlarm);</pre>
<p style="text-align: left;"><strong>回收TTS：</strong></p>
<p style="text-align: left;">当确定应用程序不再需要TTS的相关功能后，可以在<a target="_blank" href="http://www.androidres.com/index.php/2009/02/09/activity/" target="_blank"><span style="color: #008000;">Activity</span></a>的<span style="color: #008000;">OnDestroy()</span>方法中调用<a href="http://developer.android.com/reference/android/speech/tts/TextToSpeech.html#shutdown()" target="_blank"><span style="color: #008000;">shutDown()</span></a>释放当前TTS实体所占用的资源。</p>
<p style="text-align: left;"><strong>杂谈：</strong></p>
<p style="text-align: left;">想必在你的脑袋中已经冒出好多可以很好利用这个功能的Idea！那么现在就停止想象，开始付诸于行动吧！无论是给手机用户带来方便，或是提升游戏体验等。Let&#8217;s move!</p>
<p style="text-align: left;">查看原文：<a target="_blank" href="http://android-developers.blogspot.com/2009/09/introduction-to-text-to-speech-in.html" target="_blank">Android官方Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/09/29/an-introduction-to-text-to-speech-in-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开发Android APPs的语音功能</title>
		<link>http://www.androidres.com/index.php/2009/02/25/android-apps-voice-feature/</link>
		<comments>http://www.androidres.com/index.php/2009/02/25/android-apps-voice-feature/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 18:20:22 +0000</pubDate>
		<dc:creator>Edgar Sun</dc:creator>
				<category><![CDATA[Resource]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Speech]]></category>
		<category><![CDATA[TTS]]></category>

		<guid isPermaLink="false">http://www.androidres.com/?p=246</guid>
		<description><![CDATA[让你的程序开口说话，没错！接下来讲解如何通过第三方资源为你的应用程序实现语音功能。这个语音库的名字是Text-To-Speech (以下简称TTS)，开发者可以通过调用这个这个语音库实现将字符串转http://www.androidres.com/wp-admin/edit-pages.php为声音。
在讲解具体实现方法之前，需要配置Esclipse的设定：
Project > Properties > Java Build Path > Libraries and click on
"Add External JARs..." Then add in the TTS_library_stub.jar file
Download This Library


使用eSpeak引擎前需要为Emulator添加虚拟SD Card。创建虚拟SD Card的方法

下载tts_market.apk 将这个APK安装到Emulator （启动Emulator的前提下，在CLS中输入&#8221;adb install ***.APK &#8220;）。
当程序运行后也可以通过参数控制是否需要弹出安装tts_market.apk的提示对话框：

下边通过几行简单的代码来实现调用语音库的方法：
1. 创建一个新的Android项目，可以随意命名为你认为有意义的名字，比如“I am Well-E”等等
2. 应用上边所提到的方法为当前的项目添加Library。
3. 在主程序.java中添加如下代码：
import com.google.tts.TTS;
介于onCreate()和类之间声明空的TTS
private TTS myTts;
在onCreat()中创建TTS的实体
myTts = new TTS(this, ttsInitListener, true);
在onCreat(）后边定义一个新函数

private TTS.InitListener ttsInitListener = new TTS.InitListener() {
       [...]]]></description>
			<content:encoded><![CDATA[<p>让你的程序开口说话，没错！接下来讲解如何通过第三方资源为你的应用程序实现语音功能。这个语音库的名字是Text-To-Speech (以下简称TTS)，开发者可以通过调用这个这个语音库实现将字符串转http://www.androidres.com/wp-admin/edit-pages.php为声音。<br /><span id="more-246"></span><br />
在讲解具体实现方法之前，需要配置Esclipse的设定：</p>
<pre class="prettyprint">Project > Properties > Java Build Path > Libraries and click on
"Add External JARs..." Then add in the TTS_library_stub.jar file</pre>
<p><a target="_blank" href="http://eyes-free.googlecode.com/svn/trunk/commonlibs/TTS_library_stub.jar">Download This Library</a></p>
<p style="text-align: center;"><a href="http://www.androidres.com/wp-content/uploads/2009/02/addingtts_library.jpg" rel="lightbox[246]"><img class="aligncenter size-medium wp-image-248" style="border: 4px solid #e6e6e6;" title="addingtts_library" src="http://www.androidres.com/wp-content/uploads/2009/02/addingtts_library-150x42.jpg" alt="addingtts_library" width="150" height="42" /></a></p>
<p style="text-align: left;">
使用eSpeak引擎前需要为Emulator添加虚拟SD Card。<a href="http://www.androidres.com/?p=128">创建虚拟SD Card的方法</a></p>
<p><a target="_blank" href="http://code.google.com/p/eyes-free/downloads/list"><br />
下载tts_market.apk</a> 将这个APK安装到Emulator （启动Emulator的前提下，在CLS中输入&#8221;adb install ***.APK &#8220;）。</p>
<p>当程序运行后也可以通过参数控制是否需要弹出安装tts_market.apk的提示对话框：</p>
<p style="text-align: center;"><a href="http://www.androidres.com/wp-content/uploads/2009/02/tts_dialog_options.jpg" rel="lightbox[246]"><img src="http://www.androidres.com/wp-content/uploads/2009/02/tts_dialog_options-150x77.jpg" alt="tts_dialog_options" class="aligncenter size-medium wp-image-248" style="border: 4px solid #e6e6e6;" title="tts_dialog_options" width="150" height="77" class="aligncenter size-medium wp-image-251" /></a></p>
<p>下边通过几行简单的代码来实现调用语音库的方法：</p>
<p>1. 创建一个新的Android项目，可以随意命名为你认为有意义的名字，比如“I am Well-E”等等</p>
<p>2. 应用上边所提到的方法为当前的项目添加Library。</p>
<p>3. 在主程序.java中添加如下代码：</p>
<pre class="brush: java; smart-tabs: true;toolbar: false">import com.google.tts.TTS;</pre>
<p>介于onCreate()和类之间声明空的TTS</p>
<pre class="brush: java; smart-tabs: true;toolbar: false">private TTS myTts;</pre>
<p>在onCreat()中创建TTS的实体</p>
<pre class="brush: java; smart-tabs: true;toolbar: false">myTts = new TTS(this, ttsInitListener, true);</pre>
<p>在onCreat(）后边定义一个新函数</p>
<pre class="brush: java; smart-tabs: true;toolbar: false">
private TTS.InitListener ttsInitListener = new TTS.InitListener() {
        public void onInit(int version) {
          myTts.speak("I am Wall E", 0, null);
        }
};
</pre>
<p style="text-align: center;"><a href="http://www.androidres.com/wp-content/uploads/2009/02/walle.jpg" rel="lightbox[246]"><img class="aligncenter size-medium wp-image-249" style="border: 4px solid #e6e6e6;" title="walle" src="http://www.androidres.com/wp-content/uploads/2009/02/walle-101x150.jpg" alt="walle" width="101" height="150" /></a></p>
<p>至此可以Run你的程序了，如果顺利的话，第一次启动程序后会首先调用TTS通过Server下载数据，然后手动回到主程序面板重新启动你的程序，听到Emulator发出响亮的声音了吧？</p>
<p style="text-align: center;"><a href="http://www.androidres.com/wp-content/uploads/2009/02/tts_dialog_options_02.jpg" rel="lightbox[246]"><img src="http://www.androidres.com/wp-content/uploads/2009/02/tts_dialog_options_02-150x78.jpg" alt="tts_dialog_options_02" class="aligncenter size-medium wp-image-248" style="border: 4px solid #e6e6e6;" title="tts_dialog_options_02" width="150" height="78" class="aligncenter size-medium wp-image-252"  /></a></p>
<pre class="prettyprint">
创建TTS实体时要求有三个参数：
1. Application Context
2. TTS.InitListener - 监听TTS初始化Event
3. Boolean - 当检测到Emulator或其它测试机没有安装TTs_market.apk时，是否弹出下载
  提示对话框。
</pre>
<pre class="prettyprint">
TTS实体调用Speak行为时的参数：
1. String - 语音内容
2. Boolean - 是否启用队列模式（0：代表没有列队模式，1：代笔具有先进先出的队列模式）
3. Array - an array of Strings that are parameters for how to speak the text.
</pre>
<p>更多相关资源：<br />
<a target="_blank" href="http://eyes-free.googlecode.com/svn/trunk/documentation/tts/index.html">see the documentation on the TTS</a><br />
<a target="_blank" href="http://eyes-free.googlecode.com/svn/trunk/">look at other apps in the eyes-free project</a></p>
<p><a target="_blank" href="http://eyes-free.googlecode.com/svn/trunk/documentation/tutorial/tutorial.html">查看原文</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.androidres.com/index.php/2009/02/25/android-apps-voice-feature/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
