TTS–TextToSpeech
TextToSpeech指的是文字转语音技术。随着人工智能的发展,现在很多智能设备都开始支持语音输出功能了。对应APP开发来说,让机器说话,已经是一项很常见的需求了。目前有很多相关方面的API供大家选择。国内比较出名的比如讯飞的开放平台,提供了一套比较完整的SDK。
其实,Android系统本身是直接支持TTS的。大部分应该是在「设置」–「语言和输入法」里找到TTS相关的设置。国内可能由于各个厂商手机定制的ROM的不同,TTS里也会有不同预装的引擎。这些引擎能够提供给一些APP来使用,比如,某些阅读类APP是支持朗读功能的,大部分情况下,这类APP会使用系统的TTS来完成一个「文字」->「语音」的过程,来实现功能。
比如在项目中,需要这么一个功能,能够将交易完成时的金额实时的播报出来。通过Android系统的TTS功能就能比较快速的实现了。
准备工作
- 确定是否安装TTS引擎,若没有安装,这边提供Google官方的TTS引擎GoogleTTS(无法下载点这里)
- 安装好TTS引擎后,下载安装语音包。(在TTS的设置里,进行语音试听,语音引擎就会在后台自动下载语音包了)
代码实现
代码实现也是比较简单的,主要就是实例化一个TextToSpeech的对象,完成相关的初始化设定之后,再传入要转换成语音的字符串,就完成了一次完整的调用。下面来看代码:
上面这段代码,需要注意的就是设置语音包语言,再根据结果进行要不要输出语音。可以看到在onInit(int status)的回调中,需要对语音包语言进行设置,当第一次调用,发现缺少语音包的时,引擎会在后台下载相对应语言的语音包。
关键调用的是mTextToSpeech.speak(msg, TextToSpeech.QUEUE_ADD, map);这个函数。它需要传入3个参数:
- 第1个参数,我们要转换的文字内容;
- 第2个参数,在列队中的等待模式,它有两个参数TextToSpeech.QUEUE_ADD和TextToSpeech.QUEUE_FLUSH,QUEUE_ADD就是向播放列队末尾添加一个列队,在列队中,会依次完成转换和播放,而QUEUE_FLUSH则会清空列队里要播放的音频和要转换的文本,直接转换并播放当前的列队条目;
- 第3个参数,唯一的识别ID,可以生成UID传入;
需要注意的点:
- 实例化TextToSpeech对象时,注意第三个参数需要传语音引擎的包名
- speak方法在API21以上调用的方法有所不同,不过大同小异参考官方文档;
- speak方法只能在onInit回调中进行调用;
- 语音转换的文本的长度是有限制的,需要小于getMaxSpeechInputLength()获取的值;
最后给一个供参考的工具类SpeakerUtil.java