写在前面
今日应内部团队需求,要实时朗读语音。在这个场景驱动,快速过了一遍官方文档。通过此笔记,摘录自己的思考和理解的内容,方便日后快速回忆。
所以说这是一个偏个人的笔记,对于需要全面了解TTS的看官,可能要失望了。
「android.speech」和「android.speech.tts」
「android.speech」
包不在我这次要了解的范围内,后续会补上相关笔记。
「android.speech.tts」
包的tts是「Text To Speech」缩写,文字转语音。
为了开发者便于使用,在AOSP中,关于「兼容性定义文档」的说明,要求每个Android OS版本发行都要兼容的功能实现,其中「TTS」就是以一个Framework的形式存在,开发者通过已有的API,与这个Framework服务进行交互动作。
以一个简单的使用常见为例:播放一句话,简单列出涉及到的相关API。
- 创建
TextToSpeech
实例mTts
,API会调用唤起Framework并进行一系列初始化,未初始化完成是用不了的,所以要OnInitListener
监听回调。 - 回调的结果要么是
TextToSpeech.Engine.SUCCESS
要么是TextToSpeech.Engine.ERROR
。 - 成功后,可以对
mTts
进行配置。 - 设置当前要识别合成的语言,使用
voice
,language
是已经deprecated。 - 设置语速
speechRate
, 正常速度为1.0f
,2.0f是2倍速,0.5是慢1倍速。 - 设置音调
pitch
,正常调为1.0f
,跟语速的值规则类似 - 添加每次speak方法的识别回调
UtteranceProgressListener
接口的实现 - 调用
speak()
方法-
text
要朗读的文本内容 -
queueMode
队列模式有TextToSpeech.QUEUE_ADD
和 -
bundle
,设置三个值:
-使用哪种系统的媒体音类型的音量
,取值为AudioManager
类STREAM_
前缀的常量及
-本次播放使用的音量大小
,取值0-1,即0%-100%
-KEY_PARAM_PAN
,不是很理解是英文说的是什么,取值 -
utteranceId
暂未遇到使用场景;
TextToSpeech.QUEUE_FLUSH
,这个场景应该比较常见:自动顺序朗读段落,用户突然点击重放,由头重新朗读,则使用QUEUE_FLUSH
值。
-
上述是一次理想的流程,在实际场景中,可能会遇到各种情况,例如文字识别失败、网络识别的网络失败、framework服务内部失败、音频流输出失败等情况,API都有相关的常量值可供识别使用。
另外TextToSpeech.Engine
类,不是一个真正的“引擎”,它只定义了与Framework交互使用到常量:Activity Action、Broadcast Action、Intent、Bundle Key值等,所以这个命名一度令我不知所措。
Framework本身还支持开发者通过ACTION,调用:检查是否可用的语言包、是否有Framework存在、检查目标语言的语言包是否已安装、发起安装语言包指令。
后记
通过简单的封装,配合WebView的Js Interface,让H5前端项目的同事能调用Android的TTS进行朗读。然而事情没有那么简单,因为使用的设备是小米电视4,根本就没有TTS Framework,只能使用第三方语音识别SDK解决,例如科大讯飞的。
Anyway,借机了解这块API,也是有所收获。