6

这可能是一个简单的,但我无法在几天内弄清楚。

我想让 Alexa 进行对话,比如;

>> Alexa,开始 testSkill。

A:测试技能开始。告诉我一个数字。

>> 一。

A:好的,现在告诉我一种颜色。

>> 蓝色。

A:最后,告诉我一个动物的名字。

>> 鸡肉。

- 答:你告诉我一个,蓝和鸡。

我发现我必须处理技能的会话属性,这是一个 JSON 持有并在意图之间传输信息。

我使用这样的功能;

    function testConversation(intent, session, callback) {

    var cardTitle = intent.name;
    var repromptText = "";
    var sessionAttributes = { // I don't know how to handle this
        nameOfPairOne: "",
        nameOfPairTwo: "",
    };
    var shouldEndSession = false;
    var speechOutput = "";

    var color= convertToASCII(intent.slots.color.value);
    sessionAttributes.nameOfPairOne = color;

    speechOutput = "You said "+sessionAttributes.nameOfPairOne+". Please say another thing. ";
    callback(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession));
}

 function testConversation2(intent, session, callback) {

    var cardTitle = intent.name;
    var repromptText = "";
    var sessionAttributes = session.attributes;
    var shouldEndSession = false;
    var speechOutput = "";

    var number = convertToASCII(intent.slots.number.value);
    sessionAttributes.nameOfPairTwo = number;

    speechOutput = "You first said "+sessionAttributes.nameOfPairOne+", and now said "+sessionAttributes.nameOfPairTwo;
    callback(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession));
}

//------Helpers that build all of the responses ---------//
function buildSpeechletResponse(title, output, repromptText, shouldEndSession) {
    return {
        outputSpeech: {type: "PlainText", text: output},
        card: {type: "Simple", title: "SessionSpeechlet - " + title, content: "SessionSpeechlet - " + output},
        reprompt: {outputSpeech: {type: "PlainText", text: repromptText}},
        shouldEndSession: shouldEndSession
    };
}


function buildResponse(sessionAttributes, speechletResponse) {
    return {version: "1.0", sessionAttributes: sessionAttributes, response: speechletResponse};
} 

我调用上述函数的 onIntent() 函数中的一段代码。(我知道这是错误的,但无法找出正确的方法)

 else if ("getColorNum" == intentName) {
    if (session.attributes.nameOfPairOne === "") {
        testConversation(intent, session, callback);
    } else {
        testConversation2(intent, session, callback);
    }
}

Intent Schema JSON 就是这样;

 "intents": [
{
  "intent": "getColorNum",
  "slots": [
    {
      "name": "Color",
      "type": "ColorSlot"
    },
    {
      "name": "Number",
      "type": "NumberSlot"
    }
  ]
}

] }

那么,我做错了所有事情吗?错误在哪里?而且,我怎样才能像我提到的那样建立对话?从现在开始感谢。

4

2 回答 2

3

由于没有人给你任何答案,但我想我会给你我的两分钱。我选择的语言是 Python,但我可以给你一些高级的想法。

  • 使用会话对象来跟踪与对话相关的所有内容。计算“响应”后,将会话对象序列化为会话 json 并在下一个意图请求中反序列化。
  • 维护对话状态并使用有限状态机方法来了解您在哪里以及在给定意图和特定对话状态的情况下执行什么回调。
  • 尽可能将对话逻辑与 ASK 界面分离。尝试编写可以在本地运行的测试。

如果你想看看我是如何实现这些的,请查看:

于 2017-04-10T20:16:27.973 回答
1

有几种方法可以解决此问题,具体取决于您尝试存储的内容的复杂性。

首先,使用插槽。如果 One, blue, chicken 等属于分类类别,您可以将它们存储在插槽中并以 JSON 方式访问它们,获取值并存储在 JavaScript 代码中的变量中。示例(须藤):

var something1 = event.request.intent.slots.assetName.value;
var something2 = event.request.intent.slots.assetName.value;
buildSpeechletResponse(`my ${something1} likes ${something2} and blah blah blah`)

其次,使用属性存储东西并在运行时后期使用,Alexa在技能结束后不会记住这一点。例子:

'BreakfastIntent': function () {
    var restaurant = randomArrayElement(getRestaurantsByMeal('breakfast'));
    this.attributes['restaurant'] = restaurant.name;

    var say = 'For breakfast, try this, ' + restaurant.name + '. Would you like to hear more?';
    this.response.speak(say).listen(say);
    this.emit(':responseReady');
},

最后,将它们存储在数据库中,强烈推荐的是 DynamoDB,并且有大量的教程用于从 Alexa Skill Kit 存储和访问 Dynamo。结帐:https ://github.com/alexa/alexa-cookbook/tree/master/aws/Amazon-DynamoDB/read

我希望这有帮助。

于 2017-10-24T15:22:12.450 回答