文本 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 ...
随机推荐
- 说完Pivot 今天说下Unpivot 的处理方式
上次说到,既然有Pivot 的行转列,那么肯定也有Unpivot 的列转行 .其实unpivot 处理的情况也是差不多,也是分3步走. 首先也是先演示一下unpivot 的用法 ),Mon TIME, ...
- db2存储过程
一. 使用存储过程的好处 1. 减少客户机与服务器之间的网络使用率,以及数据库锁定保持的时间 应用程序通常在执行每个SQL语句都要跨网络两次,存储过程可以将SQL语句集中在一起, 从而使得对于每一组S ...
- linux基础-第十单元 系统的初始化和服务
第十单元 系统的初始化和服务 Linux系统引导的顺序 Linux系统引导的顺序 BOIS的初始化和引导加载程序 什么是BIOS GRUB程序和grub.conf文件 什么是grub grub配置文件 ...
- Linux screen 命令
简单的来说 在screen里面敲的命令都是在后台的,所以不需要想bg那样,ctrl+z在bg把后台服务运行起来.而且下次可以直接进去screen作业的后台界面,可以看到我们过去敲的命令记录,即使你的C ...
- AC日记——验证字串 openjudge 1.7 18
18:验证子串 总时间限制: 1000ms 内存限制: 65536kB 描述 输入两个字符串,验证其中一个串是否为另一个串的子串. 输入 输入两个字符串, 每个字符串占一行,长度不超过200且不 ...
- 关于OATUH中的AUTHRAZITON CODE和TOKEN的关系,实际上就是这么回事
关于OATUH中的AUTHRAZITON CODE和TOKEN的关系,实际上就是这么回事 每回要拿AUTHRAZITON CODE换取TOKEN,然后才能正常通信, 为什么要多一步呢?直接给TOKEN ...
- u3d单词学习plane
plane n.水平: 平面: 飞机: 木工刨
- 面向对象——is和as运算符、泛型集合 List<T>
二:is和as运算符: (1) is运算符 is 运算符用于检查对象是否与给定类型兼容.如果兼容返回true,否则返回false; 一般用于查看某个类是否实现了某个接口,或者是不是某个类的子类; 例如 ...
- android整体架构概述--①
android的logo 是由设计师去厕所时来的灵感. 其中android的命名都是以甜点的名字来定的. android的系统一共有四层. 1.Linux内核和驱动层 2.函数库 由C或C++编写 ...
- java 22 - 21 多线程之多线程的代码实现方式3
JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法 A.public static ExecutorService newCachedThreadPool() B.public s ...