Android应用开发提高篇(2)-----文本朗读TTS(TextToSpeech)

链接地址: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         @Override106         public void beforeTextChanged(CharSequence s, int start, int count,107                 int after) 108         {109             // TODO Auto-generated method stub110             111         }112 113         @Override114         public void onTextChanged(CharSequence s, int start, int before,115                 int count) 116         {117             // TODO Auto-generated method stub118             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     @Override130     public void onDestroy()131     {132         super.onDestroy();133         134         if(mTextToSpeech != null)135             mTextToSpeech.shutdown();//关闭TTS136     }137     138 }

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

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

好了,运行该程序:

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

说明:

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

时间: 2024-11-15 06:47:49

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

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

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html 一.概述 习惯了Linux下的网络编程,在还没用智能机之前就一直想知道怎么得到手机的IP地址(玩智能机之前我是不搞手机应用的).好了,得知Android是基于Linux内核的,那么不就可以利用之前学的Linux下的网络编程方法来获取IP了吗?呵呵,其实这是比较底层的方法,在Android上,完全可以利用Java的API来实现,而且实现的代码非常简单.下面的实现只可

Android JNI开发提高篇

有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JNI一般使用C还是C++编写呢? Android平台在中间层和大部分的类库的底层使用了C++的开发方式,后缀为.cpp,比如Android Framework.OpenCore.Webkit.SQLite等等.使用C++好处就是可以使用很多库但目前Android不支持STL,我们知道C表示字符串都是字

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

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2388776.html 一.概述 初次看到FaceDetector这个类时,心里想:Android真的很强大.但直到我实际应用它的时候,心情从高山跌倒了谷底(看实现中的结果就知道了),再仔细看看官方文档,才知道这个类是API LEVEL1的,我就晕了,这就说明这个类很早就有了,但为什么到现在还没有得到改善呢.写这篇文章的目的还有一个,就是想强调一下用SurfaceView来画图的时候,要

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

转自:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把它给完善了.加入了多线程,这样UI线程就不会被阻塞:实现了客户端和服务器的双向通信,只要客户端发起了连接并成功连接后那么两者就可以随意进行通信了. 二.实现 在之前的工程基础上进行修改就可以了. MyClient工程的main.xml文件不用修改,只需要修改MyClientActivity.java文件

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

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/06/2382679.html 一.概述 Camera是手机的一个很重要的设备,可以说现在的每一部手机上都有.回想当时在Linux搞摄像头编程真的要捏一把汗.有人会说在Linux下装个opencv就可以通过它的函数来使用摄像头啦,但我并没有这么做,我还是用最原始的方法(V4L2)实现了.之前研究过Android关于摄像头这部分的源码,毫无疑问,Android关于摄像头底层的实现用的也是V4L2.

Android应用开发进阶篇-场景文字识别

由于研究生毕业项目需要完成一个基于移动终端的场景文字识别系统,虽然离毕业尚早,但出于兴趣的缘故,近一段抽时间完成了这样一套系统.基本的架构如下: 客户端:Android应用实现拍摄场景图片,大致划出感兴趣文字区域,通过socket通信上传服务器端识别; 服务器端:Python server进行socket通信监听,连通后调用文字识别引擎(exe可执行程序),将识别结果返回; 下面是系统运行示例图: 1. 客户端 包含两个Activity,: MainActivity主界面如上图左1,选择拍摄后调

Android应用开发基础篇(12)-----Socket通信(转载)

转自:http://www.devdiv.com/android_socket_-blog-258060-10594.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络编程是非常有必要的,而我觉得socket编程是网络编程的基础.在进入正题之前,先介 绍几点网络知识,一:socket编程有分TCP和UDP两种,TCP是基于连接的,而UDP是无连接的:二:一个TCP连接包括了输入和输出两条独立的 路径:三:服务器必须先运行然后客户端才能与它进行通信.四:客户端与服务

Android应用开发基础篇(12)-----Socket通信

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌握网络编程是非常有必要的,而我觉得socket编程是网络编程的基础.在进入正题之前,先介绍几点网络知识,一:socket编程有分TCP和UDP两种,TCP是基于连接的,而UDP是无连接的:二:一个TCP连接包括了输入和输出两条独立的路径:三:服务器必须先运行然后客户端才能与它进行通信.四:客户端与服

Android应用开发基础篇(3)-----ListView

链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/16/2354625.html 一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView显示一些内容,如数据.文本,某一行被点击时有相应的提示:能够实现简单的ListView的动态插入和删除. 三.实现 新建工程MyListView,修改/res/lay