如何从alexa技能获取用户输入

问题描述 投票:0回答:2

当我使用 Alexa 询问某些内容时,它仅根据用户输入返回意图和实体,而我看不到完整的用户输入。

alexa-skills-kit
2个回答
0
投票

您永远无法获得用户的完整语音。但是,您可以使用插槽(自定义和预定义)来获取用户语音的部分内容。

AMAZON.SearchQuery
AMAZON.LITERAL
插槽类型是您应该检查的最接近的插槽类型。

查看预定义的插槽类型集此处


0
投票

在阅读了大量有关 Alexa Skill 的内容后,我发现这可以使用“对话框”来实现

您必须有一个包含插槽类型的自定义意图

AMAZON.SearchQuery
;无需配置任何话语。 您的交互模型必须定义意图、对话及其提示;将提示定义为启发非常重要。 在 lambda 中,有两个基本意图:

  1. 处理启动请求,
  2. 处理自定义Intent。

我所做的是,一旦技能 LaunchRequest 被触发,它会将对话委托给 customIntent 但使用诱导。这要求用户使用将传递到槽并可以从我们的自定义意图中检索的特定值来填写启发。此实现最终使用一种递归类型,其中 customIntent 调用自身

这是我的 iteracion custon Itent 定义,您也可以使用 UI 来定义它,除了。 "" 我无法通过 UI

           {
            "name": "CustomIntent",
            "slots": [
                {
                    "name": "Query",
                    "type": "AMAZON.SearchQuery",
                    "samples": [
                        "{Query}"
                    ]
                }
            ],
            "samples": []
        }

这是对话框和提示

"dialog": {
    "intents": [
        {
            "name": "CustomIntent",
            "confirmationRequired": false,
            "prompts": {},
            "slots": [
                {
                    "name": "Query",
                    "type": "AMAZON.SearchQuery",
                    "confirmationRequired": false,
                    "elicitationRequired": true,
                    "prompts": {
                        "elicitation": "Elicit.Slot.1670425968761.1692305302317"
                    }
                }
            ]
        }
    ],
    "delegationStrategy": "ALWAYS"
},
"prompts": [
    {
        "id": "Elicit.Slot.1670425968761.1692305302317",
        "variations": [
            {
                "type": "SSML",
                "value": "<speak></speak>"
            }
        ]
    }
] 

在此之后你只需要修改你的lambda代码

class CustomIntentHandler(AbstractRequestHandler):
    """Handler for Search query  Intent."""

    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool
        return ask_utils.is_intent_name("Customntent")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response

        user_query = ask_utils.get_slot(handler_input, 'Query').value
        speak_output = user_query

        query_slot = Slot(
            name="Query",
            value="",
            confirmation_status=slot_confirmation_status.SlotConfirmationStatus.NONE
        )

        return (handler_input.response_builder
                .speak(speak_output)
                .add_directive(ElicitSlotDirective(updated_intent=Intent(name="CustomIntent",
                                                                         slots={"Query": query_slot},
                                                                         ),
                                                   slot_to_elicit='Query'))
                .ask("hi")
                .response)

也类似于lauchIntent

class LaunchRequestHandler(AbstractRequestHandler):
    """Handler for Skill Launch."""

    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool

        return ask_utils.is_request_type("LaunchRequest")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response


        speak_output = f"Soy ada en que te puedo ayudar"

        
        query_slot = Slot(
                    name="Query",
                    value="",
                    confirmation_status=slot_confirmation_status.SlotConfirmationStatus.NONE
                )
    
        return (handler_input.response_builder
                .speak(speak_output)
                .add_directive(ElicitSlotDirective(updated_intent=Intent(name="CustomIntent",
                                                                         slots={"Query": query_slot},
                                                                         ),
                                                   slot_to_elicit='Query'))
                .ask("hi")
                .response)

希望这个解决方案有帮助!!!

© www.soinside.com 2019 - 2024. All rights reserved.