寫(xiě)在前面
今日應(yīng)內(nèi)部團(tuán)隊(duì)需求,要實(shí)時(shí)朗讀語(yǔ)音。在這個(gè)場(chǎng)景驅(qū)動(dòng),快速過(guò)了一遍官方文檔。通過(guò)此筆記,摘錄自己的思考和理解的內(nèi)容,方便日后快速回憶。
所以說(shuō)這是一個(gè)偏個(gè)人的筆記,對(duì)于需要全面了解TTS的看官,可能要失望了。
「android.speech」和「android.speech.tts」
「android.speech」包不在我這次要了解的范圍內(nèi),后續(xù)會(huì)補(bǔ)上相關(guān)筆記。
「android.speech.tts」包的tts是「Text To Speech」縮寫(xiě),文字轉(zhuǎn)語(yǔ)音。
為了開(kāi)發(fā)者便于使用,在AOSP中,關(guān)于「兼容性定義文檔」的說(shuō)明,要求每個(gè)Android OS版本發(fā)行都要兼容的功能實(shí)現(xiàn),其中「TTS」就是以一個(gè)Framework的形式存在,開(kāi)發(fā)者通過(guò)已有的API,與這個(gè)Framework服務(wù)進(jìn)行交互動(dòng)作。
以一個(gè)簡(jiǎn)單的使用常見(jiàn)為例:播放一句話,簡(jiǎn)單列出涉及到的相關(guān)API。
- 創(chuàng)建
TextToSpeech實(shí)例mTts,API會(huì)調(diào)用喚起Framework并進(jìn)行一系列初始化,未初始化完成是用不了的,所以要OnInitListener監(jiān)聽(tīng)回調(diào)。 - 回調(diào)的結(jié)果要么是
TextToSpeech.Engine.SUCCESS要么是TextToSpeech.Engine.ERROR。 - 成功后,可以對(duì)
mTts進(jìn)行配置。 - 設(shè)置當(dāng)前要識(shí)別合成的語(yǔ)言,使用
voice,language是已經(jīng)deprecated。 - 設(shè)置語(yǔ)速
speechRate, 正常速度為1.0f,2.0f是2倍速,0.5是慢1倍速。 - 設(shè)置音調(diào)
pitch,正常調(diào)為1.0f,跟語(yǔ)速的值規(guī)則類似 - 添加每次speak方法的識(shí)別回調(diào)
UtteranceProgressListener接口的實(shí)現(xiàn) - 調(diào)用
speak()方法-
text要朗讀的文本內(nèi)容 -
queueMode隊(duì)列模式有TextToSpeech.QUEUE_ADD和 -
bundle,設(shè)置三個(gè)值:
-使用哪種系統(tǒng)的媒體音類型的音量,取值為AudioManager類STREAM_前綴的常量及
-本次播放使用的音量大小,取值0-1,即0%-100%
-KEY_PARAM_PAN,不是很理解是英文說(shuō)的是什么,取值 -
utteranceId暫未遇到使用場(chǎng)景;
TextToSpeech.QUEUE_FLUSH,這個(gè)場(chǎng)景應(yīng)該比較常見(jiàn):自動(dòng)順序朗讀段落,用戶突然點(diǎn)擊重放,由頭重新朗讀,則使用QUEUE_FLUSH值。
-
上述是一次理想的流程,在實(shí)際場(chǎng)景中,可能會(huì)遇到各種情況,例如文字識(shí)別失敗、網(wǎng)絡(luò)識(shí)別的網(wǎng)絡(luò)失敗、framework服務(wù)內(nèi)部失敗、音頻流輸出失敗等情況,API都有相關(guān)的常量值可供識(shí)別使用。
另外TextToSpeech.Engine類,不是一個(gè)真正的“引擎”,它只定義了與Framework交互使用到常量:Activity Action、Broadcast Action、Intent、Bundle Key值等,所以這個(gè)命名一度令我不知所措。
Framework本身還支持開(kāi)發(fā)者通過(guò)ACTION,調(diào)用:檢查是否可用的語(yǔ)言包、是否有Framework存在、檢查目標(biāo)語(yǔ)言的語(yǔ)言包是否已安裝、發(fā)起安裝語(yǔ)言包指令。
后記
通過(guò)簡(jiǎn)單的封裝,配合WebView的Js Interface,讓H5前端項(xiàng)目的同事能調(diào)用Android的TTS進(jìn)行朗讀。然而事情沒(méi)有那么簡(jiǎn)單,因?yàn)槭褂玫脑O(shè)備是小米電視4,根本就沒(méi)有TTS Framework,只能使用第三方語(yǔ)音識(shí)別SDK解決,例如科大訊飛的。
Anyway,借機(jī)了解這塊API,也是有所收獲。