在前面的系列文章中累贤,我們完整的分析了智能語(yǔ)音系統(tǒng)的系統(tǒng)組成狱杰,然后,我們提供了一個(gè)基于Python的DuerOS客戶端供大家實(shí)際體驗(yàn)看疙。這時(shí)候很多同學(xué)可能想:我能不能從零開始豆拨,完全的基于DuerOS提供的后臺(tái)能力接口,用自己喜歡的語(yǔ)言(如C/C++能庆、Java、ObjectC脚线、Python搁胆、NodeJS),在自己熟悉的平臺(tái)上(如Android、iOS渠旁、Linux攀例、Windows、樹莓派顾腊、單片機(jī))粤铭,自己獨(dú)立完成DurOS的客戶端開發(fā)呢?特別是對(duì)有產(chǎn)品化想法的同學(xué)杂靶,把DurOS的能力集成到自己的項(xiàng)目平臺(tái)中梆惯。
這篇文章就跟大家一起來(lái)熟悉下DuerOS客戶端實(shí)現(xiàn)的架構(gòu)設(shè)計(jì),主要是側(cè)重對(duì)DuerOS客戶端協(xié)議的解析(對(duì)于設(shè)備端開發(fā)過(guò)程中涉及到的更多細(xì)節(jié)吗垮,如AEC垛吗、采樣率轉(zhuǎn)換、音頻焦點(diǎn)管理烁登、混音處理)怯屉,會(huì)在后面的文章中一一作出介紹和解析),希望這篇文章能對(duì)你的開發(fā)和工作有幫助饵沧。
DuerOS客戶端核心任務(wù)
簡(jiǎn)單的說(shuō)锨络,客戶端的主要任務(wù)就是,將用戶的語(yǔ)音數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳給DuerOS后臺(tái)狼牺,然后足删,執(zhí)行DuerOS后臺(tái)經(jīng)過(guò)語(yǔ)音處理后的結(jié)果。
當(dāng)然了如果锁右,真是這么簡(jiǎn)單就好了~
具體的說(shuō)失受,客戶端需要完成的工作主要有,
- 同DuerOS后臺(tái)建立長(zhǎng)鏈接咏瑟,接收并處理DuerOS后臺(tái)的推送命令(Directive)
- 上傳用戶錄音數(shù)據(jù)到DuerOS后臺(tái)服務(wù)器
- 執(zhí)行上傳錄音后拂到,DuerOS后臺(tái)返回的控制命令(Directive)
- 上傳設(shè)備事件[Event]到DuerOS后臺(tái)服務(wù)端
- 通過(guò)Ping的方式保持鏈接
其中,
Directive:指DurOS服務(wù)端對(duì)客戶端的控制命令码泞,如播放一個(gè)語(yǔ)音兄旬,設(shè)置一個(gè)鬧鐘,播放一個(gè)音樂等等余寥。
Event:指客戶端上報(bào)當(dāng)前發(fā)生的事件到DuerOS服務(wù)端领铐,如音樂播放開始了,音樂播放結(jié)束了宋舷,鬧鈴開始響了绪撵,設(shè)備被喚醒并開始接受用戶語(yǔ)音請(qǐng)求等等。在上傳Event時(shí)祝蝠,會(huì)附帶設(shè)備當(dāng)前的狀態(tài)信息(ClientContext音诈,如當(dāng)前是否有音樂正在播放幻碱,播放到哪里了,設(shè)備端是否有設(shè)置鬧鈴细溅,鬧鈴狀態(tài)等等)褥傍。
代碼實(shí)現(xiàn)
下面我們就結(jié)合具體場(chǎng)景和代碼,逐個(gè)的來(lái)看各個(gè)部分是如何實(shí)現(xiàn)的喇聊。
分析場(chǎng)景:
- 用戶語(yǔ)音輸入“播放周杰倫的歌”
- 客戶端上傳用戶的語(yǔ)音數(shù)據(jù)到DurOS后臺(tái)服務(wù)器
- DuerOS后臺(tái)服務(wù)判斷用戶輸入結(jié)束恍风,下發(fā)停止錄音Directive
- 客戶端響應(yīng)停止錄音的Directive
- 客戶端響應(yīng)錄音通道,服務(wù)端返回的需要播放歌曲的Directive
- 客戶端上報(bào)開始音樂播放的狀態(tài)到DuerOS后臺(tái)服務(wù)器
1. 同DuerOS后臺(tái)建立長(zhǎng)鏈接誓篱,接收并處理DuerOS后臺(tái)的推送命令(Directive)
長(zhǎng)鏈接主要實(shí)現(xiàn)DuerOS后臺(tái)主動(dòng)向客戶端發(fā)送命令朋贬。比如,客戶端一直向DuerOS后臺(tái)發(fā)送數(shù)據(jù)燕鸽,當(dāng)DuerOS后臺(tái)檢測(cè)到用戶輸入結(jié)束時(shí)(VAD檢測(cè))兄世,DuerOS后臺(tái)會(huì)主動(dòng)通知客戶端停止錄音,并上傳錄音數(shù)據(jù)啊研。
DuerOS的所有能力都是基于Http的(沒有使用TCP/IP)御滩,為了實(shí)現(xiàn)長(zhǎng)鏈接DuerOS的做法是:
- 客戶端向DuerOS服務(wù)端發(fā)送get請(qǐng)求(設(shè)置較長(zhǎng)的超時(shí)時(shí)間)
- DuerOS服務(wù)端收到get請(qǐng)求后,并不立即回復(fù)
- DuerOS服務(wù)端需要主動(dòng)下發(fā)命令給客戶端時(shí)党远,返回get結(jié)果
- 客戶端通過(guò)接收get的返回內(nèi)容削解,完成DuerOS服務(wù)端主動(dòng)推動(dòng)內(nèi)容的接收
Python DuerOS客戶端對(duì)應(yīng)的代碼實(shí)現(xiàn)(sdk/dueros_core.py),
長(zhǎng)鏈接建立:
長(zhǎng)鏈接建立
DuerOS 下發(fā)Directive接收
2. 上傳用戶錄音數(shù)據(jù)到DuerOS后臺(tái)服務(wù)器
上傳用戶錄音數(shù)據(jù)不單單是用戶說(shuō)話的音頻流PCM數(shù)據(jù)沟娱,同時(shí)包括設(shè)備的狀態(tài)信息(ClientContext)氛驮,和開始錄音的Event(ListenStarted)。狀態(tài)和數(shù)據(jù)發(fā)送通過(guò)Post完成济似,Http的Body內(nèi)容如下所示矫废,
其中,ClientContext砰蠢、Event蓖扑、和音頻流PCM通過(guò)multipart+chunk的Http Post方式進(jìn)行上傳(后面可能會(huì)添加一個(gè)帖子,專門介紹下Http 1.0台舱、1.1律杠、 2.0、multipart竞惋、chunk傳輸?shù)葍?nèi)容)柜去。
Python DuerOS客戶端對(duì)應(yīng)實(shí)現(xiàn)(sdk/dueros_core.py),
3. 執(zhí)行上傳錄音后拆宛,DuerOS后臺(tái)返回的控制命令(Directive)
用戶語(yǔ)音輸入“播放周杰倫的音樂”后嗓奢,語(yǔ)音上傳通道會(huì)收到DuerOS后臺(tái)服務(wù)器返回需要播放的音樂的Directive。
4. 客戶端上傳音樂開始播放的Event
音樂開始播放后胰挑,客戶端上傳音樂開始播放的Event到DuerOS服務(wù)端(sdk/interface/audio_player.py)
5. Ping
Ping主要為了鏈接的維護(hù)蔓罚。Http 1.0中每次Http 請(qǐng)求都需要進(jìn)行TCP/IP的3次握手和4次揮手椿肩,Http1.1后支持連接復(fù)用瞻颂,一次TCP/IP連接可以完成多次Http請(qǐng)求和回復(fù)豺谈。DuerOS使用Http2.0,為了避免鏈路上長(zhǎng)時(shí)間沒有數(shù)據(jù)傳輸而斷開贡这,使用Ping維持鏈接茬末。
sdk/dureos_core.py
總結(jié)
通路總結(jié)
客戶端同DuerOS服務(wù)端的通路一共有3個(gè):
- 長(zhǎng)鏈接通路
雙向
客戶端發(fā)送get請(qǐng)求
服務(wù)端通過(guò)get response的形式推送消息(如停止錄音Directive)
- 事件上報(bào)通路
雙向
客戶端發(fā)送post請(qǐng)求(包含開始錄音的Event、當(dāng)前設(shè)備狀態(tài)ClientContext盖矫、錄音數(shù)據(jù)PCM)
服務(wù)端返回語(yǔ)音請(qǐng)求的結(jié)果(如播放歌曲的Directive)
客戶端單獨(dú)上傳事件到DurOS服務(wù)端(如開始播放音樂)
- Ping通路
單向
客戶端通過(guò)get形式在鏈路沒數(shù)據(jù)時(shí)發(fā)送Ping數(shù)據(jù)包
注意事項(xiàng)
- 事件(Event)和設(shè)備當(dāng)前狀態(tài)(ClientContext)一定是一起發(fā)送的
- Directive下發(fā)通道
長(zhǎng)鏈接通道和事件上報(bào)通路(錄音數(shù)據(jù)上傳)都會(huì)下發(fā)Directive(如丽惭,長(zhǎng)鏈接會(huì)下發(fā)停止錄音的Directive,錄音上傳通道會(huì)下發(fā)包含音樂播放內(nèi)容的音樂播放Directive) - Event上傳通道
錄音數(shù)據(jù)上傳(包括開始錄音Event辈双、當(dāng)前設(shè)備狀態(tài)ClientContext和錄音數(shù)據(jù)PCM)和單獨(dú)的事件上報(bào)(如音樂開始播放)共用同一通道 - Http技術(shù)細(xì)節(jié)
Http2.0特性
鏈接復(fù)用
MultiPart
Chunk
Ping連接維護(hù)
關(guān)于Http相關(guān)的技術(shù)細(xì)節(jié)后面專門寫篇帖子吧