3

我正在研究一项 Alexa 技能,当他通过 LaunchRequest 打开技能时,我想将用户重定向到一个意图。

  • 用户说Open xyz skill
  • LaunchRequest 接收到这个并将请求转发给另一个意图。this.emit('AnotherIntent')
  • AnotherIntent有一个 SLOT 是其功能所必需的。
  • 我已经根据需要设置了 SLOT,并且在单独AnotherIntent调用时可以正常工作。

但是,当我启动该技能并尝试AnotherIntent从上面第 2 步中提到的从其中调用时,Alexa 技能无法启动。

还有一点需要注意的是,当我在此场景的技能构建器中测试相同的 Alexa 技能时,输出 json 正确地向我显示了被引出的 SLOT。不确定当我尝试从 Echo 设备运行它时发生了什么。

我正在使用 NodeJS 和 Lambda 来部署我的 Alexa 处理程序。

任何帮助,将不胜感激。

基于评论的进一步参考 -

处理程序 -

var handlers = {
'LaunchRequest': function () {
    console.log("LaunchRequest::" + JSON.stringify(this.event.request));
    this.emit('fooIntent');
},
'SessionEndedRequest': function () {
    console.log('session ended!');
},
'fooIntent': function () {
    const intentObj = this.event.request.intent;
     if (!intentObj || (intentObj && !intentObj.slots.WHEN.value)) {
        console.log('fooIntent::UserId' + this.event.session.user.userId);
        const slotToElicit = 'WHEN';
        const speechOutput = 'Ask a question here ?';
        const repromptSpeech = speechOutput;
        console.log("emitting elict now");
        this.emit(':elicitSlot', slotToElicit, speechOutput, repromptSpeech);   
    } else {
        // SLOT is filled, let's query the database to get the value for the slot.
        console.log("fooIntent intent:something is requested for " + this.event.request.intent.slots.WHEN.value);
        // All the slots are filled (And confirmed if you choose to confirm slot/intent)
       fooIntentFunction(this,this.event.request.intent.slots.WHEN.value);
    }
 },
'AMAZON.HelpIntent': function () {
    var speechOutput = "Need to come up with one.";
    var reprompt = "What can I help you with?";
    this.emit(':ask', speechOutput, reprompt);
},
'AMAZON.CancelIntent': function () {
    this.emit(':tell', 'Goodbye!');
},
'AMAZON.StopIntent': function () {
    this.emit(':tell', 'Goodbye!');
}

};

LaunchRequest 中捕获的 JSON 请求

{
"type": "LaunchRequest",
"requestId": "amzn1.echo-api.request.972bb705-d181-495e-bf60-991f2bd8fbb1",
"timestamp": "2017-12-30T21:35:21Z",
"locale": "en-US"
}

从 LaunchRequest 调用时在 Intent 中捕获的 JSON 请求。说明当时intent没有设置。我相信这就是为什么当我尝试在 fooIntent 实现中发出 elicit 时它一直失败的原因,如上所示。

{
    "type": "LaunchRequest",
    "requestId": "amzn1.echo-api.request.972bb705-d181-495e-bf60-991f2bd8fbb1",
    "timestamp": "2017-12-30T21:35:21Z",
    "locale": "en-US"
}
  • 阿米特
4

3 回答 3

2

亚马逊文档中所述,对话界面旨在填充特定意图的所有必需槽:

问题和答案旨在收集和确认所有意图所需插槽的值。对话继续进行,直到意图所需的所有时隙都被填满并得到确认。

在您的情况下,用户的请求不是意图(即IntentRequest类型),而是LaunchRequest. 因此,即使它是由意图处理程序处理的,它也没有交互模型,也没有要引出的槽。

您应该通过深度调用使您的技能按预期工作,例如

Alexa,告诉 xyz 技能给我做三明治

(如果三明治意图,或者在你的情况下fooIntent,有一个WHEN槽可以引出)。

希望这可以帮助!

于 2017-12-30T08:50:11.150 回答
0

尝试这个,

this.emitWithState("IntentName");

希望这可以帮助。一切顺利 :)

于 2018-07-23T12:52:20.023 回答
0

可以使用以下代码段简单地从另一个意图调用一个意图 - \ this.emit("Intent name")

在您的第一个意图的响应中,给出您要调用的意图的名称。

于 2019-10-16T12:16:28.377 回答