自动朗读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,回收资源。

实例如下:

布局文件==》
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <EditText
android:id="@+id/edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="this is a dog" /> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" > <Button
android:id="@+id/btnRecord"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="记录声音" /> <Button
android:id="@+id/btnRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="朗读" />
</LinearLayout> </LinearLayout> 代码实现==>
package com.example.mytts; import java.util.Locale; import android.os.Bundle;
import android.app.Activity;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity
{
EditText edit;
TextToSpeech tts; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); edit = (EditText) this.findViewById(R.id.edit);
Button btnRecord = (Button) this.findViewById(R.id.btnRecord);
Button btnRead = (Button) this.findViewById(R.id.btnRead); btnRecord.setOnClickListener(new MyButtonOnClick());
btnRead.setOnClickListener(new MyButtonOnClick()); tts = new TextToSpeech(this, new OnInitListener()
{
@Override
public void onInit(int status)
{
// 如果装载TTS引擎成功
if (status == TextToSpeech.SUCCESS)
{
// 设置使用美式英语朗读
int result = tts.setLanguage(Locale.US);
// 如果不支持所设置的语言、国家
if (result != TextToSpeech.LANG_COUNTRY_AVAILABLE
&& result != TextToSpeech.LANG_AVAILABLE)
{
Toast.makeText(MainActivity.this, "TTS不支持本次设置语言、国家的朗读", 5000).show();
}
}
}
});
} private class MyButtonOnClick implements OnClickListener
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.btnRecord:
// 将朗读文本的音频记录到指定文件
tts.synthesizeToFile(edit.getText().toString(), null, "/mnt/sdcard/sound.wav");
Toast.makeText(MainActivity.this, "声音记录成功", 5000).show();
break;
case R.id.btnRead:
tts.speak(edit.getText().toString(), TextToSpeech.QUEUE_ADD, null);
break;
}
} } @Override
protected void onDestroy()
{
// super.onDestroy();
if (tts != null)
tts.shutdown();
} @Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

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. 6/17 Sprint3

    首页改进:

  2. chrome浏览器遇到的异常

    昨天写了一个二进制输出图片的方法,发现在chrome浏览器里面出了异常: (failed) net::ERR_INCOMPLETE_CHUNKED_ENCODING   代码是这样写的: //直接输出 ...

  3. 9patch边框黑线的含义

    上面黑线或者点表示纵向可拉伸的区域 一般一个点即可 左边黑线或者点表示横向可拉伸的区域 一般一个点即可 下面表示纵向填放内容的区域  一般是一条黑线 右边表示横向填放内容的区域  一般是一条黑线

  4. Using of grep sed awk on Linux

    #This script is to parse data file: fun0() { ## [INFO1]a=1   b=2 c=3 [INFO2]a=7 b=8 c=9 [INFO3] a=x ...

  5. Unity3d_学习笔记_入门

    转自:http://blog.csdn.net/zlfxy/article/details/8722437 本文内容来自“编程教父”的视频课程. 1.Unity3d一个游戏引擎,可以用来开发很多游戏. ...

  6. easyui datagrid

    function initData(){ //数据列表 yftjsy=$("#yftjsy").datagrid({ url: '', fit:true, showFooter:f ...

  7. C语言之共用体

    最近在复习C语言,特再次记录: 有时需要将几种不同类型的变量存放到同一段内存单元中.如一个int.float.char放在同一个地址开始的内存单元中.,也就是使用覆盖技术,几个变量相互覆盖,称之为共用 ...

  8. POJ 1236 SCC+缩点

    题意:一张有向图,一问至少给几个点发送软件,才能让所有点都能收到软件:二问是至少添加几条边才能让整个图是一个连通分量: 分析:一般求连通分量都会求缩点,在这里缩点之后,生成一张新的图,在新的图中求每一 ...

  9. 【LeetCode OJ】Path Sum

    Problem Link: http://oj.leetcode.com/problems/path-sum/ One solution is to BFS the tree from the roo ...

  10. MVC 3.0 Tree

    页面分左右两部分,左边是一个导航树,右边是局部页,点击树节点,异步刷新右边的内容.加颜色部分是知识点. @using VideoWeb.Models@model VideoWeb.Models.Cat ...