http://bbs.apkok.com/thread-1893-1-1.html

一、基础知识

 TextToSpeech 简称TTS,称为语音合成,是Android 从1.6版本开始支持的新功能,能将所指定的文本转成不同语言音频输出。

在具体介绍前我们先来看下Adnroid系统带的TTS设置界面,点击Settings->Speech synthesis,如下图所示:

2010-9-7 18:53 上传

下载附件 (31.8 KB)

图 1 Android TTS设置界面

 当点击“Listen to an example”时,会发出“ This is an example of speech synthesis in English. ”,如果没有安装 TTS Data的话可以点击第二项安装,在 Default settings 可以设置 Speech rate 和 Language ,如下图 2 所示可以知道 TTS 支持的语言。
                           

2010-9-7 18:58 上传

下载附件 (20.32 KB)

图2 TTS 语言选择

 如果勾选“Always use my settings ”时要注意,设置了这个选项后那么我们就不能在程序中对 speech rate 和 Languages 进行设置了,这里的设置回覆盖我们程序中的设置。

 TTS功能需要有TTS Engine的支持,下面我们就来了解下android提供的TTS Engine。

Android使用了叫Pico的支持多种语言的语音合成引擎,Pico在后台负责把分析输入的文本,把分本分成他能识别的各个片段,再把合成的各个语音片段以听起来比较自然的方式连接在一起,这个过程Android系统帮我们做,我们只把他当做一个神奇的过程就可以了。

TTS engine依托于当前 Android Platform 所支持的几种主要的语言: English 、 French 、 German 、 Italian 和 Spanish 五大语言 (暂时也是没有对中文提供支持)。 TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时,对于个别的语言版本将取决于不同的时区,例如:对于 English ,在 TTS 中可以分别输出美式和英式两种不同的版本 。

二. 实例分析

下面我们先做一个具体的实例来亲自体会一下Android的TTS的效果。

我们做一个简单的输入英文句子然后朗读出来的例子,了解Android的TTS使用方法。

在具体做之前给个AndroidTTS的API的链接,
                        http://androidappdocs.appspot.com/reference/android/speech/tts/package-summary.html

可以先看下大概了解TTS提供的功能。
                             

2010-9-7 19:04 上传

下载附件 (36.29 KB)

图3 Android TTS API

可以看到TTS提供了两个接口和两个类。

我们希望做的效果如下:
                             

2010-9-7 19:05 上传

下载附件 (17.19 KB)

图4 实现效果图

上面一个输入框,点击Speak按钮则朗读上面的文字内容。

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <EditText android:id="@+id/inputText"
  8. android:hint="Input the text here!"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content">
  11. </EditText>
  12. <Button android:text="Speak"
  13. android:id="@+id/speakBtn"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"
  16. android:layout_gravity="center_horizontal"
  17. android:enabled="false"
  18. ></Button>
  19. </LinearLayout>

复制代码

Java文件的编写:

要使用TTS得实现OnInitListener接口

  1. public class AndroidTTSDemoFirst extends Activity implements OnInitListener {
  2. /** Called when the activity is first created. */
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. }
  8. //实现TTS初始化接口
  9. @Override
  10. public void onInit(int status) {
  11. // TODO Auto-generated method stub
  12. }
  13. }

复制代码

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

  1. private EditText inputText = null;
  2. private Button speakBtn = null;
  3. private static final int REQ_TTS_STATUS_CHECK = 0;
  4. private static final String TAG = "TTS Demo";
  5. private TextToSpeech mTts;

复制代码

 虽然安装Android1.6版本及之后的Android机器都默认安装了TTS引擎,但某些设备可能会因为存储容量的限制而缺少安装和语言对应的资源文件,因此在使用TTS前,得先要检查是否安装了TTS语言数据,在onCreate函数中添加以下内容:

  1. //检查TTS数据是否已经安装并且可用
  2. Intent checkIntent = new Intent();
  3. checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
  4. startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);

复制代码

这里启动一个新的Intent去检查TTS数据是否已经安装,我们根据其返回的结果进行处理,如下所示:

  1. protected  void onActivityResult(int requestCode, int resultCode, Intent data) {
  2. if(requestCode == REQ_TTS_STATUS_CHECK)
  3. {
  4. switch (resultCode) {
  5. case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:
  6. //这个返回结果表明TTS Engine可以用
  7. {
  8. mTts = new TextToSpeech(this, this);
  9. Log.v(TAG, "TTS Engine is installed!");
  10. }
  11. break;
  12. case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:
  13. //需要的语音数据已损坏
  14. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:
  15. //缺少需要语言的语音数据
  16. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:
  17. //缺少需要语言的发音数据
  18. {
  19. //这三种情况都表明数据有错,重新下载安装需要的数据
  20. Log.v(TAG, "Need language stuff:"+resultCode);
  21. Intent dataIntent = new Intent();
  22. dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
  23. startActivity(dataIntent);
  24. }
  25. break;
  26. case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:
  27. //检查失败
  28. default:
  29. Log.v(TAG, "Got a failure. TTS apparently not available");
  30. break;
  31. }
  32. }
  33. else
  34. {
  35. //其他Intent返回的结果
  36. }
  37. }

复制代码

如果返回CHECK_VOICE_DATA_PASS表示检查成功,可以新建一个 TextToSpeech ,否则就去下载 TTS数据。
当TTS数据检测成功创建一个TextToSpeech后,就会调用接口OnInitListener中定义的回调函数

  1. //实现TTS初始化接口
  2. @Override
  3. public void onInit(int status) {
  4. // TODO Auto-generated method stub
  5. //TTS Engine初始化完成
  6. if(status == TextToSpeech.SUCCESS)
  7. {
  8. int result = mTts.setLanguage(Locale.US);
  9. //设置发音语言
  10. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)
  11. //判断语言是否可用
  12. {
  13. Log.v(TAG, "Language is not available");
  14. speakBtn.setEnabled(false);
  15. }
  16. else
  17. {
  18. mTts.speak("This is an example of speech synthesis.", TextToSpeech.QUEUE_ADD, null);
  19. speakBtn.setEnabled(true);
  20. }
  21. }
  22. }

复制代码

在这个回调函数里,我们设置语言,然后就可以进行使用 TTS引擎进行操作了。
创建一个TextToSpeech是需要占用资源的,因此我们要适时的释放这个资源:

  1. @Override
  2. protected void onPause() {
  3. // TODO Auto-generated method stub
  4. super.onPause();
  5. if(mTts != null)
  6. //activity暂停时也停止TTS
  7. {
  8. mTts.stop();
  9. }
  10. }
  11. @Override
  12. protected void onDestroy() {
  13. // TODO Auto-generated method stub
  14. super.onDestroy();
  15. //释放TTS的资源
  16. mTts.shutdown();
  17. }

复制代码

最后,在onCreate函数中设置 EditText和Button的使用:

  1. inputText = (EditText)findViewById(R.id.inputText);
  2. speakBtn = (Button)findViewById(R.id.speakBtn);
  3. inputText.setText("This is an example of speech synthesis.");
  4. speakBtn.setOnClickListener(new OnClickListener() {
  5. public void onClick(View v) {
  6. // TODO Auto-generated method stub
  7. mTts.speak(inputText.getText().toString(), TextToSpeech.QUEUE_ADD, null);
  8. //朗读输入框里的内容
  9. }
  10. });

复制代码

 至此,我们的 Demo就完成了,当启动程序后,首先会朗读“ This is an example of speech synthesis in English. ”,然后你在EditText中输入内容,点击Speak按钮就能把内容给朗读出来。

 文章对应的完整代码例子可以在这里下载:http://download.csdn.net/source/2610740

http://blog.csdn.net/ichliebephone/article/details/6373184

一. 基础知识

Android 从1.6 版本开始支持Text To Speech ,使用的是Pico 语音合成引擎,但是只支持 English 、 French 、 German 、 Italian 和 Spanish 五大语言,暂时没有对中文提供支持。因此使用 Android 默认的 TTS Engine 是没法朗读中文的。

不过有开源项目 eyes-free ( http://code.google.com/p/eyes-free/ , Android 上的 TTS 功能应该也是基于这个开源项目提供的)除了提供 Pico 外,还把支持其他更多语言语音合成的另一个 TTS 引擎 eSpeak 也移植到了 Android 平台,其中就支持中文的语音合成。

因此在安装了 eyes-free 提供的 TTS Service Extended 的 apk 后,就可以在程序中使用 eyes-free 提供的 TTS library ,并把 TTS Engine 设置为不是默认的 Pico ,而是 eSpeak ,就可以实现朗读中文了。不过经过测试,实际的效果还是很差的,只能说勉强可以朗读而已。

二. 实例分析

下面我们就通过一个具体的例子来说明朗读中文的实现过程。

希望实现的效果和之前的类似:

图 1 实现效果图

上面一个输入框,点击 “我说” 按钮则朗读上面的文字内容。

首先我们要到 eyes-free 那下载需要的 TTS library 的 jar 包 (http://code.google.com/p/eyes-free/downloads/detail?name=TTS_library_stub_3.0_market.jar&can=2&q=) 。

创建一个 Android 工程,工程名为 NiHaoTTS ,并且把下载的 jar 包放在 assets 文件夹下。右键点击工程,选择 properties , Java Build Path , Libraries , Add JARs, 往工程中添加进 assets 下的 jar 包 , 如下图所示:

图2 添加 TTS library jar 包

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

[xhtml] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:id="@+id/ttstext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="你好,我能说中文"> </EditText> <Button android:id="@+id/ttsbtn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="我说" android:enabled="false"> </Button> </LinearLayout>

Java 文件的编写:

Java 文件和之前的类似,只是因为使用了 eyes-free 的 TTS API ,而不是 Android 自带的 TTS API ,因此有些许改变。相关的 API 参考: http://eyes-free.googlecode.com/svn/trunk/documentation/tts/com/google/tts/package-summary.html ,其中我们可以看到基本和 Android 的 API ()类似,其中一个明显的区别是创建 TTS 对象这里使用的是 TextToSpeechBeta ,而之前我们使用的是 TextToSpeech 。

Java 完整的代码为:

[java] view plaincopyprint?
  1. public class NiHaoTTS extends Activity implements OnInitListener{
  2. /** Called when the activity is first created. */
  3. private Button mBtn;
  4. private EditText mText;
  5. //使用com.google.tts包中的TextToSpeechBeta
  6. private TextToSpeechBeta mTTS;

public class NiHaoTTS extends Activity implements OnInitListener{ /** Called when the activity is first created. */ private Button mBtn; private EditText mText; //使用com.google.tts包中的TextToSpeechBeta private TextToSpeechBeta mTTS; private static final String TAG = "TTS Demo"; private static final int REQ_TTS_STATUS_CHECK = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //检查TTS数据是否已经安装并且可用 Intent checkIntent = new Intent(); checkIntent.setAction(TextToSpeechBeta.Engine.ACTION_CHECK_TTS_DATA); startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK); mText = (EditText)findViewById(R.id.ttstext); mBtn = (Button) findViewById(R.id.ttsbtn); mBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub String ttsText = mText.getText().toString(); if(ttsText != "") { //读取文本框中的中文 mTTS.speak(ttsText, TextToSpeechBeta.QUEUE_ADD, null); } } }); } //实现TTS初始化接口 @Override public void onInit(int status, int version) { // TODO Auto-generated method stub Log.v(TAG, "version = " + String.valueOf(version)); //判断TTS初始化的返回版本号,如果为-1,表示没有安装对应的TTS数据 if(version == -1) { //提示安装所需的TTS数据 alertInstallEyesFreeTTSData(); } else { //TTS Engine初始化完成 if(status == TextToSpeechBeta.SUCCESS) { Log.v(TAG, "success to init tts"); //设置TTS引擎,com.google.tts即eSpeak支持的语言包含中文,使用Android系统默认的pico可以设置为com.svox.pico mTTS.setEngineByPackageNameExtended("com.google.tts"); int result = mTTS.setLanguage(Locale.CHINA); //设置发音语言 if(result == TextToSpeechBeta.LANG_MISSING_DATA || result == TextToSpeechBeta.LANG_NOT_SUPPORTED) //判断语言是否可用 { Log.v(TAG, "Language is not available"); mBtn.setEnabled(false); } else { mTTS.speak("你好,朋友!", TextToSpeechBeta.QUEUE_ADD, null); mBtn.setEnabled(true); } } else { Log.v(TAG, "failed to init tts"); } } } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQ_TTS_STATUS_CHECK) { switch (resultCode) { case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_PASS: //这个返回结果表明TTS Engine可以用 { //使用的是TextToSpeechBeta mTTS = new TextToSpeechBeta(this, this); Log.v(TAG, "TTS Engine is installed!"); } break; case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_BAD_DATA: //需要的语音数据已损坏 case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_MISSING_DATA: //缺少需要语言的语音数据 case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_MISSING_VOLUME: //缺少需要语言的发音数据 { //这三种情况都表明数据有错,重新下载安装需要的数据 Log.v(TAG, "Need language stuff:"+resultCode); Intent dataIntent = new Intent(); dataIntent.setAction(TextToSpeechBeta.Engine.ACTION_INSTALL_TTS_DATA); startActivity(dataIntent); } break; case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_FAIL: //检查失败 default: Log.v(TAG, "Got a failure. TTS apparently not available"); break; } } else { //其他Intent返回的结果 } } //弹出对话框提示安装所需的TTS数据 private void alertInstallEyesFreeTTSData() { Builder alertInstall = new AlertDialog.Builder(this) .setTitle("缺少需要的语音包") .setMessage("下载安装缺少的语音包") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub //下载eyes-free的语音数据包 String ttsDataUrl = "http://eyes-free.googlecode.com/files/tts_3.1_market.apk"; Uri ttsDataUri = Uri.parse(ttsDataUrl); Intent ttsIntent = new Intent(Intent.ACTION_VIEW, ttsDataUri); startActivity(ttsIntent); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub finish(); } }); alertInstall.create().show(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if(mTTS!=null){ mTTS.shutdown(); } } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); if(mTTS != null) { mTTS.stop(); } } }

基本和我们之前学过的类似,其中不同的地方有:

( 1 ) TTS 的初始化回调函数多了一个版本号参数 version,

public void onInit( int status, int version) ,

如果返回的版本号 version 等于 -1 ,则表明还没有安装 eyes-free 提供的 TTS Service Extended ,提示进行下载和安装。

// 提示安装所需的 TTS 数据

alertInstallEyesFreeTTSData();

主要就是弹出对话框进行提示,然后链接到 eyes-free 的网站进行下载对应的 apk 。

// 弹出对话框提示安装所需的 TTS 数据

private void alertInstallEyesFreeTTSData()

{

Builder alertInstall = new AlertDialog.Builder( this )

.setTitle( " 缺少需要的语音包 " )

.setMessage( " 下载安装缺少的语音包 " )

.setPositiveButton( " 确定 " , new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

// 下载 eyes-free 的语音数据包

String ttsDataUrl = "http://eyes-free.googlecode.com/files/tts_3.1_market.apk" ;

Uri ttsDataUri = Uri.parse (ttsDataUrl);

Intent ttsIntent = new Intent(Intent. ACTION_VIEW , ttsDataUri);

startActivity(ttsIntent);

}

})

.setNegativeButton( " 取消 " , new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

// TODO Auto-generated method stub

finish();

}

});

alertInstall.create().show();

}

下载完进行安装,然后重新启动程序就可以运行。

( 2 )如果已经安装了,则可以进设置 TTS 引擎和需要合成的语言。

// 设置 TTS 引擎, com.google.tts 即 eSpeak 支持的语言包含中文,使用 Android 系统默认的 pico 可以设置为 com.svox.pico

mTTS .setEngineByPackageNameExtended( "com.google.tts" );

int result = mTTS .setLanguage(Locale. CHINA );

// 设置发音语言

其中如果设置为 com.google.tts 则表示使用 eSpeak 引擎,其包括对中文语音合成的支持。如果设置为 com.svox.pico 则表示使用 Pico 引擎,实际效果就是使用 Android 自带的 Pico 的效果,不过只支持 5 中语言,不支持中文。

除了这两块,其他和我们之前的程序基本一样。

然后就可以运行程序。因为模拟器开始时没有安装需要的 eyes-free 的 TTS Service Extended 的 apk ,因此会弹出提示对话框,点击确定开始下载,下载完进行安装,如下图所示。

图3 安装eyes-free的TTS

安装完会在应用程序中看到对应的图标,并且在 TTS 的设置中也会增加 eSpeak TTS 一项,如下图所示:

图4 安装了eyes-free的TTS

安装完后就可以再次打开 NiHaoTTS 程序,这时会有个选择询问使用哪个 TTS ,选择第二项,然后就可以在输入框中输入中文来朗读了。

图5 选择TTS

不过经过简单测试就知道了,中文朗读的效果基本没法实际使用的。

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

http://download.csdn.net/source/3237373

http://download.csdn.net/download/leiwuluan/3894785

Android TTS 初体验相关推荐

  1. [Android Studio] 初体验

    [Android Studio] 初体验 本人刚开始接触移动开发方面的知识,在很多方面都感觉寸步难行,移动开发这门课程应该是在我一年后学校才会开设,而移动开发所用到的java也是在我下个学期才开始正式 ...

  2. 使用Kotlin开发Android应用初体验

    使用Kotlin开发Android应用初体验 昨晚,最近一届的谷歌IO大会正式将Kotlin确定为了官方开发语言,作为一名Android开发鸟,怎么能不及时尝尝鲜呢? Kotlin的简要介绍 在开发之 ...

  3. Android开发初体验

    Android开发初体验 本次开发的应用能提出一道道问题,用户点击TRUE或者FALSE来回答问题,该应用则即时做出反馈. 一·该应用由一个activity和一个布局(layout)组成,我们先创建一 ...

  4. 一加6升级android p,一加6手机升级Android P初体验:系统更智能、操作更流畅!

    原标题:一加6手机升级Android P初体验:系统更智能.操作更流畅! 8月7日谷歌发布正式版Android P后,8月15日一加手机领先业界最先放出了一加6的Android P公测版.当然,这极其 ...

  5. Android RecyclerView初体验

    很早之前就听说过RecyclerView这个组件了,但一直很忙没时间学习.趁着周末,就花了一天时间来学习RecyclerView. 准备工作 在Android Studio里新建一个Android项目 ...

  6. Android Studio 初体验

    Google在I/O2013大会上发布了Android新的开发工具Android Studio,趁周末时间做了一下尝试.有需要的可以 在http://developer.android.com/sdk ...

  7. Android开发初体验之百度地图开发(3)

    在前面文章我分享了如何开始初步的使用百度地图API以及地图搜索功能,这次我将分享如何在百度地图上设置marker,以及info窗口,这次也主要是参考了鸿洋老师的博客,大家想继续学习的话也可以关注一下鸿 ...

  8. GitHub与Android安装初体验(md版本)

    说明: 第一次使用GitHub,安装时难免有些不如人意的地方,写下此文记录心路历程. 首先了解阅读有关的东西,GitHub与Android的作用及用途.配置的环境等,先参考老师发的材料: http:/ ...

  9. 第一次Android逆向初体验

    不得不说,我的思维水平一直在低位徘徊,技术水平仍然停留在以前. 就像有家公司,你去面试,他说他对一个人说的话的根本就不感兴趣,他想看看你写的东西,比如博客.我后来才感觉,他是对的,从一个人的字里行间就 ...

最新文章

  1. Vue学习笔记第一天--es6
  2. java读写文件大全
  3. 数据结构与算法分析 C++语言描述第四版.Mark Allen Weiss
  4. rpm(centos)软件包管理工具
  5. 第二章:变量和运算符
  6. jquery ajax调用服务器端指定的函数的三种方式
  7. CF #371 (Div. 2) C、map标记
  8. python语法_str_eval
  9. Java面试题-2021
  10. c swap方法在哪个库里面_覆膜条件下土壤水热动态与玉米种子生长的SWAP修正模型...
  11. ubuntu安装python3.6_Ubuntu16.04下安装python3.6.4详细步骤
  12. 网上开店,网店系统选择的那些事
  13. mysql join 从库_Mysql实现跨库join查询
  14. 杂记——贝叶斯可信区间与频率置信区间的区别
  15. 【CTF】咏春招新赛收获兼write up
  16. 学习java web感想_学了近一个月的java web 感想
  17. 加载、编辑和保存Wod格式所见所得的Word文档处理控件TX Text Control ActiveX
  18. Day14-正则表达式
  19. Flutter的优质UI组件库
  20. 【Matlab 六自由度机器人】基于蒙特卡罗方法(Monte Carlo Method)构建机器人工作空间(附MATLAB建模仿真完整代码)

热门文章

  1. java 累进计费率计算_税点点分享第198期:案例解答个人所得税的计算公式
  2. PCL之估计点云子集的表面法线
  3. 上传图片并显示缩略图的最简单方法(c#)
  4. 什么水平的java工程师月薪3万起?
  5. 跳转前暂停几秒js如何实现
  6. hadoop中遇到的问题
  7. JavaScript中的六种错误类型
  8. 《R语言数据分析》——导读
  9. Hazelcast发布开源流处理引擎Jet
  10. 第4章 Selenium2-java WebDriver API (三)