Step by Step帶你玩轉(zhuǎn)DuerOS - DuerOS客戶端架構(gòu)設(shè)計(jì)(6)

在前面的系列文章中累贤,我們完整的分析了智能語(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接收

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)容如下所示矫废,

用戶錄音數(shù)據(jù)上傳報(bào)文格式

其中,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),


用戶錄音數(shù)據(jù)上傳

3. 執(zhí)行上傳錄音后拆宛,DuerOS后臺(tái)返回的控制命令(Directive)

用戶語(yǔ)音輸入“播放周杰倫的音樂”后嗓奢,語(yǔ)音上傳通道會(huì)收到DuerOS后臺(tái)服務(wù)器返回需要播放的音樂的Directive。

錄音上傳后返回的Directive

4. 客戶端上傳音樂開始播放的Event

音樂開始播放后胰挑,客戶端上傳音樂開始播放的Event到DuerOS服務(wù)端(sdk/interface/audio_player.py)


上傳音樂開始播放的Event

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


Ping

總結(jié)

通路總結(jié)

客戶端同DuerOS服務(wù)端的通路一共有3個(gè):

  • 長(zhǎng)鏈接通路
長(zhǎng)鏈接

雙向
客戶端發(fā)送get請(qǐng)求
服務(wù)端通過(guò)get response的形式推送消息(如停止錄音Directive)

  • 事件上報(bào)通路
事件上報(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通路
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é)后面專門寫篇帖子吧
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末责掏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子湃望,更是在濱河造成了極大的恐慌换衬,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件证芭,死亡現(xiàn)場(chǎng)離奇詭異瞳浦,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)废士,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門叫潦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人官硝,你說(shuō)我怎么就攤上這事矗蕊。” “怎么了氢架?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵傻咖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我达箍,道長(zhǎng)没龙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任缎玫,我火速辦了婚禮硬纤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赃磨。我一直安慰自己筝家,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布邻辉。 她就那樣靜靜地躺著溪王,像睡著了一般腮鞍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莹菱,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天移国,我揣著相機(jī)與錄音,去河邊找鬼道伟。 笑死迹缀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜜徽。 我是一名探鬼主播祝懂,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拘鞋!你這毒婦竟也來(lái)了砚蓬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盆色,失蹤者是張志新(化名)和其女友劉穎灰蛙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傅事,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缕允,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹭越。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片障本。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖响鹃,靈堂內(nèi)的尸體忽然破棺而出驾霜,到底是詐尸還是另有隱情,我是刑警寧澤买置,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布粪糙,位于F島的核電站,受9級(jí)特大地震影響忿项,放射性物質(zhì)發(fā)生泄漏蓉冈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一轩触、第九天 我趴在偏房一處隱蔽的房頂上張望寞酿。 院中可真熱鬧,春花似錦脱柱、人聲如沸伐弹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惨好。三九已至煌茴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間日川,已是汗流浹背蔓腐。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逗鸣,地道東北人合住。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓绰精,卻偏偏與公主長(zhǎng)得像撒璧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笨使,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容