寫在前面
今日應內部團隊需求,要實時朗讀語音。在這個場景驅動,快速過了一遍官方文檔。通過此筆記,摘錄自己的思考和理解的內容,方便日后快速回憶。
所以說這是一個偏個人的筆記,對于需要全面了解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,也是有所收獲。