TTS(从文本到语音(TextToSpeech))
TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。
它是同时运用语言学和心理学的杰出之作,在内置芯片的支持之下,通过神经网络的设计,把文字智能地转化为自然语音流。TTS技术对文本文件进行实时转换,转换时间之短可以秒计算。在其特有智能语音控制器作用下,文本输出的语音音律流畅,使得听者在听取信息时感觉自然,毫无机器语音输出的冷漠与生涩感。TTS语音合成技术 [1] 即将覆盖国标一、二级汉字,具有英文接口,自动识别中、英文,支持中英文混读。所有声音采用真人普通话为标准发音,实现了120-150个汉字/分钟的快速语音合成,朗读速度达3-4个汉字/秒,使用户可以听到清晰悦耳的音质和连贯流畅的语调。现在有少部分MP3随身听具有了TTS功能。
TTS是语音合成应用的一种,它将储存于电脑中的文件,如帮助文件或者网页,转换成自然语音输出。TTS不仅能帮助有视觉障碍的人阅读计算机上的信息,更能增加文本文档的可读性。现在的TTS应用包括语音驱动的邮件以及声音敏感系统,并常与声音识别程序一起使用。
从上面我们了解了把文字转化为语音是需要TTS技术,同时也简单的介绍了TTS技术是什么。
从Android官网了解到实现把文字转为语音,需要使用到TextToSpeech类。来看一下这个类。
TextToSpeech
将文字快速转化为语音进行播放或者保存为音频文件。
TextToSpeech
必须被实例化之后才能使用.实现TextToSpeech.OnInitListener
方法来获取实例化结果的监听。当你已经使用完TextToSpeech
实例之后, 应该调用shutdown()
方法来释放TextToSpeech
所使用的本地资源。-
构造方法
- //使用默认的引擎
TextToSpeech(Context context, TextToSpeech.OnInitListener listener)
//使用指定的引擎
TextToSpeech(Context context, TextToSpeech.OnInitListener listener, String engine)
- //使用默认的引擎
知道它(TextToSpeech)是干什么的了,我们来简单使用一下。看下面代码。
activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.LinearLayoutCompat 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:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">
<android.support.v7.widget.AppCompatEditText
android:id="@+id/main_edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:hint="请您输入要朗读的文字"
tools:ignore="HardcodedText" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/main_btn_read"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="朗读"
tools:ignore="HardcodedText" />
</android.support.v7.widget.LinearLayoutCompat>
activity_main.xml里面一个输入控件(被朗读的文字),一个按钮控件(点击按钮开始朗读)。
MainActivity.java文件
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.AppCompatEditText;
import android.text.TextUtils;
import android.view.View;
import android.widget.Toast;
import java.util.Locale;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, TextToSpeech.OnInitListener {
private AppCompatEditText main_edit_text;
private AppCompatButton main_btn_read;
// TTS对象
private TextToSpeech mTextToSpeech;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initTextToSpeech();
}
private void initTextToSpeech() {
// 参数Context,TextToSpeech.OnInitListener
mTextToSpeech = new TextToSpeech(this, this);
// 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
mTextToSpeech.setPitch(1.0f);
// 设置语速
mTextToSpeech.setSpeechRate(0.5f);
}
private void initView() {
main_edit_text = (AppCompatEditText) findViewById(R.id.main_edit_text);
main_btn_read = (AppCompatButton) findViewById(R.id.main_btn_read);
main_btn_read.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_btn_read:
submit();
break;
default:
break;
}
}
private void submit() {
// validate
String text = main_edit_text.getText().toString().trim();
if (TextUtils.isEmpty(text)) {
Toast.makeText(this, "请您输入要朗读的文字", Toast.LENGTH_SHORT).show();
return;
}
// TODO validate success, do something
if (mTextToSpeech != null && !mTextToSpeech.isSpeaking()) {
/*
TextToSpeech的speak方法有两个重载。
// 执行朗读的方法
speak(CharSequence text,int queueMode,Bundle params,String utteranceId);
// 将朗读的的声音记录成音频文件
synthesizeToFile(CharSequence text,Bundle params,File file,String utteranceId);
第二个参数queueMode用于指定发音队列模式,两种模式选择
(1)TextToSpeech.QUEUE_FLUSH:该模式下在有新任务时候会清除当前语音任务,执行新的语音任务
(2)TextToSpeech.QUEUE_ADD:该模式下会把新的语音任务放到语音任务之后,
等前面的语音任务执行完了才会执行新的语音任务
*/
mTextToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
}
/**
* 用来初始化TextToSpeech引擎
*
* @param status SUCCESS或ERROR这2个值
*/
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
/*
使用的是小米手机进行测试,打开设置,在系统和设备列表项中找到更多设置,
点击进入更多设置,在点击进入语言和输入法,见语言项列表,点击文字转语音(TTS)输出,
首选引擎项有三项为Pico TTs,科大讯飞语音引擎3.0,度秘语音引擎3.0。其中Pico TTS不支持
中文语言状态。其他两项支持中文。选择科大讯飞语音引擎3.0。进行测试。
如果自己的测试机里面没有可以读取中文的引擎,
那么不要紧,我在该Module包中放了一个科大讯飞语音引擎3.0.apk,将该引擎进行安装后,进入到
系统设置中,找到文字转语音(TTS)输出,将引擎修改为科大讯飞语音引擎3.0即可。重新启动测试
Demo即可体验到文字转中文语言。
*/
// setLanguage设置语言
int result = mTextToSpeech.setLanguage(Locale.CHINA);
// TextToSpeech.LANG_MISSING_DATA:表示语言的数据丢失
// TextToSpeech.LANG_NOT_SUPPORTED:不支持
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
Toast.makeText(this, "数据丢失或不支持", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onStop() {
super.onStop();
// 不管是否正在朗读TTS都被打断
mTextToSpeech.stop();
// 关闭,释放资源
mTextToSpeech.shutdown();
}
@Override
protected void onDestroy() {
if (mTextToSpeech != null) {
mTextToSpeech.stop();
mTextToSpeech.shutdown();
mTextToSpeech = null;
}
super.onDestroy();
}
}
代码注释已经写的很清楚了呢。
OK,开始测试Demo吧。
点击朗读,即可听到手机传出暖暖的云阳呢的声音。恩恩,声音很是美妙(技术带给我的快乐)。