文本  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 音频的更多相关文章

  1. 文本转音频(百度语音合成api)(python)(原创)

    应之前的一家小学教育培训机构的要求设计的一款 将文字转音频的程序.(注:后面应该是生成音频才对,没有改过来) 技术难点: ①语音合成,如果没有现在这么多的云服务-百度云语音合成,我估计这个程序会费很大 ...

  2. Day 05 文本处理和爬虫基础1

    目录 什么是文件 什么是文本 如何通过文本编辑器控制.txt文件 打开文件的三种模式 t和b模式 高级应用 文本处理 + 词云分析 效果如下 爬虫原理 requests模块 re模块 爬取图片 爬取视 ...

  3. 文本单词one-hot编码

    单词->字母->向量 神经网络是建立在数学的基础上进行计算的,因此对数字更敏感,不管是什么样的特征数据都需要以向量的形式喂入神经网络,无论是图片.文本.音频.视频都是一样. one-hot ...

  4. Linux实战教学笔记01:计算机硬件组成与基本原理

    标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...

  5. WhatsApp的Erlang世界

    rick 的两个ppt整理 下载:2012 2013  ,使用半年erlang后,重新看这两个ppt才发现更多值的学习的地方,从ppt中整理如下: - Prefer os:timestamp to e ...

  6. iOS路径沙盒文件管理(转载)

    iOS路径沙盒文件管理,看到博主总结的很好,转载过来,原文:http://www.aichengxu.com/view/35264 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文 ...

  7. 运用TensorFlow处理简单的NLP问题

    当前无论是学术界还是工业界,深度学习都受到极大的追捧,尤其是在Google开源深度学习平台TensorFlow之后,更是给深度学习火上浇油.目前在开源社区Github上所有开源项目中,TensorFl ...

  8. Java中9种IO的读取方式

    数据的读写,按照数据类型可以分为两种:字符流和字节流(二者区别?).所以数据读取方式按照数据类型也可以分为两类:字节流的读取和字符流的读取. 一.字节流读取操作: |  | |-----1.FileI ...

  9. 今天谈谈流,什么是IO流?

    无标题 (5) :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { bord ...

随机推荐

  1. .NET项目开发—浅谈面向接口编程、可测试性、单元测试、迭代重构(项目小结)

    阅读目录: 1.开篇介绍 2.迭代测试.重构(强制性面向接口编程,要求代码具有可测试性) 2.1.面向接口编程的两个设计误区 2.1.1.接口的依赖倒置 2.1.2.接口对实体的抽象 2.2.迭代单元 ...

  2. MySQL的Explain命令

    Explain命令是查看查询优化器如何决定执行查询的主要办法.   调用 EXPLAIN   要使用EXPLAIN,只需在查询中的SELECT关键字之前增加EXPLAIN.MySQL会在查询上设置一个 ...

  3. 预定义接口-迭代器Iterator

    <?php /* 可在内部迭代自己的外部迭代器或类的接口. Iterator extends Traversable { abstract public mixed current ( void ...

  4. jquery 获取设置值、添加元素详解

    jQuery 获取内容和属性 jQuery DOM 操作 jQuery 中非常重要的部分,就是操作 DOM 的能力. jQuery 提供一系列与 DOM 相关的方法,这使访问和操作元素和属性变得很容易 ...

  5. Linux下ejabberd开机自启(CentOS)

    废话少说,Linux下开机自启动Ejabberd步骤如下: 1.从ejabberd安装目录的bin目录拷贝ejabberd.init到/etc/init.d/ejabberd下 [root@imser ...

  6. [转] Finding the Best Programmer's Font

    原文 Finding the Best Programmer's Font

  7. ASP.NET Web API 安全筛选器

    原文:https://msdn.microsoft.com/zh-cn/magazine/dn781361.aspx 身份验证和授权是应用程序安全的基础.身份验证通过验证提供的凭据来确定用户身份,而授 ...

  8. 使用HTTP方式远程连接PowerShell

    借助Windows PowerShell,我们可以像管理Linux一样使用命令行来远程管理Windows服务器.但是默认情况下,我们只能在域环境中使用PowerShell Remoting.如果是通过 ...

  9. 最小生成树POJ3522 Slim Span[kruskal]

    Slim Span Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7594   Accepted: 4029 Descrip ...

  10. 输出国际象棋&&输出余弦曲线

    输出国际象棋棋盘 #include <stdio.h> #include <stdlib.h> #include <windows.h> int main(){ i ...