Alexa,做笔记并通过邮件发送

时间:2018-08-08 12:11:33

标签: node.js alexa alexa-skills-kit

我想学习写Alexa技能,所以我认为记录用户语音并将其记录下来,然后通过邮件发送给他的技能非常不错。

我设法让用户开始使用此技能,但是我不知道如何保存用户的“笔记”。我没有在Google上找到任何东西,所以我试图在这里问。

2 个答案:

答案 0 :(得分:0)

截止到今天,该用例尚无法通过技能开发。没有API仅允许捕获原始用户或语音识别输入。一项技能接收语音识别和自然语言理解的结果,表示为意图和一组实体。

答案 1 :(得分:0)

我设法意识到了我的问题。 这是我的解决方案: 目的(话语是德语,但{NoteInput}槽很重要)

{
"interactionModel": {
    "languageModel": {
        "invocationName": "mail notes",
        "intents": [
            {
                "name": "AMAZON.CancelIntent",
                "samples": []
            },
            {
                "name": "AMAZON.HelpIntent",
                "samples": []
            },
            {
                "name": "AMAZON.StopIntent",
                "samples": []
            },
            {
                "name": "noteIntent",
                "slots": [
                    {
                        "name": "NoteInput",
                        "type": "AMAZON.SearchQuery",
                        "samples": [
                            "notiere {NoteInput}",
                            "{NoteInput}"
                        ]
                    }
                ],
                "samples": [
                    "und schreibe auf {NoteInput}",
                    "und notiere {NoteInput}",
                    "notiere {NoteInput}",
                    "sende mir folgendes",
                    "und schreib auf",
                    "und notiere",
                    "notiere",
                    "und schreib mit",
                    "schreib mit",
                    "schreib auf"
                ]
            }
        ]
    },
    "dialog": {
        "intents": [
            {
                "name": "noteIntent",
                "confirmationRequired": false,
                "prompts": {},
                "slots": [
                    {
                        "name": "NoteInput",
                        "type": "AMAZON.SearchQuery",
                        "confirmationRequired": false,
                        "elicitationRequired": true,
                        "prompts": {
                            "elicitation": "Elicit.Slot.61384016725.485372519591"
                        }
                    }
                ]
            }
        ]
    },
    "prompts": [
        {
            "id": "Elicit.Slot.61384016725.485372519591",
            "variations": [
                {
                    "type": "PlainText",
                    "value": "Sehr wohl, ich trage zu protokoll"
                },
                {
                    "type": "PlainText",
                    "value": "Gerne, ich notiere"
                },
                {
                    "type": "PlainText",
                    "value": "Sehr wohl, ich notiere"
                },
                {
                    "type": "PlainText",
                    "value": "Gerne, ich schreibe mit"
                }
            ]
        }
}

}

您可以看到Slot {NoteInput}获得了AMAZON.SearchQuery作为Slottype。这将导致Alexa简单地将语音转换为文本。

Lambda函数中的处理程序如下:

 const inProgressNoteIntentHandler = {
   canHandle(handlerInput) {
     const request = handlerInput.requestEnvelope.request;
    return request.type === 'IntentRequest'
      && request.intent.name === 'noteIntent'
      && request.dialogState !== 'COMPLETED' ;
  },handle(handlerInput) {
     const currentIntent = handlerInput.requestEnvelope.request.intent;
     return handlerInput.responseBuilder
      .addDelegateDirective(currentIntent)
      .getResponse();

  }
};

const completeNoteIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'noteIntent';
  },handle(handlerInput) {
    const filledSlots = handlerInput.requestEnvelope.request.intent.slots;
    const slotValues = getSlotValues(filledSlots);
    console.log("Folgende Slots im noteIntent " + slotValues.NoteInput.synonym);


      noteArr.push(slotValues.NoteInput.synonym);
      console.log(noteArr.toString());



      return handlerInput.responseBuilder
      .speak("Ok, ich habe " +slotValues.NoteInput.synonym+ " notiert.")
      .getResponse();

  },


};

您需要此函数来获取广告位的值:

function getSlotValue(slot){
    let value = slot.value;
    let resolution = (slot.resolutions && slot.resolutions.resolutionsPerAuthority && slot.resolutions.resolutionsPerAuthority.length > 0) ? slot.resolutions.resolutionsPerAuthority[0] : null;
    if(resolution && resolution.status.code == 'ER_SUCCESS_MATCH'){
        let resolutionValue = resolution.values[0].value;
        value = resolutionValue.name;
    }
    return value;
}