語音助手(Virtual Personal Assistants, VPA)是物聯網智能家居中很火的一個領域,用戶可以通過語言作為入口來控制家里各種各樣的設備,而亞馬遜的Alexa(echo,echo dot)是做的最早也是最優秀的一款產品,衍生出了很大的開發生態圈。本文基於亞馬遜的官方文檔試圖記錄作者對其Skill工作原理的理解。
這不是一個手把手Skill開發入門教程,僅僅講解了概念與個人的一些理解
宏觀概念
Alexa提供一系列內置的功能,比如回答問題,語音游戲,控制智能家居設備,這些功能都是由skill實現的。亞馬遜為Alexa skill提供了一個開放的開發環境,類似於google的Android,任何開發者都可以自由的開發skill並上傳到市場中供Alexa的用戶使用。Skill調用的基本過程:識別用戶調用請求——根據輸入語音判斷用戶意圖——執行功能。
更具體來講,一個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來向第三方雲發送請求,實現根據語音控制他的智能家居設備。
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 定義了:
- device directives: skill可以處理的請求,比如開關、鎖門、改變燈的亮度等等功能。其實就像intents。
- 用戶調用指令要說的話:其實就是interaction model。
開發者需要自己定義自己的skill如何響應某一個指令(directive),例如,需要寫代碼完成收到“turn on the light”指令時的功能,代碼需要使用亞馬遜的另一個服務AWS Lambda來完成。注意,使用Smart Home Skill API 就只能響應這些API里預設的特殊指令(device directives)。(這里有個疑問,alexa是如何判定調用哪個skill來管理自己家燈的?)
用戶是如何與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的語音了。
智能家居的例子: 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。