如何使用Alexa编写决策树?

时间:2018-03-25 00:30:06

标签: javascript variables attributes alexa alexa-skills-kit

我目前正在尝试编写alexa技能。我很困难......试着看看我是否可以让Alexa询问用户他们的感受如何'然后用它来提出进一步的问题。不确定我是否应该制作变量或属性...请帮助。 例如,一旦用户说" SAD"对于情感 - 我希望能够提出更多问题,例如"它是来自你的过去还是现在?"

(AWS代码)

const GREETING = [
'What emotion are you feeling today?',
'Hello, what emotion are you feeling right now?'
];
const SKILL_NAME = 'March Test';
const GET_FEEL = "That is unfortunate to hear?";
const HELP_MESSAGE = 'I can give you more information if you tell me 
how you are feeling';
const HELP_REPROMPT = 'How are you feeling currently?';
const STOP_MESSAGE = 'Goodbye!';


const FeelingsList = [
{
    Emotion: "SAD",
    suggestion: "My suggestion for sad is dry your tears and find a 
distraction" 
},
{
    Emotion: "HAPPY",
    suggestion: "My suggestion for happy is keep smiling and keep shining"
},
{
    Emotion: "ANGRY",
    suggestion: "My suggestion for angry is count to ten and cool down"
}

];

const handlers = {
'LaunchRequest': function () {
    const greetingArr = GREETING;
    const greetingIndex = Math.floor(Math.random() * 
greetingArr.length);
    this.emit(':ask',greetingArr[greetingIndex]); //first action that 
will be fired
},
'EmotionalState': function () {
  var stateSlot = this.event.request.intent.slots.Emotion.value;
  this.emit(':ask', EmotionalResponse(FeelingsList, 'Emotion', 
stateSlot.toUpperCase()).suggestion);
},


'AMAZON.HelpIntent': function () {
    const speechOutput = HELP_MESSAGE;
    const reprompt = HELP_REPROMPT;

    this.response.speak(speechOutput).listen(reprompt);
    this.emit(':responseReady');
},
'AMAZON.CancelIntent': function () {
    this.response.speak(STOP_MESSAGE);
    this.emit(':responseReady');
},
'AMAZON.StopIntent': function () {
    this.response.speak(STOP_MESSAGE);
    this.emit(':responseReady');
},

2 个答案:

答案 0 :(得分:1)

好的,感谢您在评论中回答我的问题,EmotionalResponse功能看起来不错。您目前设置它的方式应该适用于单个响应。如果这就是你想要Alexa在这里做的所有事情,那么只需将':ask'更改为':tell'(这将会响应并且不希望用户回复)所以该行将变为:

this.emit(':tell', EmotionalResponse(FeelingsList, 'Emotion', stateSlot.toUpperCase()).suggestion );

但是,您希望能够通过多个问题和响应处理来继续对话。您可能已经拥有此功能,但它不在您的代码中,并且您需要使用Alexa SDK,因此请确保您在开头使用此行:

const Alexa = require('alexa-sdk');

你也需要这个,最好是在最后:

exports.handler = function(event, context, callback) {
    const alexa = Alexa.handler(event, context, callback);
    alexa.registerHandlers(handlers);
    alexa.execute();
};

接下来,有关使用Alexa SDK继续对话的一些事项:

':ask'
将回复speechOutput句子,并期待用户的回复,但如果用户没有回复,那么Alexa将重新提示"使用repromptSpeech句子的用户。

':delegate'
将告诉Alexa确定要求用户使用哪个所需的插槽,并使用提示(在Alexa开发人员控制台中设置)从用户那里获取插槽信息。

':elicitSlot'
将给予Alexa关于引出哪个插槽的具体说明以及确切的使用提示。

有很多方法可以继续进行Alexa对话并构建处理用户输入的逻辑并构建适当的响应。但要使用您从用户那里请求更多信息的示例,例如"它是来自您的过去还是现在?",这是我建议的一种方式:

首先,为此意图创建另一个插槽(只要您想要保存用户输入信息,您就需要另一个插槽)。我们称之为Timeframe

最简单的方法是"委托" Alexa要引出这个插槽,所以在控制台中需要插槽并添加提示信息,例如,"你是否因为过去或现在的某种事情而感觉到这种情况?"你甚至可以在这个消息中使用情感插槽,如下所示:"你是否因为过去或现在的某些事情而感到{情感}?" Alexa将自动填充它,它听起来会更加智能和对话。

接下来,您要在const handlers内改进此意图的逻辑:

const handlers = {
   ...
   'EmotionalState': function () {
      var emotion = this.event.request.intent.slots.Emotion.value;
      var timeframe = this.event.request.intent.slots.Timeframe.value;
      if (!timeframe){
        this.emit(':delegate');
      } else {
        var response = responseBuilder(emotion, timeframe);
        this.emit(':tell', response);
      }
    },
    ...
} //<<--------------your code seems to be missing this to close handlers

function responseBuilder(emotion, timeframe) {
    // compare emotion with timeframe to build the appropriate response
    // just for example
    if (emotion=="sad" && timeframe=="past") { 
        return "My suggestion for feeling sadness about the past is, dry your tears and find a distraction.";
    }
}      

这只是一个粗略的想法,但应该让你再次进步。祝你好运!

答案 1 :(得分:0)

创建一个全局对象情感,并将所有情感作为属性和相应的建议作为它们的价值。像这样的东西,

const emotions = {&#34; Happy&#34; :&#34;保持微笑和闪亮&#34;,&#34;愤怒&#34; :&#34;数到10并冷静下来&#34;}

然后,使用从用户话语获得插槽值的varibale访问全局对象,并将其与响应一起添加。 例如,

var stateSlot = this.event.request.intent.slots.Emotion.value;

var suggestion = emotions [stateSlot];

使用方括号获取情感对象中与变量stateSlot中的值匹配的属性。