自动朗读TTS

android提供了自动朗读功能——其指的是支持可以对指定文本内容进行朗读,从而发出声音;

同时android的自动朗读支持还允许把文本对应的音频录制成音频文件,方便后续播放。

这种自动朗读支持的英文名称为:TextToSpeech,检测TTS.

TTS,可以在应用程序中动态地增加音频输出,从而提高用户体验。

Android的自动朗读支持通过TextToSpeech完成,该类提供了如下一个构造函数:

==>TextToSpeeech(Content content,TextToSpeeck.OnInitListener listener),当创建TextToSpeech对象时,必须先提供一个OnInitListener监听器——该监听器负责监听TextToSpeech的初始化效果。

程序获取TextToSpeeech对象后,可调用TextToSpeeech的setLanguage(Locale loc)方法设置该TTS发声引擎使用的语音、国家选项。

注意:

如果调用setLanguage(Locale loc)的返回值是:TextToSpeech.LANG_COUNTRY_AVALABLE,说明当前TTS系统可以支持所设置的语音、国家选项。

对TextToSpeech设置完成后,即可调用它的方法来朗读文本了,具体方法可参考TextToSpeech的API文档。

TextToSpeech类中最常用的两个方法如下:

1.speak(String text,int queueMode,HashMap<String,String> params);

2.synthesizeToFile(String text,HashMap<String,String> params,String fileName);

以上两个方法都是用于把text文字内容转换为音频,区别只是speak方法是播放转换的音频,而synthesizeToFile是把转换得到的音频保存成声音文件。

以上两个方法中的params都用于指定声音转换时的参数,speak()中的queueMode参数指定TTS的发音队列模式,该模式支持如下两个常量:

1.TextToSpeech.QUEUE_PLUSH:如果指定该模式,当TTS调用speak()时,它会中断当前实例正在运行的任务(也可理解为清除当前语音任务,转而执行新的语音任务)

2.TextToSpeech.QUEUE_ADD:如果指定该模式,当TTS调用speak()时,会把新的发音任务添加到当前发音任务列队之后——也就是等任务队列中的发音任务执行完成后再来执行speak()指定的发音任务。

注意:

当程序用完了TextToSpeech对象后,可以在Activity的OnDestory()中调用它的shutdown()来关闭TextToSpeech、释放其所占用资源。

总结:TextToSpeech使用步骤如下:

1.创建TextToSpeech对象,创建时传入OnInitListener监听器监听创建是否成功;

2.设置TextToSpeech所使用语言、国家选项,通过返回值判断TTS是否支持该语言、国家选项;

3.调用speak()或synthesizeToFile();

4.关闭TTS,回收资源。

实例如下:

  1. 布局文件==》
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical"
  7. tools:context=".MainActivity" >
  8.  
  9. <EditText
  10. android:id="@+id/edit"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:text="this is a dog" />
  14.  
  15. <LinearLayout
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:orientation="horizontal" >
  19.  
  20. <Button
  21. android:id="@+id/btnRecord"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:text="记录声音" />
  25.  
  26. <Button
  27. android:id="@+id/btnRead"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:text="朗读" />
  31. </LinearLayout>
  32.  
  33. </LinearLayout>
  34.  
  35. 代码实现==>
  36. package com.example.mytts;
  37.  
  38. import java.util.Locale;
  39.  
  40. import android.os.Bundle;
  41. import android.app.Activity;
  42. import android.speech.tts.TextToSpeech;
  43. import android.speech.tts.TextToSpeech.OnInitListener;
  44. import android.view.Menu;
  45. import android.view.View;
  46. import android.view.View.OnClickListener;
  47. import android.widget.Button;
  48. import android.widget.EditText;
  49. import android.widget.Toast;
  50.  
  51. public class MainActivity extends Activity
  52. {
  53. EditText edit;
  54. TextToSpeech tts;
  55.  
  56. @Override
  57. protected void onCreate(Bundle savedInstanceState)
  58. {
  59. super.onCreate(savedInstanceState);
  60. setContentView(R.layout.activity_main);
  61.  
  62. edit = (EditText) this.findViewById(R.id.edit);
  63. Button btnRecord = (Button) this.findViewById(R.id.btnRecord);
  64. Button btnRead = (Button) this.findViewById(R.id.btnRead);
  65.  
  66. btnRecord.setOnClickListener(new MyButtonOnClick());
  67. btnRead.setOnClickListener(new MyButtonOnClick());
  68.  
  69. tts = new TextToSpeech(this, new OnInitListener()
  70. {
  71. @Override
  72. public void onInit(int status)
  73. {
  74. // 如果装载TTS引擎成功
  75. if (status == TextToSpeech.SUCCESS)
  76. {
  77. // 设置使用美式英语朗读
  78. int result = tts.setLanguage(Locale.US);
  79. // 如果不支持所设置的语言、国家
  80. if (result != TextToSpeech.LANG_COUNTRY_AVAILABLE
  81. && result != TextToSpeech.LANG_AVAILABLE)
  82. {
  83. Toast.makeText(MainActivity.this, "TTS不支持本次设置语言、国家的朗读", 5000).show();
  84. }
  85. }
  86. }
  87. });
  88. }
  89.  
  90. private class MyButtonOnClick implements OnClickListener
  91. {
  92. @Override
  93. public void onClick(View v)
  94. {
  95. switch (v.getId())
  96. {
  97. case R.id.btnRecord:
  98. // 将朗读文本的音频记录到指定文件
  99. tts.synthesizeToFile(edit.getText().toString(), null, "/mnt/sdcard/sound.wav");
  100. Toast.makeText(MainActivity.this, "声音记录成功", 5000).show();
  101. break;
  102. case R.id.btnRead:
  103. tts.speak(edit.getText().toString(), TextToSpeech.QUEUE_ADD, null);
  104. break;
  105. }
  106. }
  107.  
  108. }
  109.  
  110. @Override
  111. protected void onDestroy()
  112. {
  113. // super.onDestroy();
  114. if (tts != null)
  115. tts.shutdown();
  116. }
  117.  
  118. @Override
  119. public boolean onCreateOptionsMenu(Menu menu)
  120. {
  121. // Inflate the menu; this adds items to the action bar if it is present.
  122. getMenuInflater().inflate(R.menu.main, menu);
  123. return true;
  124. }
  125.  
  126. }

android学习笔记53——自动朗读TTS的更多相关文章

  1. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  2. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  3. 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件

    目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...

  4. 【转】 Pro Android学习笔记(七十):HTTP服务(4):SOAP/JSON/XML、异常

    目录(?)[-] SOAP JSON和XMLPullParser Exception处理 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog. ...

  5. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  6. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  7. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  8. 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单

    目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...

  9. 【转】Pro Android学习笔记(三十):Menu(1):了解Menu

    目录(?)[-] 创建Menu MenuItem的属性itemId MenuItem的属性groupId MenuItem的属性orderId MenuItem的属性可选属性 Menu触发 onOpt ...

随机推荐

  1. [maven] 常用插件解析

    参考资料:http://my.oschina.net/zh119893/blog/276090 我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完 ...

  2. bugfree安装

    1.下载xampp文件:xampp-linux-x64-5.5.30-3-installer.run 2.安装此文件,用root账号安装,安装命令:./xampp-linux-x64-5.5.30-3 ...

  3. 读<jquery 权威指南>[7]-性能优化与最佳实践

    一.优化选择器执行速度 1. 优先使用ID选择器和标记选择器 使用选择器时应该首选ID选择器($("#id")),其次是标记选择器($("div")),最后再选 ...

  4. 读《程序员的SQL金典》[4]--SQL调优

    一.SQL注入 如果程序中采用sql拼接的方式书写代码,那么很可能存在SQL注入漏洞.避免的方式有两种: 1. 对于用户输入过滤敏感字母: 2. 参数化SQL(推荐). 二.索引 ①索引分类 聚簇索引 ...

  5. UE3:SkeletalMesh的绘制流程

    [目标] SkeletalMesh的绘制流程 [思路] 1 顶点缓冲流 静态数据流向 动态数据流向(紫红色箭头) 2 FGPUSkinVertexFactory.ShaderDataType.Bone ...

  6. linux getch()实现

    #include <termio.h> int getch(void){     struct termios tm, tm_old;     int fd = 0, ch;       ...

  7. windows下安装mysql解压版

    1.解压压缩版的MySQL 其中: bin目录        -    主要存放MySQL的各种可执行程序 data目录      -   存放数据库的数据文件和索引文件等 MySQL-test -  ...

  8. Nginx反向代理关于端口的问题

      Nginx反向代理关于端口的问题   http://www.cnblogs.com/likehua/p/4056625.html Nginx默认反向后的端口为80,因此存在被代理后的端口为80的问 ...

  9. CSS强制中英文换行与不换行

    1. word-break:break-all; 只对英文起作用,以字母作为换行依据 2. word-wrap:break-word; 只对英文起作用,以单词作为换行依据 3. white-space ...

  10. poj3660 floyd

    //Accepted 176 KB 16 ms //一头牛,如果rank是能确定的,那么能打败他的牛的个数和被他打败的牛的个数的总和为n-1 #include <cstdio> #incl ...