我目前正在尝试编写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');
},
答案 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中的值匹配的属性。