在開發 Alexa 技能時,經常需要處理使用者的肯定或否定回答,例如「是」或「否」。這需要透過內建的 AMAZON.YesIntent 和 AMAZON.NoIntent 來實作。本文將示範如何在 Python 和 JavaScript 環境下,分別建立 YesIntentHandler 和 NoIntentHandler 來處理這兩種意圖,並說明如何將其整合到 Alexa 技能的架構中。同時,也將探討如何利用會話屬性來儲存使用者在對話流程中的 Yes/No 回應,以便在後續步驟中使用,並提供流程圖和 Mermaid 語法,更清晰地展現程式邏輯和流程。

YesIntentHandler

class YesIntentHandler(AbstractRequestHandler):
    """Handler for Yes Intent."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("AMAZON.YesIntent")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        speak_output = "You said Yes"
        return (
            handler_input.response_builder
               .speak(speak_output)
               .ask(speak_output)
               .response
        )

NoIntentHandler

class NoIntentHandler(AbstractRequestHandler):
    """Handler for No Intent."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("AMAZON.NoIntent")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        speak_output = "You said No"
        return (
            handler_input.response_builder
               .speak(speak_output)
               .ask(speak_output)
               .response
        )

內容解密:

在上述程式碼中,我們定義了兩個類別,分別是YesIntentHandlerNoIntentHandler。這兩個類別繼承自AbstractRequestHandler,並實作了can_handlehandle方法。

  • can_handle方法用於判斷是否可以處理當前的意圖。它使用ask_utils.is_intent_name方法來檢查是否是AMAZON.YesIntentAMAZON.NoIntent意圖。
  • handle方法用於處理意圖。它會根據使用者的回應,傳回一個語音輸出。

圖表翻譯:

  flowchart TD
    A[使用者輸入] --> B{判斷意圖}
    B -->|是AMAZON.YesIntent|> C[YesIntentHandler]
    B -->|是AMAZON.NoIntent|> D[NoIntentHandler]
    C --> E[傳回語音輸出]
    D --> E

在這個流程圖中,我們可以看到使用者輸入的意圖會被判斷是否是AMAZON.YesIntentAMAZON.NoIntent,然後會被相應的處理器處理,最終傳回語音輸出。

處理使用者輸入:Yes 和 No 的意圖

在 Alexa 技術中,使用者可以透過語音輸入來控制技能的流程。當使用者說「Yes」或「No」時,Alexa 會將這些輸入識別為特定的意圖(Intent),以便技能可以根據使用者的意圖進行相應的處理。

YesIntentHandler 的實作

以下是 YesIntentHandler 的實作程式碼:

class YesIntentHandler(AbstractRequestHandler):
    def can_handle(self, handler_input):
        return (handler_input.request_envelope.request.object_type == "IntentRequest" and
                handler_input.request_envelope.request.intent.name == "AMAZON.YesIntent")

    def handle(self, handler_input):
        speak_output = "You said Yes"
        return handler_input.response_builder.speak(speak_output).ask(speak_output).response

在這段程式碼中,YesIntentHandler 類別繼承自 AbstractRequestHandler,並實作了 can_handlehandle 方法。

  • can_handle 方法用於判斷是否可以處理當前的請求。它檢查請求的型別是否為 IntentRequest,以及請求的意圖是否為 AMAZON.YesIntent
  • handle 方法用於處理使用者的「Yes」輸入。它設定 speak_output 變數為「You said Yes」,然後使用 response_builder 來構建一個語音回應。

NoIntentHandler 的實作

以下是 NoIntentHandler 的實作程式碼:

class NoIntentHandler(AbstractRequestHandler):
    def can_handle(self, handler_input):
        return (handler_input.request_envelope.request.object_type == "IntentRequest" and
                handler_input.request_envelope.request.intent.name == "AMAZON.NoIntent")

    def handle(self, handler_input):
        speak_output = "You said No"
        return handler_input.response_builder.speak(speak_output).ask(speak_output).response

在這段程式碼中,NoIntentHandler 類別也繼承自 AbstractRequestHandler,並實作了 can_handlehandle 方法。

  • can_handle 方法用於判斷是否可以處理當前的請求。它檢查請求的型別是否為 IntentRequest,以及請求的意圖是否為 AMAZON.NoIntent
  • handle 方法用於處理使用者的「No」輸入。它設定 speak_output 變數為「You said No」,然後使用 response_builder 來構建一個語音回應。

將 Intent Handler 加入 Skill Builder

最後,需要將 YesIntentHandlerNoIntentHandler 加入 SkillBuilder 中,以便技能可以識別和處理使用者的「Yes」和「No」輸入。

sb = SkillBuilder()

sb.add_request_handler(LaunchRequestHandler())
sb.add_request_handler(HelloWorldIntentHandler())
sb.add_request_handler(YesIntentHandler())
sb.add_request_handler(NoIntentHandler())

透過這些步驟,可以實作使用者輸入「Yes」和「No」的意圖識別和處理,從而使技能更加智慧和互動性。

處理Yes和No意圖

在Voice-controlled IoT應用中,處理使用者的Yes和No意圖是非常重要的。以下是如何在Alexa技能中實作這一功能的示例。

首先,我們需要定義兩個handler:YesIntentHandlerNoIntentHandler。這些handler將負責處理使用者的Yes和No意圖。

const YesIntentHandler = {
  canHandle(handlerInput) {
    return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
      && Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.YesIntent';
  },
  handle(handlerInput) {
    // 處理Yes意圖
  }
};

const NoIntentHandler = {
  canHandle(handlerInput) {
    return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
      && Alexa.getIntentName(handlerInput.requestEnvelope) === 'AMAZON.NoIntent';
  },
  handle(handlerInput) {
    // 處理No意圖
  }
};

接下來,我們需要將這兩個handler新增到exports.handler中。

exports.handler = Alexa.SkillBuilders.custom()
 .addRequestHandlers(
    LaunchRequestHandler,
    NoIntentHandler,
    YesIntentHandler,
  )

或者,你也可以使用handlerInput.requestEnvelope.request.typehandlerInput.requestEnvelope.request.intent.name來檢查意圖名稱。

const YesIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'AMAZON.YesIntent';
  },
  handle(handlerInput) { 
    // 處理Yes意圖
  }
};

在Python中,你可以使用ask_utils.is_intent_name來檢查意圖名稱。

class YesNoIntentHandler(AbstractRequestHandler):
    """Handler for Yes and No Intent."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return (ask_utils.is_intent_name("AMAZON.NoIntent")(handler_input) or
                ask_utils.is_intent_name("AMAZON.YesIntent")(handler_input))

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        # 處理Yes和No意圖
        pass

圖表翻譯

  flowchart TD
    A[使用者輸入] --> B[意圖識別]
    B --> C[Yes意圖]
    C --> D[處理Yes意圖]
    B --> E[No意圖]
    E --> F[處理No意圖]

內容解密

以上程式碼示範瞭如何在Alexa技能中處理Yes和No意圖。透過定義YesIntentHandlerNoIntentHandler,我們可以分別處理使用者的Yes和No意圖。然後,透過將這兩個handler新增到exports.handler中,我們可以確保使用者的意圖被正確處理。

第四章:插槽和對話,儲存會話資料

在 Alexa 技術中,處理使用者的 Yes 或 No 回應是一個重要的部分。為了實作這個功能,我們需要建立一個 YesNoIntentHandler 來處理 AMAZON.Yes 和 AMAZON.No 意圖。

YesNoIntentHandler

YesNoIntentHandler 是一個特殊的意圖處理器,它負責處理使用者的 Yes 或 No 回應。以下是 Node.js 中的 YesNoIntentHandler 實作:

const YesNoIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && (handlerInput.requestEnvelope.request.intent.name === 'AMAZON.YesIntent'
        || handlerInput.requestEnvelope.request.intent.name === 'AMAZON.NoIntent');
  },
  handler(handlerInput) {
    // 處理 Yes 或 No 回應的邏輯
  }
};

在上面的程式碼中,我們定義了一個 YesNoIntentHandler,它可以處理 AMAZON.Yes 和 AMAZON.No 意圖。當使用者說 “Yes” 或 “No” 時,Alexa 會觸發相應的意圖,並將其傳遞給 YesNoIntentHandler。

儲存會話資料

在某些情況下,我們可能需要儲存使用者的 Yes 或 No 回應,以便在後續的對話中使用。為了實作這個功能,我們可以使用會話屬性(session attributes)來儲存使用者的回應。

以下是如何儲存會話資料的示例:

const attr = handlerInput.attributes_manager.session_attributes;
attr['thisIntent'] = ask_utils.get_intent_name(handlerInput);
handlerInput.attributes_manager.session_attributes = attr;

在上面的程式碼中,我們使用 ask_utils.get_intent_name(handlerInput) 函式來取得當前的意圖名稱,並將其儲存到會話屬性中。

處理多個 Yes/No 來源

在某些情況下,可能需要處理多個 Yes/No 來源。為了實作這個功能,我們可以使用會話屬性來儲存呼叫意圖請求,並在 Yes/No 意圖程式碼中檢查它。

以下是如何處理多個 Yes/No 來源的示例:

class YesIntentHandler(AbstractRequestHandler):
  def can_handle(self, handler_input):
    # 檢查是否為 Yes 意圖
    return handler_input.request_envelope.request.intent.name == 'AMAZON.YesIntent'

  def handle(self, handler_input):
    # 處理 Yes 回應的邏輯
    attr = handler_input.attributes_manager.session_attributes
    if 'thisIntent' in attr:
      # 處理多個 Yes/No 來源的邏輯
      pass

在上面的程式碼中,我們定義了一個 YesIntentHandler,它可以處理 AMAZON.Yes 意圖。在 handle 方法中,我們檢查是否存在 thisIntent 會話屬性,如果存在,則處理多個 Yes/No 來源的邏輯。

圖表翻譯:

  graph LR
  A[使用者說 "Yes" 或 "No"] --> B[觸發 AMAZON.Yes 或 AMAZON.No 意圖]
  B --> C[YesNoIntentHandler 處理意圖]
  C --> D[儲存會話資料]
  D --> E[處理多個 Yes/No 來源]

在上面的圖表中,我們展示了使用者說 “Yes” 或 “No” 時的流程。當使用者說 “Yes” 或 “No” 時,Alexa 會觸發相應的意圖,並將其傳遞給 YesNoIntentHandler。然後,YesNoIntentHandler 會儲存會話資料,並處理多個 Yes/No 來源。

瞭解 Alexa 技術:意圖、槽位和對話

在 Alexa 技術中,意圖(Intent)和槽位(Slot)是用於處理使用者輸入和實作對話的核心概念。意圖代表了使用者想要完成的動作或任務,而槽位則是用於捕捉使用者輸入中特定的資訊。

結論:奠定語音互動基礎的 Yes/No 意圖處理

從使用者經驗的最佳化角度來看,有效處理 Yes 和 No 意圖是構建自然流暢的 Alexa 技能的根本。本文深入剖析了 YesIntentHandler 和 NoIntentHandler 的實作細節,涵蓋了從意圖識別、請求處理到回應生成的完整流程。技術架構視角的分析顯示,透過繼承 AbstractRequestHandler 並實作 can_handle 和 handle 方法,開發者可以清晰地定義意圖處理邏輯,並利用 ask_utils 等工具簡化開發流程。然而,目前的框架在處理多個 Yes/No 來源的複雜情境下仍存在挑戰,需要更精細的會話狀態管理和上下文識別機制。展望未來,隨著 Alexa 技術的持續演進,我們預見更強大的對話管理工具和更智慧的上下文理解能力將被整合至 SDK 中,進一步降低開發門檻,並提升語音互動的自然度和效率。對於開發者而言,掌握 Yes/No 意圖處理的最佳實務,並持續關注相關技術的發展趨勢,將是打造卓越 Alexa 技能的關鍵。