随着科技的不断进步,人们对于可视化的需求越来越高。而对于导盲软件、语音播报、语音输入等应用,用户对于声音的需求甚至比对于图像的需求还要重要。但是,如何让应用说话,成为了很多开发者面临的难题。Android TTS(即Android Text-To-Speech,中文意为文本转语音)是Google Android团队针对Android平台所提供的一种自然语言合成系统,它能够将自然语言文本转变成能够被人类听懂的语音信息。
一、TTS的基本原理
Android TTS是基于系统默认的TTS Engine。使用TTS Engine需要以下步骤: 1. 引入TTS Engine:需要在配置文件AndroidManifest.xml中添加以下配置信息
2. 创建TTS Engine对象:创建TTS Engine对象需要主要构造函数. private TextToSpeech textToSpeech; ... textToSpeech = new TextToSpeech(this, this); 3. 设置回调函数:为了实现TTS Engine的状态监听,需要设置回调函数. @Override public void onInit(int status) { if(status == TextToSpeech.SUCCESS) { textToSpeech.setOnUtteranceProgressListener(new TTSUtteranceProgressListener()); } } 4. 文本转语音:在完成TTS Engine的初始化工作后,就可以将文本转变成语音信息了. @Override public void speak(String text) { if(textToSpeech == null) { return; } String utteranceId = hashCode() + ""; HashMap
params = new HashMap<>(); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceId); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId); } else { textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, params); } }
二、TTS的使用场景
Android TTS应用场景非常之广泛。其中的一个典型应用场景便是语音导航。通过将行进路线的信息和提醒内容转换成语音,可以使司机在驾车时不用看路,直接听取语音提示,使驾车更加安全。还有一种应用场景便是TTS播报内容。例如,当应用有新消息时,通过TTS播报内容,可以在用户无视觉的情况下提醒用户。
三、TTS的开发注意事项
1. 不同TTS Engine的API、回调函数都存在差异。需要注意调用对应的API。 2. 在初始化TTS Engine的时候,如果网络不可用或者资源下载失败等情况下,使用TTS Engine会出现空指针异常。因此在实现TTS Engine并使用前,应该对Android手机当前的网络状态以及下载耗时进行检测,确保能够正常使用TTS Engine。 3. 在使用TTS Engine时,会有一定的延迟,需要注意使用场景,避免出现较大的延迟。
四、TTS的完整代码示例
public class TTSService extends Service implements TextToSpeech.OnInitListener {
/**
* TTS Engine对象
*/
private TextToSpeech mTts;
@Override
public void onCreate() {
super.onCreate();
mTts = new TextToSpeech(this, this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY_COMPATIBILITY;
}
@Override
public void onDestroy() {
if (mTts != null) {
mTts.stop();
mTts.shutdown();
}
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
/**
* 播放语音
* @param text 文本
* @param utteranceId 语音ID
*/
public void playTalkText(String text, String utteranceId) {
if (mTts == null) {
return;
}
if (text.length() == 0) {
return;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
} else {
mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
}
/**
* TTS Engine初始化完成回调函数
* @param status 初始化状态,成功时为TextToSpeech.SUCCESS
*/
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
mTts.setLanguage(Locale.CHINA);
mTts.setSpeechRate(0.8f);
}
}
}