現今語音助理蓬勃發展,其中 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程式碼進行註冊,其中sbSkillBuilder()程式碼。

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 區塊,裡麵包含了 typessml 兩個屬性。type 屬性指定了語音輸出的格式,在這裡是 SSML(Speech Synthesis Markup Language),而 ssml 屬性則包含了實際的語音輸出內容。

內容解密:

  • outputSpeech 區塊是技能回應中用於定義語音輸出的部分。
  • type 屬性指定了語音輸出的格式,可以是 SSMLPlainText
  • 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應用技巧,以打造更豐富、更具互動性的語音應用程式。玄貓認為,掌握這些核心概念和技術細節,將有助於開發者在語音互動的浪潮中搶佔先機。