返回文章列表

Alexa技能開發與實踐案例

本文深入探討 Alexa 技能開發流程,包含互動模型設計、程式碼範例、測試與佈署,並解析技能請求與回應的 JSON 結構,以及 SSML 的應用,最終整合 Raspberry Pi 實作語音控制 IoT 應用。

Web 開發 物聯網

現今語音助理蓬勃發展,其中 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技能的基礎。

圖表翻譯:

此流程圖描述了建立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 回應包含了語音回應的文字和型別等資訊。

圖表翻譯:

這個圖表顯示了使用者、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 標記語言來定義語音輸出的結構和內容。

圖表翻譯:

在這個圖表中,我們可以看到技能回應的流程:技能回應(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 格式,並列印預出來。

圖表翻譯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Alexa技能開發與實踐案例

package "機器學習流程" {
    package "資料處理" {
        component [資料收集] as collect
        component [資料清洗] as clean
        component [特徵工程] as feature
    }

    package "模型訓練" {
        component [模型選擇] as select
        component [超參數調優] as tune
        component [交叉驗證] as cv
    }

    package "評估部署" {
        component [模型評估] as eval
        component [模型部署] as deploy
        component [監控維護] as monitor
    }
}

collect --> clean : 原始資料
clean --> feature : 乾淨資料
feature --> select : 特徵向量
select --> tune : 基礎模型
tune --> cv : 最佳參數
cv --> eval : 訓練模型
eval --> deploy : 驗證模型
deploy --> monitor : 生產模型

note right of feature
  特徵工程包含:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

在這個圖表中,我們可以看到技能回應(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應用技巧,以打造更豐富、更具互動性的語音應用程式。玄貓認為,掌握這些核心概念和技術細節,將有助於開發者在語音互動的浪潮中搶佔先機。