博主也是一個剛接觸amazon alexa skill開發的小白,從零開始。下面我說下我在開發我的alexash時所遇到的坑。
1、創建AWS lambda函數時沒有 alexa skill kit這個觸發器
通常我們創建lambda函數服務都需要添加對應觸發器。如圖:
可是我開始弄這個是是沒有alexa skill kit 相關的觸發器的。
原因就是你必須把你的aws 地址改成 美國東部(弗吉尼亞北部)、美國西部(俄勒岡)、亞太區域(東京)、歐洲(愛爾蘭) 不然會出現Dseigner裏面找不到alexa skill kit的情況。推薦用第一個美國東部(弗吉尼亞北部)
2、創建的skill怎樣持續對話
第一次喚醒技能後,能與你持續對話,直到你說出stop等退出之類的話語。
這個問題真的困擾了我很久,我也在是經過1、2天的時間後才弄出來的,期間加上大佬的提醒,才弄清楚是怎麼回事。alexa他默認的設置就是當他回覆用戶完後,自動會關閉對話,想要在次對話必須重新喚醒。 這裏面就是一個關鍵的返回值的問題:ShouldEndsession的返回值,它的返回值默認是turn,也就是爲什麼對話一次後就會結束的原因,你需要把他設置成false。
我們看一下默認的ShouldEndsession返回值樣式類型
喚醒時返回值
用戶對話時返回值
由此可見,我們創建的技能的返回值沒有發現ShouldEndSession,我們就需要自己去設置。
如果你是自定義aws lambda編寫的skill服務,你需要在你的返回值裏面設置ShouldEndSession的值爲false
如果你是使用藍圖或者無服務儲存庫創建的函數,你只需要加上一個.withShouldEndSession(false)或者你在node_modules-->lib-->response-->ResponseFactory.js裏面的ResponseFactory函數裏面的return的speak的return this前面加上下面一段代碼
if (!isVideoAppLaunchDirectivePresent()) {
response.shouldEndSession = false;
}
或者在你的服務代碼時加上.withShouldEndSession(false) 如下
3、skill對話框模型
對話框模型這個裏是一個困擾了我很久的難題,主要是要實現uers與alexa在一個Intent裏面的多輪對話。(我本人的理解)
我們開始創建的自定義skill是這樣的:
我在開始弄對話框模型時 創建的skill都是這樣的。 而我們創建包含對話框模型的skill必須有下面這些東西:
dialog是對話框模型最重要的東西
你要創建對話框模型 必須開啓你的槽填充
也就是 slot folling這個東西。其他的按照要求填寫就行,當然你skill創建對話框模型,你對應的lambda也應該要創建對應的服務(參考的github上的代碼)
對話框模型的skill的每一個Intent都寫了兩個函數來服務他。這裏最重要的就是判斷 request.dialogState的狀態,也就是我上面框出來的內容。
也可以參考alexa官方文檔(我給幾個當時我看的,不完全是,你可以在裏面找到你要的):https://developer.amazon.com/docs/custom-skills/define-the-dialog-to-collect-and-confirm-required-information.html
https://developer.amazon.com/docs/custom-skills/dialog-interface-reference.html#confirmslot
https://developer.amazon.com/docs/custom-skills/include-a-card-in-your-skills-response.html
同時npm上的文檔可能也對你有幫助:https://www.npmjs.com/package/alexa-sdk#dialog-interface
4、skill再提醒與skill出錯結束對話
再提醒功能主要是用做用戶喚醒技能後,在接下來5秒內用戶未發出命令或者意圖,Echo會再次提醒用戶需要做什麼嗎。提醒內容由你自定義,用到的是一個amazon寫好的方法:. reprompt() 括號裏面定義Echo再次提醒用戶的話。
技能出錯結束對話使我們在前面就已經已經介紹過,使用:.withShouldEndSession() 方法,只是說對應括號裏面的值改爲ture 就行。 當然需要你定義什麼時候是出錯的情況,我這裏做的是讓服務端給我返回一個狀態碼,判斷狀態碼,從而確定技能是否出錯。
5、Echo未識別用戶意圖
我們構建好技能後,一定會測試技能的kekao可靠性。在測試過程中你一定會發現Echo未能識別你的意圖的情況。默認的Echo會返回一個技能有問題之內的話。我們有兩種可以處理未識別用戶意圖的方法,一種是獲取到用戶的話,上傳到你的cloud處理,再返回給你,第二種就是使用amazon的默認意圖: amazon.fallback。 你只需要在你的skill裏面添加它就可以在lambda中使用。
在你啓用這個內置意圖後,在Echo未識別用戶意圖時,Echo返回你自定義的話。
6、發佈技能
子我們配置完技能,在發佈時,需要注意兩個地方。第一:你必須添加你的隱私政策url,不然在後面步驟會出錯。第二:如果你的技能需要授權token,授權網站你必須使用https協議,不然會出現以下錯誤。
隱私政策網站你可以自己寫一個靜態的,可以參考:https://meater.com/privacy-policy/。
授權token必須使用https協議 不然會報如上錯誤。 可以使用:https://myssl.com/ssl.html 查看網站協議。
創建skill 與aws 服務可以查看我另外兩篇博客
lambda中創建你skill裏Intent服務函數時千萬看清楚,不然會出現一些莫名其妙的錯誤。
注:前面說的httos協議你可以選擇騰訊雲的或者阿里的 只需要購買一個域名就行,他有免費一年的SSL,還有你必須有自己的服務器。購買一個域名很便宜 也就40來塊
alexa 項目告一段落了。接下來會搞國內的智能音響。天貓精靈和小愛同學,在開發過程中遇到的心得或者坑,我依舊會寫在博客中。
不好意思啊 不能在繼續開發智能音箱了,如果後續有機會,會繼續更新博客。