链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/26/2368696.html

一、概述

TextToSpeech,就是将文本内容转换成语音,在其他的一些应用中经常可以看到。这个功能还是挺强大的,但是用户利用它来编写应用却很简单。

二、要求

能够将文本内容转换成语音并朗读出来;可以一次全部朗读出来,也可以边写边读;可以将文本保存为语音文件。

三、实现

新建工程MySpeak,修改/res/layout/main.xml文件,在里面添加一个EditText,两个Button和一个CheckBox,完整的main.xml文件如下:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <EditText
8 android:id="@+id/edittext"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 />
12
13 <Button
14 android:id="@+id/rbutton"
15 android:layout_width="fill_parent"
16 android:layout_height="wrap_content"
17 android:text="朗读"
18 />
19
20 <Button
21 android:id="@+id/sbutton"
22 android:layout_width="fill_parent"
23 android:layout_height="wrap_content"
24 android:text="保存"
25 />
26
27 <CheckBox
28 android:id="@+id/checkbox"
29 android:layout_width="fill_parent"
30 android:layout_height="wrap_content"
31 android:text="边写边读"
32 android:checked="true"
33 />
34
35
36 </LinearLayout>

修改MySpeakActivity.java文件,设置两个Button按钮的监听和EditText的内容变化监听,完整的MySpeakActivity.java内容如下:

  1 package com.nan.speak;
2
3 import java.util.Locale;
4
5 import android.app.Activity;
6 import android.os.Bundle;
7 import android.speech.tts.TextToSpeech;
8 import android.text.Editable;
9 import android.text.TextWatcher;
10 import android.view.View;
11 import android.widget.Button;
12 import android.widget.CheckBox;
13 import android.widget.EditText;
14 import android.widget.Toast;
15
16
17 public class MySpeakActivity extends Activity
18 {
19 private EditText mEditText = null;
20 private Button readButton = null;
21 private Button saveButton = null;
22 private CheckBox mCheckBox = null;
23 private TextToSpeech mTextToSpeech = null;
24
25 /** Called when the activity is first created. */
26 @Override
27 public void onCreate(Bundle savedInstanceState)
28 {
29 super.onCreate(savedInstanceState);
30 setContentView(R.layout.main);
31
32 mEditText = (EditText)this.findViewById(R.id.edittext);
33 readButton = (Button)this.findViewById(R.id.rbutton);
34 saveButton = (Button)this.findViewById(R.id.sbutton);
35 mCheckBox = (CheckBox)this.findViewById(R.id.checkbox);
36 //实例并初始化TTS对象
37 mTextToSpeech = new TextToSpeech(this,new TextToSpeech.OnInitListener()
38 {
39
40 @Override
41 public void onInit(int status)
42 {
43 // TODO Auto-generated method stub
44 if(status == TextToSpeech.SUCCESS)
45 {
46 //设置朗读语言
47 int supported = mTextToSpeech.setLanguage(Locale.US);
48 if((supported != TextToSpeech.LANG_AVAILABLE)&&(supported != TextToSpeech.LANG_COUNTRY_AVAILABLE))
49 {
50 displayToast("不支持当前语言!");
51 }
52 }
53 }
54
55 });
56 //朗读按钮监听
57 readButton.setOnClickListener(new View.OnClickListener()
58 {
59
60 @Override
61 public void onClick(View v)
62 {
63 // TODO Auto-generated method stub
64 //朗读EditText里的内容
65 mTextToSpeech.speak(mEditText.getText().toString(), TextToSpeech.QUEUE_FLUSH, null);
66 }
67 });
68 //保存按钮监听
69 saveButton.setOnClickListener(new View.OnClickListener()
70 {
71
72 @Override
73 public void onClick(View v)
74 {
75 // TODO Auto-generated method stub
76
77 //将EditText里的内容保存为语音文件
78 int r = mTextToSpeech.synthesizeToFile(mEditText.getText().toString(), null, "/mnt/sdcard/speak.wav");
79 if(r == TextToSpeech.SUCCESS)
80 displayToast("保存成功!");
81 }
82 });
83 //EditText内容变化监听
84 mEditText.addTextChangedListener(mTextWatcher);
85
86 }
87
88
89 private TextWatcher mTextWatcher = new TextWatcher()
90 {
91
92 @Override
93 public void afterTextChanged(Editable s)
94 {
95 // TODO Auto-generated method stub
96 //如果是边写边读
97 if(mCheckBox.isChecked()&&(s.length()!=0))
98 {
99 //获得EditText的所有内容
100 String t = s.toString();
101 mTextToSpeech.speak(t.substring(s.length()-1), TextToSpeech.QUEUE_FLUSH, null);
102 }
103 }
104
105 @Override
106 public void beforeTextChanged(CharSequence s, int start, int count,
107 int after)
108 {
109 // TODO Auto-generated method stub
110
111 }
112
113 @Override
114 public void onTextChanged(CharSequence s, int start, int before,
115 int count)
116 {
117 // TODO Auto-generated method stub
118
119 }
120 };
121
122 //显示Toast函数
123 private void displayToast(String s)
124 {
125 Toast.makeText(MySpeakActivity.this, s, Toast.LENGTH_SHORT).show();
126 }
127
128
129 @Override
130 public void onDestroy()
131 {
132 super.onDestroy();
133
134 if(mTextToSpeech != null)
135 mTextToSpeech.shutdown();//关闭TTS
136 }
137
138 }

最后,在AndroidManifest.xml文件中加入权限:

1 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

好了,运行该程序:

输入“123456789”,可以听到输入完一个字就马上被朗读出来,

说明:

不知道为什么,在我的一台真机上测试时不能朗读出来,提示说语言不支持,在另一台上可以。

Android应用开发提高篇(2)-----文本朗读TTS(TextToSpeech)的更多相关文章

  1. Android应用开发提高篇(1)-----获取本地IP

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html 一.概述 习惯了Linux下的网络编程,在还没用智能机之前就一直想 ...

  2. Android JNI开发提高篇

    有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JN ...

  3. Android应用开发提高篇(6)-----FaceDetector(人脸检测)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2388776.html 一.概述 初次看到FaceDetector这个类时,心里想:And ...

  4. Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把 ...

  5. Android应用开发提高篇(5)-----Camera使用

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/06/2382679.html 一.概述 Camera是手机的一个很重要的设备,可以说现在的每一部 ...

  6. Android应用开发提高篇(3)-----传感器(Sensor)编程

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/29/2373420.html 一.概述 Android支持的传感器种类越来越多了,这确实是一件可 ...

  7. Android应用开发基础篇(1)-----Button

    Android应用开发基础篇(1)-----Button   一.概述        Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用      新建一个工程, ...

  8. android 串口开发第二篇:利用jni实现android和串口通信

    一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...

  9. Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现

    周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...

随机推荐

  1. NOI2014 Day2

    NOI2014 Day2 动物园 题目描述:给出一个字符串(长度为\(Len\)),设\(num[i]\)为字符串的前\(i\)个字符构成的子串(\(A\))中,满足\(A\)的前\(L\)个字符既是 ...

  2. java学习之匿名内部类与包装类

    匿名内部类: 所谓匿名内部类,顾名思义指的就是定义在类内部的匿名类,现有的spring框架开发以及java图形界面都经常用到匿名内部类. 下面来看一个代码: interface A{ public v ...

  3. js笔记-DOM基础

    DoM 浏览器支持: IE: 10% FF: 99% Chrome: 60% childNotes不兼容 在Chrome和IE9中会将文本节点也算作childNotes,而在IE6-8中childNo ...

  4. python 【第三篇】:函数及参数

    函数背景 在学习函数之前,一直遵循:面向过程编程: 根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下: ...

  5. S3C6410嵌入式应用平台构建(五)——linux-3.14.4移植到OK6410-(Nand分区问题)

    前一篇文章,我们的Linux能后启动了,只是在识别nand时候,没有获取到时钟源,导致后面的分区没哟进行. 我们从启动的log发现: [06/08-11:25:41:371]s3c24xx-nand ...

  6. Loading Image

    Android doesn’t handle animated gifs, but here’s one way to display an animated loading image that i ...

  7. BZOJ 2946: [Poi2000]公共串( 后缀自动机 )

    一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...

  8. IIS发布网站后局域网其他用户不能访问问题(转)

    如果本机能正常访问,而局域网其他用户不能访问,那么判断的结果很可能是防火墙问题. 解决方法: 既然问题出在Windows7或Windows Server 2008 R2的防火墙上,那么我们可以有以下两 ...

  9. Linux学习之输入输出重定向

    转自:http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html 多谢分享 在了解重定向之前,我们先来看看linux 的文件描述符. ...

  10. Svn入门

    1.建立svn仓库 ›    命令svnadmin create 仓库名称,如:进入命令行窗口,切换到Svn安装目录下,输入如下命令:svnadmin create F:\software\repos ...