首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python和ask-sdk (意图链接)将意图委托给Alexa?

如何使用Python和ask-sdk (意图链接)将意图委托给Alexa?
EN

Stack Overflow用户
提问于 2020-03-15 03:13:01
回答 2查看 447关注 0票数 2

在我的Alexa-Skill中,我问用户一个是/否的问题(他是否喜欢听新闻)-在是的部分,我想启动NewsIntent,就像用户手动调用它一样。

它背后的想法来自于Justin Jeffress:https://developer.amazon.com/de/blogs/alexa/post/9ffdbddb-948a-4eff-8408-7e210282ed38/intent-chaining-for-alexa-skill

代码语言:javascript
复制
handler_input.response_builder.add_directive(DelegateDirective('NewsIntent')).speak(speech_text)
return handler_input.response_builder.response

当我在开发人员控制台中测试它时,我收到了speach_text,但随后我被告知发生了一个错误。

这是它的JSON输出:

代码语言:javascript
复制
{
    "body": {
        "version": "1.0",
        "response": {
            "outputSpeech": {
                "type": "SSML",
                "ssml": "<speak>My pleasure!</speak>"
            },
            "directives": [
                {
                    "type": "Dialog.Delegate",
                    "updatedIntent": {
                        "name": "NewsIntent",
                        "confirmationStatus": "NONE",
                        "slots": {}
                    }
                }
            ],
            "type": "_DEFAULT_RESPONSE"
        },
        "sessionAttributes": {
            "IntentOrigin": null
        },
        "userAgent": "ask-python/1.13.0 Python/3.6.9 ask-webservice django-ask-sdk ask-webservice django-ask-sdk"
    }
}

有谁知道怎么解决这个问题吗?在这种情况下,Python不会抛出任何异常。(它在Django下运行)

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2020-03-22 23:49:55

最后我找到了答案:

代码语言:javascript
复制
return NewsIntentHandler.handle(self, handler_input)
票数 3
EN

Stack Overflow用户

发布于 2021-12-06 23:49:52

我不知道这对你是否有用。不幸的是,我无法使用您的解决方案,因为它没有重置/启动意图所需的插槽问题。它将简单地保留上次触发时存储的值。

对于您的情况,我将确保您在NewsIntent中设置一个会话属性,如下所示:

代码语言:javascript
复制
def handle(self, handler_input):
        attribute_manager = handler_input.attributes_manager
        session_attr = attribute_manager.session_attributes
        
        # Your logic for your intent here
        
        session_attr['news'] = 'some string or value'
        speak_output = "I found some news! Would you like to find more?"
        return (handler_input.response_builder.speak(speak_output).response)

您需要在构建器UI中添加AMAZON.YesIntent意图。

您需要一个类来定义在触发AMAZON.YesIntent时如何处理它。在本例中,我将该类命名为MoreNewsIntentHandler。将这段代码添加到代码的底部:

代码语言:javascript
复制
sb.add_request_handler(MoreNewsIntentHandler())

最后,在触发AMAZON.YesIntent时使用预期的操作创建类。

代码语言:javascript
复制
from ask_sdk_model.intent import Intent
from ask_sdk_model.dialog import delegate_directive

class MoreNewsIntentHandler(AbstractRequestHandler):
    def can_handle(self, handler_input):
        attribute_manager = handler_input.attributes_manager
        session_attr = attribute_manager.session_attributes
        return (is_intent_name("AMAZON.YesIntent")(handler_input) and "news" in session_attr)
    
    def handle(self, handler_input):
        attribute_manager = handler_input.attributes_manager
        session_attr = attribute_manager.session_attributes
        if "news" in session_attr:
            speak_output = "Ok. Let's get some more news"
            intent_name = "NewsIntent"
        return handler_input.response_builder.speak(speak_output).add_directive(delegate_directive.DelegateDirective(updated_intent=Intent(name=intent_name))).response 

因此,我计划使用会话属性来输出不同的语句,并根据会话属性确定需要触发的正确意图。我计划继续修改会话属性,以确保可以通过它们处理自定义的AMAZON.YesIntent操作。如果我发现了更多,我会发布一个经过编辑的更新。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60686421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档