現今語音助理蓬勃發展,其中 Amazon Alexa 更是廣泛應用於智慧家庭和物聯網裝置。本文將引領讀者從零開始,逐步建構一個 Alexa 技能,並結合 Python 程式碼與 Raspberry Pi,實作語音控制 IoT 應用。我們將深入探討 Alexa 技能的架構,包含互動模型設計、程式碼邏輯、測試與佈署,以及如何利用 SSML 增強語音互動體驗。同時,本文也將解析技能請求和回應的 JSON 結構,讓讀者深入理解 Alexa 技能的運作機制,並進一步整合 Raspberry Pi,打造個人化的語音控制 IoT 應用。
3.2.2 選擇方法
您可以選擇「Alexa主機」- Node.js或Python,或「自行組態」。在本文中,我們主要使用Python,但也會提供一些Node.js示例或連結。請選擇Node.js或Python。
在右上角,您可以選擇最靠近您的主機區域。點選「建立技能」按鈕。下一個螢幕會提供一些範本。您可以選擇「從頭開始」和「繼續使用範本」。
內容解密:
以上步驟描述了建立Alexa技能的過程,包括選擇互動模型、選擇方法和建立技能。這些步驟是建立一個功能性的Alexa技能的基礎。
flowchart TD
A[建立技能] --> B[選擇互動模型]
B --> C[選擇方法]
C --> D[建立技能]
圖表翻譯:
此流程圖描述了建立Alexa技能的步驟,包括建立技能、選擇互動模型和選擇方法。每個步驟都對應於建立一個功能性的Alexa技能的特定過程。
建立Alexa技能:邁向語音控制IoT應用程式
3.2.3 呼叫名稱
要開始建立Alexa技能,首先需要設定呼叫名稱。這個名稱是使用者在啟動技能時所說的詞彙,例如「Alexa,開啟我的第一個演示技能」。點選右側欄的「1. 呼叫名稱」或展開左側欄並選擇「技能呼叫名稱」。
有時,呼叫名稱會顯示為「更改我」。如果需要,請將其更改為您的技能名稱(可以是任何名稱,但最好是有意義的)。我使用了「我的第一個演示技能」作為呼叫名稱。使用者將說「Alexa,開啟我的第一個演示技能」來啟動技能。請注意,呼叫名稱只能使用小寫字母。
3.2.4 意圖
點選「互動模型」然後選擇「意圖」以檢視當前的意圖。這些意圖包括取消、幫助、停止、導航回首頁(分別對應使用者說「取消」、「幫助」、「停止」和「回首頁」)等。還有一個名為「HelloWorld」的意圖,它會在使用者說「Hello」時被觸發。另外,有一個名為「Fallback」的意圖,它會在使用者的話語不匹配任何技能意圖時被觸發,允許您提供更多關於技能的細節和如何與之互動的資訊。
3.2.5 程式碼
在測試技能之前,我們需要佈署程式碼。讓我們先看看程式碼。點選「程式碼」標籤。Python程式碼範例從匯入函式庫開始,例如匯入logging函式庫以輸出除錯資訊到Cloudwatch日誌。
import logging
然後是處理器,它們負責處理啟動請求和意圖,如「Hello」或「Help」。
class LaunchRequestHandler(AbstractRequestHandler):
# 處理啟動請求
pass
class HelpIntentHandler(AbstractRequestHandler):
# 處理幫助意圖
pass
剩下的意圖包括停止或取消意圖(當使用者說「停止」或「取消」時);Fallback意圖(當使用者的話語不匹配任何語音模型意圖時);會話結束意圖(當會話結束時),等等。這些意圖處理器使用sb.add_request_handler程式碼進行註冊,其中sb是SkillBuilder()程式碼。
sb = SkillBuilder()
sb.add_request_handler(LaunchRequestHandler())
sb.add_request_handler(HelpIntentHandler())
程式碼的入口點在最後:lambda_handler = sb.lambda_handler()。
測試您的技能
現在,我們可以測試技能了。點選「測試」標籤,這將開啟Alexa模擬器。您需要啟用技能測試,將其從「關閉」改為「開發中」。您可以傳送任何命令,就像您通常使用Alexa裝置一樣(試試:「Alexa,什麼是天氣?」)。
現在,啟動技能。輸入(或點選麥克風按鈕並說)「開啟<啟動名稱>」,例如「開啟我的第一個演示技能」。您不需要使用喚醒詞(即不需要說或輸入「Alexa,開啟我的第一個演示技能」)。
修改歡迎訊息
在測試之前,讓我們使歡迎訊息更加個人化。點選「程式碼」標籤。找到說「歡迎,您可以說Hello或Help。您想嘗試哪一個?」的行,並將其更改為例如「Hello John,請說Hello或Help。」。您可以使用自己的名字代替我的名字!如果您不熟悉Python,請確保您的程式碼縮排正確。
儲存程式碼,然後點選右上角的佈署按鈕。在修改程式碼並儲存後,您必須佈署程式碼才能測試它。
點選右上角的佈署按鈕,您將在幾秒鐘內收到佈署成功的訊息,例如「上次佈署:2022年4月13日,晚上8:26」。
執行測試
現在,您可以測試您的技能了。點選測試標籤,這將開啟Alexa模擬器。啟用技能測試,然後您就可以傳送任何命令,就像您通常使用Alexa裝置一樣。輸入或說出您的啟動名稱,以啟動您的技能,並開始互動!
建立 Alexa 技能
在上一章中,我們成功建立了第一個 Alexa 技能。現在,我們將深入探討技能的建立過程和相關的技術細節。
技能輸入/輸出
在 Alexa 模擬器的頂部,有幾個選項可以顯示技能的輸入/輸出、裝置顯示、裝置日誌和個人化。裝置顯示用於顯示裝置上的內容,如果裝置有螢幕,則可以顯示技能名稱和離開方式。裝置日誌提供了技能的詳細行動記錄,包括事件和指令。個人化允許 Alexa 裝置識別已識別的技能使用者,如果設定並同意。
技能請求
當使用者與 Alexa 互動時,Alexa 會向技能傳送 JSON 請求。這個請求包含了許多有用的資訊,例如使用者 ID、裝置能力(是否有螢幕)等。以下是 JSON 請求的例子:
{
"version": "1.0",
"session": {
"new": true,
"sessionId": "amzn1.echo-api.session.27d..e7cb",
"application": {
"applicationId": "amzn1.ask.skill.4649..981"
},
"attributes": {},
"user": {
"userId": "amzn1.ask.account.AFCVJZSYW...VY2BH6HI"
}
},
"context": {
"Viewports": [
{
"type": "APL",
"id": "main",
"shape": "RECTANGLE",
...
}
],
"System": {
...
}
}
}
這個 JSON 請求包含了版本、會話、應用程式、使用者和裝置等資訊。其中,context 部分包含了裝置的詳細資訊,例如螢幕大小、形狀等。
技能回應
當技能接收到 JSON 請求後,會傳送 JSON 回應回給 Alexa。這個回應包含了技能的輸出,例如語音回應、顯示內容等。以下是 JSON 回應的例子:
{
"response": {
"outputSpeech": {
"text": "Welcome, you can say...",
"type": "PlainText"
},
...
}
}
這個 JSON 回應包含了語音回應的文字和型別等資訊。
圖表翻譯:
graph LR
A[使用者] -->|請求|> B[Alexa]
B -->|JSON 請求|> C[技能]
C -->|JSON 回應|> B
B -->|回應|> A
這個圖表顯示了使用者、Alexa 和技能之間的互動過程。使用者傳送請求給 Alexa,Alexa 將請求轉換為 JSON 請求並傳送給技能。技能接收到 JSON 請求後,傳送 JSON 回應回給 Alexa。Alexa 將回應轉換為語音或顯示內容並傳回給使用者。
內容解密:
以上的 JSON 請求和回應是 Alexa 技能的核心部分。透過分析這些 JSON 資料,可以瞭解 Alexa 技能的工作原理和如何建立自己的技能。在下一章中,我們將深入探討 Alexa 技能的開發過程和相關的技術細節。
Voice-controlled IoT 應用程式開發:Alexa 和 Raspberry Pi 的整合
3.4.2 技能回應
技能回應是由玄貓生成的回應,作為對開啟技能啟動請求的回應。以下是完整的回應列表:
{
"body": {
"version": "1.0",
"response": {
"outputSpeech": {
"type": "SSML",
"ssml": "<speak>Welcome, you can say Hello or Help.</speak>"
},
"reprompt": {
//...
}
}
}
}
在這個回應中,我們可以看到 outputSpeech 區塊,裡麵包含了 type 和 ssml 兩個屬性。type 屬性指定了語音輸出的格式,在這裡是 SSML(Speech Synthesis Markup Language),而 ssml 屬性則包含了實際的語音輸出內容。
內容解密:
outputSpeech區塊是技能回應中用於定義語音輸出的部分。type屬性指定了語音輸出的格式,可以是SSML或PlainText。ssml屬性包含了實際的語音輸出內容,使用 SSML 標記語言來定義語音輸出的結構和內容。
圖表翻譯:
graph LR
A[技能回應] --> B[outputSpeech]
B --> C[SSML]
C --> D[語音輸出內容]
在這個圖表中,我們可以看到技能回應的流程:技能回應(A)包含了 outputSpeech 區塊(B),而 outputSpeech 區塊則包含了 SSML 格式的語音輸出內容(C),最終產生語音輸出內容(D)。
技能請求和回應的整合
在開發 Voice-controlled IoT 應用程式時,瞭解技能請求和回應之間的整合是非常重要的。透過分析技能請求和回應的結構和內容,我們可以更好地理解如何設計和實作自己的技能,以提供更好的使用者經驗。
程式碼實作示例:
import json
# 定義技能回應
response = {
"body": {
"version": "1.0",
"response": {
"outputSpeech": {
"type": "SSML",
"ssml": "<speak>Welcome, you can say Hello or Help.</speak>"
}
}
}
}
# 將技能回應轉換為 JSON 格式
response_json = json.dumps(response)
print(response_json)
在這個程式碼實作示例中,我們定義了一個技能回應,包含了 outputSpeech 區塊和 SSML 格式的語音輸出內容。然後,我們使用 json.dumps() 函式將技能回應轉換為 JSON 格式,並列印預出來。
圖表翻譯:
graph LR
A[技能回應] --> B[JSON 轉換]
B --> C[JSON 格式]
C --> D[列印輸出]
在這個圖表中,我們可以看到技能回應(A)被轉換為 JSON 格式(B),然後被列印預出來(D)。
第三章:建立Alexa技能
在建立Alexa技能的過程中,瞭解語音合成標記語言(SSML)是非常重要的。SSML提供了對語音輸出的額外控制,允許開發者定製語音助手的回應。
從技術架構視角來看,本章節深入淺出地介紹了建立Alexa技能的流程,涵蓋了從選擇互動模型、設定呼叫名稱到編寫程式碼及測試的完整過程。透過流程圖和程式碼範例,清晰地展現了技能建立的步驟和核心概念,例如意圖(Intents)、請求處理器(Request Handlers)以及技能建構器(Skill Builder)的使用。同時,本章節也點出了技能請求與回應的JSON結構,揭示了Alexa技能與後端服務互動的核心機制,並以SSML為例,展現瞭如何精細控制語音輸出,提升使用者經驗。然而,本章節的程式碼範例相對簡略,缺乏與實際IoT裝置整合的具體說明,這對於構建完整的語音控制IoT應用程式來說是一個挑戰。展望未來,隨著Alexa技能開發工具的持續發展,預計將出現更便捷的IoT裝置整合方案,簡化開發流程。對於想要深入學習的開發者,建議進一步研究Alexa Skills Kit (ASK) 的官方檔案,並探索更多進階的SSML應用技巧,以打造更豐富、更具互動性的語音應用程式。玄貓認為,掌握這些核心概念和技術細節,將有助於開發者在語音互動的浪潮中搶佔先機。