文本 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 ...
随机推荐
- Servlet/JSP-07 Session应用
Session应用 一. 避免表单重复提交 1. 表单重复提交的情况 ①在表单提交到一个 Servlet,而 Servlet 又通过请求转发的方式响应了一个 JSP 或者 HTML 页面,此时浏览器地 ...
- oracle存储过程--导出数据库表的说明文档
Oracle查询表的名字和comments select a.table_name,b.comments from user_tables a,ALL_TAB_COMMENTS b where a.t ...
- 磁盘配额-----quota
为什么要使用磁盘配额:为了限制普通用户使用普通磁盘的空间与创建文件的个数等. 不至于个别人的浪费影响所有人的使用. 需要安装quota的软件包. mount -o usrquota,grpquota ...
- AngularJS 拦截器
在需要进行身份验证时,在请求发送给服务器之前或者从服务器返回时对其进行拦截,是比较好的实现手段. 例如,对于身份验证,如果服务器返回401状态码,将用户重定向到登录页面. AngularJS通过拦截器 ...
- position:absolute/relative/fixed小结
1.绝对定位:position:absolute; 当一个div块的位置被定义为绝对定位absolute时,也就意味着它失去了文档流的位置,后面的文档流会紧跟着补上来接替它的位置.如果上下左右的绝对偏 ...
- 《Invert》开发日志02:游戏风格定型
声明:以下涉及到的<God of Light>.<Valiant Hearts : The Great War>.<Angry Birds 2>游戏截图均来自其Ap ...
- Remove Duplicates From Sorted Array
Remove Duplicates from Sorted Array LeetCode OJ Given a sorted array, remove the duplicates in place ...
- JDK-Logger
log4j的作者Ceki Gülcü在停止维护log4j后开始新的日志组件的开发,他的新作为日志门面slf4j以及log4j的替代品logback.不过logback至今还没有出1.0的正式版,所以使 ...
- 在JAVA中,关于反射机制的讨论
一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...
- Android 下载网络图片保存到本地
通过网络地址获取网络图片,点击下载将图片显示出来,然后点击图片将图片保存到本地. 首先需要在manifest上添加一些权限: <!-- 访问网络的权限 --> <uses-permi ...