文本 To 音频
文本 To 音频
TextToSpeech介绍
TextToSpeech,简称 TTS,是Android 1.6版本中比较重要的新功能。将所指定的文本转成不同语言音频输出。它可以方便的嵌入到游戏或者应用程序中,增强用户体验。
TTS Engine,依托于当前Android Platform所支持的几种主要语言:English、French、German、Italian及Spanish五大语言(暂时没有直接中文)。TTS可以将文本随意的转换成以上任意五种语言的语音输出。
布局设计
界面中组件的设计很简单,分为四个部分:
1、内容编辑框,供用户输入需要转换成语音的文本;
2、音频播放按钮,点击后播放文本对应的音频;
3、语调编辑框,供用户调节朗读的语调,支持浮点型数据,默认值为1.0;
4、语速编辑框,供用户调节语速的语速,只能为整型数据,默认值为1;
代码如下:
<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"
android:gravity="center_vertical"
tools:context="com.texttospeechtest.MainActivity" > <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/speak_content"
android:textColor="#f00" /> <EditText android:id="@+id/input_something"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/input_something" /> </LinearLayout> <Button android:id="@+id/to_speak"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:text="@string/to_speak" /> <Button android:id="@+id/save_wav"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:text="@string/save_wav" /> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:layout_marginTop="40dp" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pitch_level_name"
android:textColor="#f00" /> <EditText android:id="@+id/pitch_level"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/pitch_level"
android:text="@string/pitch_level" /> </LinearLayout> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center_horizontal"
android:gravity="center_horizontal"
android:layout_marginTop="40dp" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/speak_rate_name"
android:textColor="#f00" /> <EditText android:id="@+id/speak_rate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/speak_rate"
android:text="@string/speak_rate" /> </LinearLayout> </LinearLayout>
其中用到的字符串定义在values/strings.xml文件中:
<?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">TextToSpeechTest</string>
<string name="hello_world">Hello world!</string>
<string name="action_settings">Settings</string>
<string name="speak_content">Speak Content: </string>
<string name="input_something">Input Something</string>
<string name="to_speak">To Speak</string>
<string name="pitch_level_name">Pitch Level(float): </string>
<string name="pitch_level">1.0</string>
<string name="speak_rate_name">Speak Rate(int): </string>
<string name="speak_rate">1</string> </resources>
TTS应用
1、在应用程序中实现TTS的TextToSpeech.OnInitListener监听器,测试案例针对onInit(int status)和onDestroy()两个方法进行了重载。代码如下:
@Override
public void onInit(int status) {
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS) {
int result = tts.setLanguage(Locale.US); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS", "This Language is not supported");
speak.setEnabled(false);
} else {
speak.setEnabled(true);
}
} else {
Log.e("TTS", "Initilization Failed!");
}
}
@Override
public void onDestroy() {
// Don't forget to shutdown tts!
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
}
2、对TTS、Button及EditText组件的对象进行初始化,是在主类MainActivity的重载方法onCreate(Bundle savedInstanceState) 中实现,代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); tts = new TextToSpeech(this, this);
content = (EditText)findViewById(R.id.input_something);
speak = (Button)findViewById(R.id.to_speak);
pitch = (EditText)findViewById(R.id.pitch_level);
rate = (EditText)findViewById(R.id.speak_rate); speak.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ToSpeak();
} }); }
注意,在定义TTS对象tts时会对上面定义的onInit(int status)方法进行调用,这个过程非常关键。本案例中让其完成的事情包括:
A、判断初始化状态;
B、若成功,设置文本转换语言环境;
C、若语言环境存在并支持,则继续.....
3、点击音频播放按钮后,响应方法为ToSpeak(),其实现如下:
public void ToSpeak(){
//to speak input content
String c = content.getText().toString();
if(c.equals("")){
Toast.makeText(this, "Please input something first.", Toast.LENGTH_SHORT).show();
}
else{
//set speak pitch
Float p = Float.valueOf(pitch.getText().toString());
tts.setPitch(p);
//set speak rate
int r = Integer.valueOf(rate.getText().toString());
tts.setSpeechRate(r);
tts.speak(c, TextToSpeech.QUEUE_FLUSH, null);
}
}
这里的代码就好理解了,主要是在获取用户输入的文本、语调及语速之后,进行音频的播放。注意:方法开头对文本编辑框中的内容进行了空字串(“” )判断,若为空则没有播放的必要。
结果图
虽然界面很简陋,还是附上几张图片把,毕竟是学习的成果。
输入不能为空的提示界面:

在US语言环境下,英文与中文输入(但只有英文能正常朗读):

总结
按照上述流程,英语(US)语言环境可以正常,其他四国语言未测试(按Google说明应该不成问题)。
资料显示TTS暂时不支持中文,但是在设置语言环境时,写入如下代码:
int result = tts.setLanguage(Locale.CHINA);
或:
int result = tts.setLanguage(Locale.CHINESE);
奇怪的是工程并没有报错,而且运行后按钮是使能状态,说明通过了语言存在与支持的判断环节。不过输入中文,点击之后是没有任何反应的,当然,此时输入什么都不会有反应。这是存在疑问的地方,希望知道的大神指点一二。
网上也提供了替代方案,比如利用第三方支持库SVox等。
文本 To 音频的更多相关文章
- 文本转音频(百度语音合成api)(python)(原创)
应之前的一家小学教育培训机构的要求设计的一款 将文字转音频的程序.(注:后面应该是生成音频才对,没有改过来) 技术难点: ①语音合成,如果没有现在这么多的云服务-百度云语音合成,我估计这个程序会费很大 ...
- Day 05 文本处理和爬虫基础1
目录 什么是文件 什么是文本 如何通过文本编辑器控制.txt文件 打开文件的三种模式 t和b模式 高级应用 文本处理 + 词云分析 效果如下 爬虫原理 requests模块 re模块 爬取图片 爬取视 ...
- 文本单词one-hot编码
单词->字母->向量 神经网络是建立在数学的基础上进行计算的,因此对数字更敏感,不管是什么样的特征数据都需要以向量的形式喂入神经网络,无论是图片.文本.音频.视频都是一样. one-hot ...
- Linux实战教学笔记01:计算机硬件组成与基本原理
标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...
- WhatsApp的Erlang世界
rick 的两个ppt整理 下载:2012 2013 ,使用半年erlang后,重新看这两个ppt才发现更多值的学习的地方,从ppt中整理如下: - Prefer os:timestamp to e ...
- iOS路径沙盒文件管理(转载)
iOS路径沙盒文件管理,看到博主总结的很好,转载过来,原文:http://www.aichengxu.com/view/35264 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文 ...
- 运用TensorFlow处理简单的NLP问题
当前无论是学术界还是工业界,深度学习都受到极大的追捧,尤其是在Google开源深度学习平台TensorFlow之后,更是给深度学习火上浇油.目前在开源社区Github上所有开源项目中,TensorFl ...
- Java中9种IO的读取方式
数据的读写,按照数据类型可以分为两种:字符流和字节流(二者区别?).所以数据读取方式按照数据类型也可以分为两类:字节流的读取和字符流的读取. 一.字节流读取操作: | | |-----1.FileI ...
- 今天谈谈流,什么是IO流?
无标题 (5) :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { bord ...
随机推荐
- 0010《SQL必知必会》笔记06-表的修改与删除
1.表的修改: 1.1 删除列:ALTER TABLE 表名 DROP COLUMN 列名 1.2 添加列:ALTER TABLE 表名 ADD(列名 数据类型) 1.3 修改列名:ALTER TAB ...
- C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅳ部分
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...
- 简易的GCC图形界面GCCUI
这个 GCCUI.EXE 是配合上一篇博文<用VC6开发嵌入式LINUX程序>说的:用VC6辅助开发LINUX程序的时候使用.把 gcc 编译器增加一个简易的图形界面,可以自动读取 vc6 ...
- ixgbe rx_missed_errors
https://communities.intel.com/thread/54600?start=0&tstart=0 I am acquiring 800Mb/sec+ multicast ...
- WPF自定义空心文字
首先创建一个自定义控件,继承自FrameworkElement,“Generic.xaml”中可以不添加样式. 要自定义空心文字,要用到绘制格式化文本FormattedText类.FormattedT ...
- 阻塞通信之Socket编程
Socket通信,主要是基于TCP协议的通信.本文从Socket通信(代码实现).多线程并发.以及TCP协议相关原理方面 介绍 阻塞Socket通信一些知识. 本文从服务器端的视角,以“Echo Se ...
- URL和URI区别
URI:Universal Resource Identifier,通用资源标识符: URL:Uniform Resource Locator,统一资源定位符: 其中,URL是URI ...
- php一句话后门过狗姿势万千之传输层加工【三】
既然木马已就绪,那么想要利用木马,必然有一个数据传输的过程,数据提交是必须的,数据返回一般也会有的,除非执行特殊命令. 当我们用普通菜刀连接后门时,数据时如何提交的,狗狗又是如何识别的,下面结合一个实 ...
- uva131 The Psychic Poker Player
The Psychic Poker Player Time Limit: 3000MS 64bit IO Format: %lld & %llu Description In 5-ca ...
- 在Android中如何获取视频的第一帧图片并显示在一个ImageView中
String path = Environment.getExternalStorageDirectory().getPath(); MediaMetadataRetriever media = n ...