使用GoogleTTS

TTS–TextToSpeech

TextToSpeech指的是文字转语音技术。随着人工智能的发展,现在很多智能设备都开始支持语音输出功能了。对应APP开发来说,让机器说话,已经是一项很常见的需求了。目前有很多相关方面的API供大家选择。国内比较出名的比如讯飞的开放平台,提供了一套比较完整的SDK。

其实,Android系统本身是直接支持TTS的。大部分应该是在「设置」–「语言和输入法」里找到TTS相关的设置。国内可能由于各个厂商手机定制的ROM的不同,TTS里也会有不同预装的引擎。这些引擎能够提供给一些APP来使用,比如,某些阅读类APP是支持朗读功能的,大部分情况下,这类APP会使用系统的TTS来完成一个「文字」->「语音」的过程,来实现功能。

比如在项目中,需要这么一个功能,能够将交易完成时的金额实时的播报出来。通过Android系统的TTS功能就能比较快速的实现了。

准备工作

  1. 确定是否安装TTS引擎,若没有安装,这边提供Google官方的TTS引擎GoogleTTS(无法下载点这里)
  2. 安装好TTS引擎后,下载安装语音包。(在TTS的设置里,进行语音试听,语音引擎就会在后台自动下载语音包了)

代码实现

代码实现也是比较简单的,主要就是实例化一个TextToSpeech的对象,完成相关的初始化设定之后,再传入要转换成语音的字符串,就完成了一次完整的调用。下面来看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
mTextToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
//设置语音包语言
int result = mTextToSpeech.setLanguage(Locale.CHINA);
initSuccess = false;
if (result == TextToSpeech.LANG_MISSING_DATA) {
ToastUtil.showShortToast(context, "缺少语音包,请稍后重试");
} else if (result == TextToSpeech.LANG_NOT_SUPPORTED) {
ToastUtil.showShortToast(context, "不支持该语言");
} else if (result != TextToSpeech.LANG_COUNTRY_AVAILABLE
&& result != TextToSpeech.LANG_AVAILABLE) {
Log.e(TAG, "onInit: TTS暂时不支持这种语言的朗读!");
} else {
initSuccess = true;
mTextToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
Log.d("TextToSpeech", "onStart: ");
}
@Override
public void onDone(String utteranceId) {
Log.d("TextToSpeech", "onDone: ");
}
@Override
public void onError(String utteranceId) {
Log.d("TextToSpeech", "onErr: ");
}
});
HashMap<String, String> map = new HashMap<>();
String utteranceId = UUID.randomUUID().toString();
map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceId);
map.put(Constants.GOOGLE_TTS_PKG_NAME + ":engine", utteranceId);
//调用speak方法,传入文本和模式
int res = mTextToSpeech.speak(msg, TextToSpeech.QUEUE_ADD, map);
if (res != TextToSpeech.SUCCESS) {
Log.e(TAG, "onInit:res:" + res);
}
}
} else {
Log.e(TAG, "onInit: 连接TTS引擎失败");
}
}
}, "com.google.android.tts");

上面这段代码,需要注意的就是设置语音包语言,再根据结果进行要不要输出语音。可以看到在onInit(int status)的回调中,需要对语音包语言进行设置,当第一次调用,发现缺少语音包的时,引擎会在后台下载相对应语言的语音包。

关键调用的是mTextToSpeech.speak(msg, TextToSpeech.QUEUE_ADD, map);这个函数。它需要传入3个参数:

  1. 第1个参数,我们要转换的文字内容;
  2. 第2个参数,在列队中的等待模式,它有两个参数TextToSpeech.QUEUE_ADD和TextToSpeech.QUEUE_FLUSH,QUEUE_ADD就是向播放列队末尾添加一个列队,在列队中,会依次完成转换和播放,而QUEUE_FLUSH则会清空列队里要播放的音频和要转换的文本,直接转换并播放当前的列队条目;
  3. 第3个参数,唯一的识别ID,可以生成UID传入;

需要注意的点:

  • 实例化TextToSpeech对象时,注意第三个参数需要传语音引擎的包名
  • speak方法在API21以上调用的方法有所不同,不过大同小异参考官方文档;
  • speak方法只能在onInit回调中进行调用;
  • 语音转换的文本的长度是有限制的,需要小于getMaxSpeechInputLength()获取的值;

最后给一个供参考的工具类SpeakerUtil.java