在現今語音助理蓬勃發展的時代,開發兼具語音互動與視覺呈現的 Alexa 技能已成為趨勢。本文將引導開發者如何在 VS Code 環境中,結合 Alexa Skills Toolkit 和 Alexa Presentation Language (APL) 打造更具吸引力的 Alexa 技能。首先,我們會介紹如何在 VS Code 中設定 launch.json 檔案,以便進行技能的本地端除錯,並搭配 VS Code Alexa 模擬器進行測試。接著,將深入探討 APLA(Alexa Presentation Language for Audio)和 APL 的核心概念,包含各種元件的應用、資料源的整合以及如何在 Python 程式碼中實作。最後,我們將以一個簡短的技能開發範例,示範如何運用 APLA 和資料源,並提供程式碼片段和流程圖解說,幫助開發者快速上手。

7.4.1 建立 launch.json 檔案

  1. 開啟「執行」功能表,然後選擇「執行」圖示或使用鍵盤快捷鍵 Ctrl+Shift+D。
  2. 點選「建立 launch.json 檔案」,然後選擇「新增組態…」。
  3. 選擇您的 debugger:ASK:Alexa Skills Debugger(Python)或 ASK:Alexa Skills Debugger(Node.js)。

這將新增組態程式碼到 launch.json 檔案中:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Debug Alexa Skill (Python)",
      "type": "python",
      "request": "launch",
      "program": "${command:ask.debugAdapterPath}",
      "python": "${command:python.interpreterPath}",
      "args": [
        "--accessToken",
        "${command:ask.accessToken}",
        "--skillId",
        "${command:ask.skillIdFromWorkspace}",
        "--skillHandler",
        "lambda_handler",
        "--skillFilePath",
        "${workspaceFolder}/lambda/lambda_function.py",
        "--region",
        "NA"
      ],
      "console": "internalConsole",
      "cwd": "${workspaceFolder}/lambda"
    },
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal",
      "justMyCode": true
    }
  ]
}

請檢查您的區域是否正確,然後儲存變更到 launch.json 檔案中。

現在您可以在 VS Code 環境中除錯和編輯您的程式碼。

圖表翻譯:

  graph LR
    A[設定 Alexa Debugger 組態] --> B[建立 launch.json 檔案]
    B --> C[測試您的 Alexa 技能在 VS Code 中]
    C --> D[啟動除錯]
    D --> E[建立 WebSocket 連線]
    E --> F[使用 VS Code Alexa 模擬器]
    F --> G[測試技能]

8.2 APLA

首先,我們來探討 APLA(音訊)。APLA 介面啟用 Alexa 裝置播放音訊。 APLA 檔案是 JSON 程式碼。以下是 Alexa 的範例:

{
  "type": "APLA",
  "version": "0.91",
  "description": "Simple document that says hello",
  "mainTemplate": {
    "parameters": [
      "payload"
    ],
    "items": [
      {
        "type": "Speech",
        "content": "Hello from A.P.L.A"
      }
    ]
  }
}

Alexa.Presentation.APLA.RenderDocument 指令用於將檔案傳送給 Alexa。這將 APLA 新增到我們對 Alexa 回應的「directives」部分:

"response": {
  "directives": [
    {
      "type": "Alexa.Presentation.APLA.RenderDocument",
      "token": "pagerToken",
      "document": {
        "type": "APLA",
        "version": "0.91",
        "description": "Simple document that says hello",
        "mainTemplate": {
          "parameters": [
            "payload"
          ],
          "items": [
            {
              "type": "Speech",
              "content": "Hello from A.P.L.A"
            }
          ]
        }
      }
    }
  ]
}

內容解密:

上述 JSON 程式碼定義了一個 APLA 檔案,該檔案包含一個簡單的「Hello from A.P.L.A」語音訊息。Alexa.Presentation.APLA.RenderDocument 指令將此檔案傳送給 Alexa,以便在 Alexa 裝置上播放音訊。

圖表翻譯:

  flowchart TD
    A[APLA 檔案] --> B[JSON 程式碼]
    B --> C[RenderDocument 指令]
    C --> D[Alexa 回應]
    D --> E[播放音訊]

此圖表展示了 APLA 檔案如何被轉換為 JSON 程式碼,然後使用 RenderDocument 指令傳送給 Alexa,最終在 Alexa 裝置上播放音訊。

8.2.1 APLA元件

APLA(Alexa Presentation Language for Audio)是一種用於建立音訊效果的語言。您可以使用多個元件來建立不同的音訊效果。APLA檔案包含一組音訊片段,這些片段是使用APLA元件從文字轉語音和音訊檔案中構建的。

以下是APLA中的幾個元件:

  • 語音(Speech):將純文字或SSML(Speech Synthesis Markup Language)轉換為語音輸出。
  • 音訊(Audio):播放提供的音訊檔案,例如MP3檔案。
  • 沉默(Silence):播放指定時間的靜音音訊,不能單獨使用。
  • 序列器(Sequencer):按順序播放一系列音訊片段。
  • 混音器(Mixer):同時播放一組音訊片段。
  • 選擇器(Selector):從列表中播放一個音訊片段。以下是選擇器元件的示例,根據使用者的語言環境,向使用者問候:
{
  "type": "Selector",
  "items": [
    {
      "type": "Speech",
      "when": "${environment.alexaLocale == 'en-US'}",
      "contentType": "PlainText",
      "content": "Hello!"
    },
    {
      "type": "Speech",
      "when": "${environment.alexaLocale == 'de-DE'}",
      "contentType": "SSML",
      "content": "<speak>guten Tag</speak>"
    }
  ]
}

“when”子句也可以用於確定顯示螢幕大小並根據需要調整視覺回應。

8.3 資料源

資料源部分包含可以繫結到APLA檔案的資料。這將資料與佈局分開。你必須在mainTemplate.parameters陣列中宣告一個名為payload的引數;“payload”是一個傳統要求。

例如,你可以使用以下程式碼:

"datasources": {
  "myData": {
    "user": {
      "name": "John"
    }
  }
}

美元符號($)用於存取APLA中的資料。在這種情況下,“John”將從${payload.myData.user.name}中提取出來。

8.4 APLA資料源示例

讓我們建立一個簡短的技能,使用APLA和資料源來說你好。

程式:

  1. 建立一個使用Python的Alexa主機技能,選擇“從頭開始”技能和“繼續使用範本”。
  2. 檢查你的呼叫命令(我把我的呼叫命令命名為“語音技能”)。
  3. 選擇APLA介面,單擊介面並啟用Alexa Presentation Language。
  4. 單擊頂部的“儲存介面”並重新構建模型。
  5. 編輯程式碼以新增APLA程式碼:在程式碼頂部(所有“from”陳述式之後是新增程式碼的良好位置),新增以下程式碼:
from ask_sdk_model.interfaces.alexa.presentation.apla import RenderDocumentDirective

以下是匯入json模組的程式碼:

import json

定義一個載入APLA檔案的函式:

def _load_apl_document(file_path):

這個函式將用於載入APLA檔案。

載入APL檔案

要載入APL檔案,我們需要定義一個函式來讀取JSON檔案並將其轉換為字典物件。以下是該函式的實作:

import json

def load_apl_file(file_path: str) -> dict:
    """
    載入APL檔案並將其轉換為字典物件。
    
    :param file_path: APL檔案的路徑
    :return: APL檔案的內容以字典物件形式呈現
    """
    with open(file_path) as f:
        return json.load(f)

建立APLA檔案

接下來,我們需要建立一個名為APLA.json的新檔案,並將其放在與Python程式碼相同的目錄中。以下是APLA.json檔案的內容:

{
    "type": "APLA",
    "version": "0.91",
    "description": "Simple document to say hello",
    "mainTemplate": {
        "parameters": [
            "payload"
        ],
        "items": [
            {
                "type": "Speech",
                "content": "Hello from A.P.L.A."
            }
        ]
    }
}

修改HelloWorld意圖

最後,我們需要修改HelloWorldIntentHandler類別以新增指令。以下是修改後的程式碼:

class HelloWorldIntentHandler(AbstractRequestHandler):
    """
    Handler for Hello World Intent.
    """
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("HelloWorldIntent")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        speak_output = "Hello World!"
        
        # 將指令新增到回應中
        return (
            handler_input.response_builder
               .speak(speak_output)
                #.ask("keep the session open for the user to respond")
        )

內容解密:

在上面的程式碼中,我們定義了一個load_apl_file函式來載入APL檔案。然後,我們建立了一個APLA.json檔案,並將其放在與Python程式碼相同的目錄中。最後,我們修改了HelloWorldIntentHandler類別以新增指令。

圖表翻譯:

以下是Mermaid圖表,用於視覺化說明程式流程:

  flowchart TD
    A[載入APL檔案] --> B[建立APLA檔案]
    B --> C[修改HelloWorld意圖]
    C --> D[新增指令]

圖表解釋:

上面的圖表展示了程式流程。首先,我們載入APL檔案,然後建立一個APLA.json檔案。接下來,我們修改HelloWorldIntentHandler類別以新增指令。最後,我們將指令新增到回應中。

使用Alexa Presentation Language(APL)進行語音應用開發

在進行語音應用開發時,Alexa Presentation Language(APL)是一種強大的工具,允許開發者建立豐富的視覺體驗。以下是使用APL進行開發的步驟。

結語

從跨平臺開發的視角來看,整合 VS Code 和 Alexa Skills Toolkit 確實簡化了 Alexa 技能的開發流程,尤其在除錯方面,launch.json 檔案的設定與 VS Code Alexa 模擬器的使用,讓開發者能更有效率地測試和驗證技能邏輯。然而,設定過程中需要注意區域設定的正確性,避免除錯錯誤。

分析 APLA 與 APL 的應用,我們發現,從早期的 Display Interfaces 演進到如今更具彈性的多模態回應和 APL,展現了 Alexa 技能開發趨勢正朝向更豐富的使用者經驗發展。APLA 提供了靈活的音訊控制,透過 Speech、Audio、Sequencer 等元件,結合資料源的運用,開發者可以打造更具互動性和個人化的語音體驗。然而,APLA 檔案的撰寫和整合仍需一定的學習成本,開發者需要熟悉 JSON 語法和 APLA 的各項元件功能。

展望未來,隨著 APL 的普及和功能的持續增強,預期將會有更多結合視覺和聽覺的創新應用案例出現,例如更具沉浸感的遊戲、更直觀的資訊呈現,以及更個人化的智慧家庭控制。對於開發者而言,掌握 APL 和 APLA 將是提升技能開發能力、打造更具吸引力 Alexa 技能的關鍵。因此,建議開發者投入資源學習 APL 和 APLA,並積極探索其應用潛力,以在未來的語音應用市場中保持競爭優勢。 玄貓認為,APL 的發展趨勢值得密切關注,它將重新定義語音互動的可能性。