Android中提供的免费文字转语音功能TextToSpeech之快速入门用法(Android TTS 语音合成播报)
简要介绍
TextToSpeech简称 TTS,是Android 1.6版本中比较重要的新功能。将所指定的文本转成不同语言音频输出。它可以方便的嵌入到游戏或者应用程序中,增强用户体验。
在 Android 中,TTS全称叫做 Text to Speech,从字面就能理解它解决的问题是什么,把文本转为语音服务,意思就是你输入一段文本信息,然后Android 系统可以把这段文字播报出来。这种应用场景目前比较多是在各种语音助手APP上,很多手机系统集成商内部都有内置文本转语音服务,可以读当前页面上的文本信息。同样,在一些阅读类APP上我们也能看到相关服务,打开微信读书,里面就直接可以把当前页面直接用语音方式播放出来,特别适合哪种不方便拿着手机屏幕阅读的场景。
TTS engine依托于当前AndroidPlatform所支持的几种主要的语言:English、French、German、Italian和Spanish五大语言(暂时没有我们伟大的中文,至少Google的科学家们还没有把中文玩到炉火纯青的地步,先易后难也是理所当然。)TTS可以将文本随意的转换成以上任意五种语言的语音输出。与此同时,对于个别的语言版本将取决于不同的时区,例如:对于English,在TTS中可以分别输出美式和英式两种不同的版本(由此看出Google的做事风格真够细致,而正因为如此估计Google不加入中文的另外一种理由是中文的方言太多了)。
常见的有如下几种类型:
系统自带的 TTS 功能是不支持中文的,想要支持中文的话,需要借助第三方引擎,比如常见的科大讯飞、百度等。
如果换成支持中文引擎的话,一旦输入的文本中有夹杂着英文,那么有时候第三方TTS引擎有时候就很不友好,有时候会把英文单词每个字母读出来,英文甚至是发音不了,这里就需要注意下引擎的测试。
在设置 TTS 参数的时候,需要注意语速、音高、音调的上限值,有时候参数可能是0-100的范围,有时候有些参数是在0-10的范围,特别需要根据不同引擎参数的值类型去设定。
TTS 优劣势
从实现原理我们可以看到Android系统原生自带了一个TTS引擎。那么在此,我们就也可以去自定义TTS引擎,只有继承ITextToSpeechService接口即可,实现里面的方法。这就为后续自定义TTS引擎埋下伏笔了,因为系统默认的TTS引擎是不支持中文,那么市场上比较好的TTS相关产品,一般是集成讯飞或者Nuance等第三方供应商。
因此,我们也可以看到TTS优劣势:
优势:接口定义完善,有着完整的API接口方法,同时支持扩展,可根据自身开发业务需求重新打造TTS引擎,并且与原生接口做兼容,可适配。
劣势:原生系统TTS引擎支持的多国语言有限,目前不支持多实例和多通道。
完整代码
import android.content.Intent;
import android.speech.tts.TextToSpeech;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.util.Locale;
public class HomeActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
private TextToSpeech tts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
initTextToSpeech();
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
speakText("语音设备检测结果正常。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
@Override
public void onInit(int i) {
if (i == TextToSpeech.SUCCESS) {
// setLanguage设置语言
int result = tts.setLanguage(Locale.CHINA);
int result2 = tts.setLanguage(Locale.CHINESE);
Log.e("tts:", "语言设置结果:"+result+":"+result2);
// 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();
}else {
//不支持中文就将语言设置为英文
tts.setLanguage(Locale.US);
}
}
}
private void initTextToSpeech() {
// 参数Context,TextToSpeech.OnInitListener
tts = new TextToSpeech(this, this);
// 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
tts.setPitch(1.0f);
// 设置语速
// tts.setSpeechRate(0.5f);
}
private void speakText(final String text) {
Log.e("资源文件路径:", "准备朗读" );
// validate
if (TextUtils.isEmpty(text)) {
Toast.makeText(HomeActivity.this, "请您输入要朗读的文字", Toast.LENGTH_SHORT).show();
return;
}
// TODO validate success, do something
if (tts != null && !tts.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:该模式下会把新的语音任务放到语音任务之后,
等前面的语音任务执行完了才会执行新的语音任务
*/
Log.e("资源文件路径:", "开始朗读");
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
}
@Override
protected void onStop() {
super.onStop();
// 不管是否正在朗读TTS都被打断
tts.stop();
// 关闭,释放资源
tts.shutdown();
}
@Override
protected void onDestroy() {
if (tts != null) {
tts.stop();
tts.shutdown();
tts = null;
}
super.onDestroy();
}
}
要点免坑
在跳转到Activity后,直接调用 speak()方法,会发现没有声音,需要通过线程等待一点时间后,进行调用,tts需要完成初始化和相关配置。
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
speakText("现在开始识别,请做好准备,对准识别的文字。");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
主要方法
tts.setPitch();
tts.setSpeechRate();
tts.speak();
tts.addSpeech();
tts.setVoice();
tts.setOnUtteranceProgressListener();
tts.setEngineByPackageName();
// 不管是否正在朗读TTS都被打断
tts.stop();
// 关闭,释放资源
tts.shutdown();
自动加载缺失资源
/*
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, ActivityResult_CODE);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// super.onActivityResult(requestCode, resultCode, data);
if (ActivityResult_CODE == requestCode){
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS){
Log.e(TAG, " android集成tts: "+resultCode );
ttsRead();
}else {
//系统没有自带,网上下载
Log.e(TAG, " android没有集成tts: "+resultCode );
Intent installIntent = new Intent();
installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}*/
相关文章
- Android:使用ZXing生成二维码(支持加入Logo图案)
- Android 多用户 —— 从入门到应用分身
- Android游戏框架Libgdx使用入门
- Android入门之Fragment和FragmentActivity的使用方法
- Android入门之简单短信发送器
- Android菜单详解(一)——理解android中的Menu
- Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍
- Android开发 - Fragment与Activity生命周期比较
- Android-Unable to resolve target 'android-8'
- Android studio的错误:radle sync failed: Cause: failed to find target android-21 :
- 《精通Android 实例开发》——第1章,第1.3节在Windows环境下集成安装Eclipse和Android SDK
- 《Android应用开发入门经典(第3版)》——第1.6节小结
- Android入门之文件系统操作(一)简单的文件浏览器
- Android圆形图片不求人,自定义View实现(BitmapShader使用)
- Android Studio导入第三方类库的方法
- Android获取图片资源的4种方式
- Android - View绘图原理总结
- Android 自定义View (四) 视频音量调控
- Android SurfaceView实战 打造抽奖转盘
- android开发,静音录制视频,在一般清晰度的前提下保证文件大小越小越好
- Android Studio 插件开发入门
- Android 串口通信基于licheedev和android-serialport两种方案实现附Demo
- Android 百度地图 SDK v3.0.0 (四) 离线地图功能介绍
- Android Studio Error:Could not find com.android.tools.build:gradle