Alexa Python 開發:構建和部署 Alexa 技能
目錄
Alexa Python 開發入門
了解 Alexa 技能
設置您的環境
了解 Alexa 技能模型
查看示例意圖
創建新意圖
構建技能后端
創建 JokeIntent 處理程序
Adding Jokes
結論
就在幾年前,智能家居揚聲器還是一個新穎的想法。今天,它們已成為許多人家庭和辦公室的核心部分,而且它們的采用率預計只會增長。這些設備中最受歡迎的是由亞馬遜 Alexa 控制的設備。在本教程中,您將通過部署您自己的 Alexa 技能成為Alexa Python 開發人員,該應用程序用戶將使用語音命令與 Amazon Alexa 設備進行交互。
在本教程中,您將學習:
Alexa 技能的主要組成部分是什么
如何設置 Alexa 技能并創建意圖
什么是ask_sdk_coreAlexa Python 包
如何使用ask_sdk_coreAlexa Python 技能創建業務邏輯
如何使用在線開發人員控制臺構建、部署和測試您的 Alexa Python 技能
Alexa Python 開發入門
要學習本教程,您需要創建一個免費的 Alexa開發者帳戶。在該頁面上,您將執行以下步驟:
單擊開始按鈕。
單擊后續頁面上的注冊按鈕。
單擊創建您的亞馬遜帳戶。
使用所需的詳細信息填寫表格。
單擊提交以完成注冊過程。
您還需要熟悉Python 中的列表和字典等概念,以及 JavaScript 對象表示法 (JSON)。如果您不熟悉 JSON,請查看在 Python 中使用 JSON 數據。
了解 Alexa 技能
Alexa Python 開發人員必須熟悉許多不同的 Alexa 技能組件,但最重要的兩個組件是界面和服務:
技能界面處理用戶的語音輸入并將其映射到意圖。
技能服務包含確定給定用戶輸入的響應并將其作為 JSON 對象返回的所有業務邏輯。
技能界面將是您的 Alexa 技能的前端。您將在此處定義將執行特定功能的意圖和調用短語。本質上,這是負責與用戶交互的技能的一部分。
技能服務將成為您的 Alexa 技能的后端。當用戶觸發特定意圖時,它將將該信息作為請求發送到技能服務。這將包含要與有價值的信息一起返回給前端的業務邏輯,這些信息最終將被轉發回用戶。
設置您的環境
是時候開始構建您的第一個 Alexa Python 技能了!登錄到 Alexa開發人員控制臺,然后單擊“創建技能”按鈕開始。在下一頁上,輸入技能名稱,即Joke Bot:
這將是您技能的調用短語。這是用戶開始使用您的 Alexa 技能時會說的短語。如果您愿意,您可以稍后將其更改為其他內容。另請注意,Alexa 技能可以用多種語言進行交互,您可以從“默認語言”下拉菜單中看到。現在,只需將其設置為English (US)。
接下來,您需要選擇一個模型以添加到您的技能中。這些模型就像 Amazon 團隊預先設計的模板,可幫助您基于一些常見用例開始 Alexa Python 開發。對于本教程,您應該選擇自定義模型。
最后,您需要選擇一種方法來托管 Alexa 技能的后端。此服務將包含您的應用程序的業務邏輯。
注意:如果您選擇Provision your own選項,則您必須為您的 Alexa Python 項目托管您自己的后端。這可以是在您選擇的平臺上構建和托管的API。另一種選擇是創建一個單獨的 AWS Lambda 函數并將其鏈接到您的 Alexa 技能。您可以在他們的定價頁面上了解有關 AWS Lambda 定價的更多信息。
現在,選擇Alexa-Hosted (Python)作為 Alexa 技能的后端。這將自動為您提供 AWS 免費套餐內的托管后端,因此您無需預先支付任何費用或立即設置復雜的后端。
最后,單擊“創建技能”按鈕繼續。您可能會被要求在此處填寫 CAPTCHA,因此也請務必填寫。大約一分鐘后,您應該被重定向到開發者控制臺的Build部分。
了解 Alexa 技能模型
登錄 Alexa 開發人員控制臺并選擇或創建技能后,您將看到“構建”部分。此部分為您提供了許多選項和控件來設置技能的交互模型。此交互模型的組件允許您定義用戶將如何與您的技能交互。這些屬性可以通過左側面板訪問,它看起來像這樣:
作為 Alexa Python 開發人員,您需要了解 Alexa 技能交互模型的一些組件。首先是調用。這是用戶開始與您的 Alexa 技能交互時會說的話。例如,用戶會說“Joke Bot”來調用您將在本教程中構建的 Alexa 技能。您可以隨時從“調用”部分更改此設置。
另一個組件是intent,它代表您的應用程序的核心功能。您的應用程序將具有一組意圖,這些意圖將代表您的技能可以執行的操作類型。要為給定意圖提供上下文信息,您將使用一個槽,它是話語短語中的一個變量。
考慮以下示例。調用天氣意圖的示例語句可能是,“告訴我有關天氣的信息。”?為了使技能更有用,您可以將意圖設置為“告訴我芝加哥的天氣”,其中“芝加哥”一詞將作為槽變量傳遞,從而改善用戶體驗。
最后,還有槽類型,它們定義了如何處理和識別槽中的數據。例如,AMAZON.DATE槽類型可以輕松地將指示日期的單詞(例如“今天、明天”等)轉換為標準日期格式(例如“2019-07-05”)。您可以查看官方插槽類型參考頁面以了解更多信息。
注意:要了解有關 Alexa 技能交互模型的更多信息,請查看官方文檔。
此時,Intents面板應該是打開的。如果不是,那么您可以通過從左側邊欄中選擇Intents來打開它。您會注意到默認情況下已經設置了五個意圖:
的意圖面板包括HelloWorldIntent和五個內置意圖。內置意圖是為了提醒您考慮一些對于制作用戶友好機器人很重要的常見情況。以下是簡要概述:
AMAZON.CancelIntent允許用戶取消交易或任務。示例包括“沒關系”、“算了”、“退出”和“取消”,但還有其他一些示例。
AMAZON.HelpIntent提供有關如何使用技能的幫助。這可用于返回一個句子,作為用戶如何與您的技能交互的手冊。
AMAZON.StopIntent允許用戶退出技能。
AMAZON.NavigateHomeIntent將用戶導航到設備主屏幕(如果正在使用屏幕)并結束技能會話。
默認情況下,沒有分配用于觸發這些意圖的示例話語,因此您還必須添加這些。將其視為 Alexa Python 開發人員培訓的一部分。您可以在官方文檔 中了解有關這些內置意圖的更多信息。
查看示例意圖
在本教程的稍后部分,您將學習如何創建新意圖,但現在,最好查看一些現有意圖,這些意圖是您創建的每項新技能的一部分。首先,單擊HelloWorldIntent以查看其屬性:
您可以看到用戶可以用來調用此意圖的示例話語。調用此意圖時,此信息將發送到您的 Alexa 技能的后端服務,然后該服務將執行所需的業務邏輯并返回響應。
在此之下,您可以選擇設置對話委托策略,它允許您將您定義的特定對話委托給特定意圖。雖然您不會在本教程中介紹這一點,但您可以在官方文檔 中閱讀更多相關信息。
接下來,您可以選擇為您的意圖應該收集的某些特定數據定義槽。例如,如果您要創建一個 Intent 來告知給定日期的天氣,那么您將在此處有一個Date槽,用于收集日期信息并將其發送到您的后端服務。
注意:此外,當您在單個意圖中從用戶那里收集多個不同的數據點并且您希望在將其發送以進行進一步處理之前提示用戶時,意圖確認選項可能很有用。
每當您對意圖進行更改時,您都需要單擊“保存模型”按鈕來保存它。然后,您可以單擊“構建模型”按鈕繼續測試您的 Alexa Python 技能。
知道技能的交互模型可以完全以JSON格式表示是有幫助的。要查看 Alexa 技能的當前結構,請單擊控制臺左側面板中的JSON 編輯器選項:
如果您直接使用 JSON 編輯器進行更改,那么這些更改也會反映在開發人員控制臺 UI 中。要測試此行為,請添加新意圖并單擊Save Model。
對技能的交互模型進行所有必要的更改后,您可以打開開發人員控制臺的測試部分來測試您的技能。測試是成為 Alexa Python 開發人員的重要組成部分,因此請務必不要跳過此步驟!單擊開發人員控制臺頂部導航欄中的“測試”按鈕。默認情況下,測試將被禁用。從下拉菜單中,選擇Development開始測試:
在這里,您有多種方法可以測試您的 Alexa Python 技能。讓我們做一個快速測試,以便您了解您的 Alexa 技能將如何響應話語。
從左側面板中選擇Alexa Simulator選項,然后輸入短語“嘿 Alexa,打開 Joke Bot”。您可以通過在輸入框中鍵入它或使用麥克風選項來執行此操作。幾秒鐘后,一個響應將返回給您:
除了語音響應之外,您還可以看到發送到 Alexa 技能后端服務的JSON 輸入,以及接收回控制臺的JSON 輸出:
這是到目前為止發生的事情:
JSON 輸入對象是根據用戶通過語音或文本輸入的輸入數據構建的。
Alexa 模擬器將輸入與其他相關元數據打包在一起,并將其發送到后端服務。您可以在JSON 輸入框中看到這一點。
后端服務接收輸入的 JSON 對象并對其進行解析以檢查請求的類型。然后,它將 JSON 傳遞給相關的意圖處理函數。
意圖處理程序函數處理輸入并收集所需的響應,該響應作為 JSON 響應發送回 Alexa 模擬器。您可以在JSON 輸出框中看到這一點。
Alexa 模擬器解析了這個 JSON 并將語音響應讀回給您。
注意:您可以在官方文檔 中閱讀有關 Alexa 技能的 JSON 請求-響應機制。
現在您已經了解了 Alexa 技能的不同組成部分以及信息如何從一個部分流向另一個部分,是時候開始構建您的笑話機器人了!在下一部分中,您將通過創建新意圖來測試您的 Alexa Python 開發人員技能。
創建新意圖
讓我們從創建JokeIntent開始,它將從列表中向用戶返回一個隨機笑話。打開Alexa 開發人員控制臺的Build部分。然后,單擊左側面板中Intents選項旁邊的Add按鈕:
隨著創建自定義意圖選項中選擇,將名稱設置為JokeIntent,然后點擊創建自定義的意圖按鈕:
接下來,您需要添加用戶將說出的示例話語以調用此意圖。這些可以是“給我講個笑話”或“我想聽個笑話”之類的短語。輸入短語并單擊加號 (?+) 將其添加為示例話語。這應該是這樣的:
您可以添加更多示例話語,但就目前而言,這些都可以。最后,單擊窗口左上角的保存模型按鈕以保存這些更改。
請記住,您需要先構建模型,然后才能對其進行測試。單擊構建模型按鈕以重新構建 Alexa Python 技能的交互模型。您會在瀏覽器窗口的右下角看到進度通知。構建過程成功后,您應該會看到另一個彈出通知,指示構建過程的狀態。
您可以檢查是否成功觸發了JokeIntent。單擊開發者控制臺右上角的Evaluate Model按鈕。旁邊會彈出一個小窗口,讓您可以檢查給定的輸入話語將觸發什么意圖。輸入任何示例話語以確保成功調用JokeIntent。
要擺脫評估彈出窗口,請再次單擊評估模型按鈕。
注意:這里要記住的一個關鍵點是,該模型在作為示例話語短語一部分的關鍵字方面非常靈活。例如,使用短語“這是某種玩笑嗎?”?即使是這句話也會觸發JokeIntent。作為 Alexa Python 開發人員,選擇在您的技能中執行其他意圖的可能性較低的話語非常重要。
現在您已經成功創建了一個意圖,是時候編寫 Python 代碼來處理這個意圖并返回一個笑話作為響應。
構建技能后端
現在您已經創建了一個可由用戶觸發的意圖,您需要在技 能后端添加功能來處理此意圖并返回有用的信息。打開Alexa 開發人員控制臺的代碼部分以開始使用。
注意:由于您在設置過程中選擇了 Alexa-Hosted Python 選項,您將獲得一個完整的在線代碼編輯器,您可以在其中編寫、測試、構建和部署 Alexa 技能的后端,所有這些都在開發人員控制臺中完成。
當您打開開發者控制臺的代碼部分時,您可以看到一個在線代碼編輯器,其中包含一些已經設置好的文件供您開始使用。特別是,您將在lambda子目錄中看到以下三個文件:
lambda_function.py:這是后端服務的主要入口點。來自 Alexa 意圖的所有請求數據都在此處接收,并且應該僅從此文件返回。
requirements.txt:此文件包含此項目中正在使用的 Python 包的列表。如果您選擇設置自己的后端服務而不是使用亞馬遜提供的服務,這將特別有用。要了解有關需求文件的更多信息,請查看使用需求文件。
utils.py:此文件包含 lambda 函數與Amazon S3服務交互所需的一些實用程序函數。它包含一些關于如何從 Amazon S3 存儲桶中獲取數據的示例代碼,稍后您可能會發現這些代碼很有用。目前,該文件未在lambda_function.py.
現在,您只會在 中進行更改lambda_function.py,因此讓我們仔細看看文件的結構:
7import logging 8import ask_sdk_core.utils as ask_utils 9 10from ask_sdk_core.skill_builder import SkillBuilder 11from ask_sdk_core.dispatch_components import AbstractRequestHandler 12from ask_sdk_core.dispatch_components import AbstractExceptionHandler 13from ask_sdk_core.handler_input import HandlerInput 14 15from ask_sdk_model import Response 16 17logger = logging.getLogger(__name__) 18logger.setLevel(logging.INFO) 19 20 21class LaunchRequestHandler(AbstractRequestHandler): 22 """Handler for Skill Launch.""" 23 def can_handle(self, handler_input): 24 # type: (HandlerInput) -> bool 25 26 return ask_utils.is_request_type("LaunchRequest")(handler_input) 27 28 def handle(self, handler_input): 29 # type: (HandlerInput) -> Response 30 speak_output = "Welcome, you can say Hello or Help. " \ 31 "Which would you like to try?" 32 33 return ( 34 handler_input.response_builder 35 .speak(speak_output) 36 .ask(speak_output) 37 .response 38 ) 39...
首先,您導入ask_sdk_coreAlexa Python 包中提供的必要實用程序。然后,您需要執行三個主要任務lambda_function.py來處理來自 Alexa 技能前端的意圖的請求:
創建一個意圖處理程序類,該類繼承自AbstractRequestHandler該類,具有函數can_handle()和handle().?已經有一對情侶在定義的處理程序類lambda_function.py,如LaunchRequestHandler,HelpIntentHandler等。這些處理 Alexa 技能的基本意圖。這里需要注意的重要一點是,您需要為您定義的每個意圖創建一個新的意圖處理程序類。
創建一個SkillBuilder對象,作為您的 Alexa Python 技能的入口點。這會將所有傳入的請求和響應負載路由到您定義的意圖處理程序。
將意圖處理程序類作為參數傳遞.add_request_handler()給 ,以便在收到新請求時按順序調用它們。這SkillBuilder是一個單例,因此只需要它的一個實例來處理所有傳入請求的路由。
這是你經歷的好時機lambda_function.py。您會注意到,重復使用相同的模式來處理可以由您的 Alexa Python 技能觸發的不同意圖。
既然您已經對在后端處理 Intent 所需執行的所有不同事情有了一個廣泛的了解,現在是時候編寫將處理您在上一節中構建的JokeIntent的代碼了。
創建 JokeIntent 處理程序
由于ask_sdk_coreAlexa Python 包中的重要實用程序已經導入,因此您無需再次導入它們。如果你想更深入地了解這些,那么你可以查看官方文檔。
接下來,您將創建一個新的意圖處理程序來處理從JokeIntent收到的請求。在下面的代碼片段中,意圖處理程序將簡單地返回一個示例短語。這表明從后端收到了對JokeIntent的響應。將以下代碼添加到lambda_function.py的類定義上方LaunchRequestHandler():
20class JokeIntentHandler(AbstractRequestHandler): 21 def can_handle(self, handler_input): 22 return ask_utils.is_intent_name("JokeIntent")(handler_input) 23 24 def handle(self, handler_input): 25 speak_output = "Here's a sample joke for you." 26 27 return ( 28 handler_input.response_builder 29 .speak(speak_output) 30 .ask(speak_output) 31 .response 32 )
讓我們來看看每個部分的作用。在第 20 行中,您為JokeIntent創建了一個新的意圖處理程序類,它是該類的子AbstractRequestHandler類。當您在前端創建意圖時,您需要在后端創建一個可以處理來自 Alexa 的請求的意圖處理程序類。您為此編寫的代碼需要做兩件事:
JokeIntentHandler.can_handle()?識別 Alexa 發送的每個傳入請求。
JokeIntentHandler.handle()?返回適當的響應。
在第 21 行中,您定義了.can_handle().?它handler_input作為一個參數傳入,它是一個dict()包含所有輸入請求信息的類型的對象。然后,它使用ask_utils.is_intent_name()或ask_utils.is_request_type()來檢查它收到的 JSON 輸入是否可以由這個意圖處理程序函數處理。
您使用.is_intent_name()并傳入意圖的名稱。這將返回一個predicate,它是一個函數對象,True如果給定handler_input來自指示的意圖則返回。如果這是真的,則SkillBuilder對象將調用JokeIntentHandler.handle()。
注意:如果JokeIntent是從 Alexa 技能前端觸發的,那么它會發送一個 JSON 對象,該對象type的正文中包含一個鍵request,表明JokeIntent已接收到名為輸入的 Intent?。
此語句隨后調用.handle()您在第 24 行中定義的。此方法接收輸入請求以及可能需要的任何其他重要信息。它包含成功處理特定意圖所需的業務邏輯。在JokeIntent的情況下,需要此方法將包含笑話的響應發送回 Alexa 前端。
該speak_ouput變量包含將由 Alexa 技能前端講回給用戶的句子。speak(speak_output)指示 Alexa 前端將作為語音向用戶播放的內容。ask("Question to ask...")可用于提出后續問題。在此方法中,類的對象response_builder將響應返回給 Alexa 技能。
注意:Sorry, I had trouble doing what you asked. Please try again.如果.handle()不存在,將發回默認響應消息 (?)?。
請注意,現在的值speak_output設置為固定響應。稍后您將更改此設置以從笑話列表中隨機返回一個笑話。
這是您的代碼在編輯器中的樣子:
創建意圖處理程序類后,您需要將其作為參數傳遞給SkillBuilder.add_request_handler.?滾動到底部lambda_function.py并添加以下行:
sb.add_request_handler(JokeIntentHandler())
這里需要注意的重要一點是,這一行的放置很重要,因為代碼是從上到下處理的。因此,請確保對自定義意圖處理程序的調用高于對InstantReflectHandler()類的調用。這是它的外觀:
171sb = SkillBuilder() 172 173sb.add_request_handler(LaunchRequestHandler()) 174sb.add_request_handler(JokeIntentHandler()) 175sb.add_request_handler(HelloWorldIntentHandler()) 176sb.add_request_handler(HelpIntentHandler()) 177sb.add_request_handler(CancelOrStopIntentHandler()) 178sb.add_request_handler(SessionEndedRequestHandler()) 179 180# Make sure IntentReflectorHandler is last so it 181# Doesn't override your custom intent handlers 182sb.add_request_handler(IntentReflectorHandler()) 183 184sb.add_exception_handler(CatchAllExceptionHandler()) 185 186...
好了,是時候測試你的代碼了!單擊“部署”按鈕以保存更改并部署后端服務。您將通過 Alexa 技能前端檢查它是否會按預期工作。
部署過程成功后,返回開發人員控制臺的測試部分并調用JokeIntent。請記住,輸入話語短語以調用您的 Alexa Python 技能,然后輸入短語以執行意圖:
如果您收到與上圖中類似的響應,則表示您已成功為技能后端服務中的JokeIntent創建了一個意圖處理程序。恭喜!現在,剩下要做的就是將列表中的隨機笑話返回到技能前端。
Adding Jokes
打開開發者控制臺的代碼部分。然后,添加jokes變量lambda_function.py:
15from ask_sdk_model import Response 16 17logger = logging.getLogger(__name__) 18logger.setLevel(logging.INFO) 19 20jokes = [ 21 "Did you hear about the semi-colon that broke the law? He was given two consecutive sentences.", 22 "I ate a clock yesterday, it was very time-consuming.", 23 "I've just written a song about tortillas; actually, it's more of a rap.", 24 "I woke up this morning and forgot which side the sun rises from, then it dawned on me.", 25 "I recently decided to sell my vacuum cleaner as all it was doing was gathering dust.", 26 "If you shouldn't eat at night, why do they put a light in the fridge?", 27 ] 28 29class JokeIntentHandler(AbstractRequestHandler): 30...
這jokes是一個list包含一些單行笑話的類型變量。確保在函數或類定義之外添加它,以便它具有全局作用域。
注意:由于這個列表只會被JokeIntentHandler()類引用,所以你是否在函數體中聲明它并不重要。然而,這樣做確實有助于函數體擺脫混亂。
接下來,您將添加.handle()需要從笑話列表中隨機選擇一個笑話并將其返回給用戶的功能。JokeIntentHandler.handle()使用以下代碼修改的主體:
29class JokeIntentHandler(AbstractRequestHandler): 30 def can_handle(self, handler_input): 31 return ask_utils.is_intent_name("JokeIntent")(handler_input) 32 33 def handle(self, handler_input): 34 speak_output = random.choice(jokes) 35 36 return ( 37 handler_input.response_builder 38 .speak(speak_output) 39 .ask(speak_output) 40 .response 41 )
在 的正文中.handle(),您jokes使用從列表中隨機選擇一個笑話random.choice()并將其返回作為對 Alexa 技能前端的響應。
最后,random通過在 頂部添加 import 語句來導入包lambda_function.py:
15from ask_sdk_model import Response 16 17import random 18 19logger = logging.getLogger(__name__) 20logger.setLevel(logging.INFO) 21 22...
這是編輯應該如何看待這一點:
在測試之前還有一個最后的改變。您需要允許 Alexa確認該技能已被觸發。為此,請在內部LaunchRequestHandler.handle()查找speak_output變量并將其值設置為下面突出顯示的行中的文本:
45class LaunchRequestHandler(AbstractRequestHandler): 46 """Handler for Skill Launch.""" 47 def can_handle(self, handler_input): 48 # type: (HandlerInput) -> bool 49 50 return ask_utils.is_request_type("LaunchRequest")(handler_input) 51 52 def handle(self, handler_input): 53 # type: (HandlerInput) -> Response 54 speak_output = "Hey there! I am a Joke Bot. You can ask me to tell you a random Joke that might just make your day better!" 55 56 return ( 57 handler_input.response_builder 58 .speak(speak_output) 59 .ask(speak_output) 60 .response 61 ) 62...
您的笑話機器人已準備好進行最終測試!單擊Deploy按鈕保存更改并返回到開發者控制臺的Test部分。這一次,您應該會在第一次調用您的技能時看到一條新的問候消息。然后,當你讓機器人給你講一個笑話時,它每次都應該給你一個不同的笑話:
而已!您已經成功地創建了作為 Alexa Python 開發人員的第一個技能!
結論
恭喜您邁出 Alexa Python 開發的第一步!您現在已經成功構建了您自己的 Alexa Python 技能。您現在知道如何創建新技能、創建意圖、編寫 Python 代碼來處理這些意圖并將有價值的信息返回給用戶。
通過嘗試以下一些方法來提升您的技能:
增加后臺的笑話列表。
創建一個名為Trivia的新意圖,它將以一個有趣的瑣事事實作為回應。
將您的技能發布到亞馬遜市場。
可能性是無限的,所以繼續深入吧!要了解有關 Alexa Python 開發的更多信息,請查看官方文檔。您還可以查看如何使用 Tweepy 在 Python 中制作 Twitter 機器人和如何在 Python中制作 Discord 機器人,以了解有關如何使用 Python 為不同平臺制作機器人的更多信息。
JSON Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。