文本 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 ...
随机推荐
- python基础(四)运算
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python的运算符和其他语言类似 (我们暂时只了解这些运算符的基本用法,方便我们 ...
- 五、Android学习第四天补充——Android的常用控件(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 五.Android学习第四天补充——Android的常用控件 熟悉常用的A ...
- Microsoft.Bcl.Build 1.0.10 稳定版发布
Microsoft.Bcl.Build 1.0.10 稳定版发布 解决了之前 1.0.8 在未下载相应的Nuget Package 的情况下项目无法加载的情况 但由于 Microsoft.Net.Ht ...
- Hadoop 基准测试与example
#pi值示例 hadoop jar /app/cdh23502/share/hadoop/mapreduce2/hadoop-mapreduce-examples--cdh5. #生成数据 第一个参数 ...
- IBM云的商业动作之我见(1):IBM 收购 OpenStack 托管私有云公司 Blue Box [IBM Acquired Blue Box]
2015-06-10 IBM 刚刚(2015/06/03)宣布收购 Blue Box 公司.本文就聊聊这点事. 1. Blue Box 是做什么的?它是一家中小型托管私有云提供商. 1.1 公司的简单 ...
- [转]NopCommerce之旅: 应用启动
本文转自:http://www.cnblogs.com/devilsky/p/5359881.html 我的NopCommerce之旅(6): 应用启动 一.基础介绍 Global.asax 文件 ...
- 给IIS添加CA证书以支持https
一.在IIS中生成Certificate Signing Request (CSR) 个人理解:生成CSR就是生成“私钥/公钥对”之后从中提取出公钥. 1. 打开IIS Manager,在根节点中选择 ...
- 贪心法 codevs 1052 地鼠游戏
1052 地鼠游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 王钢是一名学习成绩优异的学生,在平 ...
- Mecanim分析
前言 目前我还只是学习到Mecanima的初级阶段,看完了阿赵的日志<Unity3D 4.0新功能:Mecanim动画系统基础教程>,对Mecanima的了解更深入了一些,谢谢他的分享. ...
- Flex:自定义滚动条样式/隐藏上下箭头
Flex组件自定义滚动条的实现 .scrollBar{ downArrowUpSkin:Embed(source="img/mainLeftScrollBar/bar_bottom.png& ...