深刻理解Amazon Alexa Skill(一)

語音助手(Virtual Personal Assistants, VPA)是物聯網智能家居中很火的一個領域,用戶能夠經過語言做爲入口來控制家裏各類各樣的設備,而亞馬遜的Alexa(echo,echo dot)是作的最先也是最優秀的一款產品,衍生出了很大的開發生態圈。本文基於亞馬遜的官方文檔試圖記錄做者對其Skill工做原理的理解。html

這不是一個手把手Skill開發入門教程,僅僅講解了概念與我的的一些理解node

宏觀概念

Alexa提供一系列內置的功能,好比回答問題,語音遊戲,控制智能家居設備,這些功能都是由skill實現的。亞馬遜爲Alexa skill提供了一個開放的開發環境,相似於google的Android,任何開發者均可以自由的開發skill並上傳到市場中供Alexa的用戶使用。Skill調用的基本過程:識別用戶調用請求——根據輸入語音判斷用戶意圖——執行功能。web

更具體來說,一個skill主要分爲兩部分:語音用戶接口部分(Voice User Interface (VUI) )和功能部分。VUI部分是運行在亞馬遜的Alexa雲上,Alexa根據設置的規則和用戶的語音判斷調用哪一個skill。當選擇調用你的skill後,纔會執行到skill的功能部分。那麼功能部分是怎麼實現的呢?其實很簡單,就是Alexa雲發一個JSON格式的數據的HTTPS請求給你預設好的服務器(能夠本身搭建web服務器來處理這個HTTPS請求,也能夠用AWS的lambda設置alexa來觸發)。這個JSON數據就是Alexa規定好的「協議」了,詳見文檔,發來的JSON內容包括用戶intent,用戶和設備的ID,本次會話的ID,訪問用戶隱私數據的令牌,用戶控制設備的的token(Oauth2.0)等等不少。你本身Web服務器(本身搭建須要驗證簽名來判斷這請求是否是Alexa服務器發來的)/Lambda的代碼來處理這個發來的JSON,同時你再給Alexa回覆JSON來響應。事實上,skill的功能代碼能夠完成任意功能,好比使用用戶的token來向第三方雲發送請求,實現根據語音控制他的智能家居設備。json

Skill類型(Skill Models)

官方文檔將skill分爲了幾個類別,如定製(custom)、智能家居、資訊等。
定製類型的skill須要開發者本身處理skill中涉及的幾乎全部步驟:服務器

  • intents: skill能夠處理的請求,即提供的功能,例如點餐,叫出租車,查天氣,等等。
  • interaction model: 定義出用戶如何說才能調用intents,至關於圖形化中點哪一個按鈕才能觸發預設的功能。例如:「叫輛車」映射到「叫出租」的功能。
  • invocation name: 定義一個Alexa識別你這個skill的名字,相似於Android App的名字,如「抖音」。由於VPA須要知根據用戶說的語音來判斷到底用戶想啓用哪一個skill,安卓中用戶能夠明確的用手點擊屏幕的App圖標,可是如何判斷用戶要確切的啓用哪一個skill對語音交互來講實現就很困難。Nan Zhang等發表在S&P 2019的工做就針對這點提出了voice squatting攻擊,基本想法是利用口音方言、禮貌用語(「請」,「please」)的差異,讓用戶調用本身的惡意skill。此外還有個印度哥Deepak Kumar發現方言誤發音甚至是可預測的。
  • 開發者可選引入一些除了聲音之外的交互內容,好比有的高端VPA已經支持觸摸屏了。

而其餘類型的skill亞馬遜給提供了預約義的模板,開發者不須要處理全部的步驟。好比智能家居類型(Smart Home pre-built model),就是預約義來控制門鎖、燈等設備的,選擇了這個模板就喪失了靈活的定製性,可是能夠更方便快速的開發。使用這類的skill,由Smart Home Skill API 定義了:ide

  • device directives: skill能夠處理的請求,好比開關、鎖門、改變燈的亮度等等功能。其實就像intents。
  • 用戶調用指令要說的話:其實就是interaction model。

開發者須要本身定義本身的skill如何響應某一個指令(directive),例如,須要寫代碼完成收到「turn on the light」指令時的功能,代碼須要使用亞馬遜的另外一個服務AWS Lambda來完成。注意,使用Smart Home Skill API 就只能響應這些API裏預設的特殊指令(device directives)。(這裏有個疑問,alexa是如何斷定調用哪一個skill來管理本身家燈的?)ui

用戶是如何與skill交互的

用戶作出請求——Skill收集補充信息——用戶提供須要的信息——skill完成請求功能
Custom skill的例子: User: Alexa, get high tide for Seattle from Tide Pooler.
其中Tide Pooler是skill的invocation name ,調用custom skill的用戶必須明確說明這個skill的調用名稱。「get high tide for Seattle 」就是須要映射到intent的語音了。google

智能家居的例子: User: Alexa, turn on the living room lights.
「turn on the...」會被Alexa識別成預設的interaction model,判斷用戶是要開燈。
「living room lights」是用戶以前設置的具體設備的名稱,而不是skill的名字,Alexa會將device directive發送給能夠控制living room lights這個設備的智能家居skill,這個skill再經過與設備的雲平臺來交互,打開這個具體的設備,並返回結果給Alexa。orm

轉載請註明出處 http://www.javashuo.com/article/p-fpaavxdo-p.htmlhtm

相關文章
相關標籤/搜索