【问题标题】:Alexa, taking notes and send them via mailAlexa,记笔记并通过邮件发送
【发布时间】:2018-08-08 12:11:33
【问题描述】:

我想学习编写 Alexa Skills,所以我想一个可以记录用户语音并写下来,以后通过邮件发送给他的 Skill,会很酷。

我设法让用户启动技能,但我不知道如何保存用户的“笔记”。我在谷歌上没有找到任何东西,所以我试着在这里问。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 您好,感谢您的回答。您能检查我在回答中提供的解决方案吗?我工作得很好,但你的回答听起来像是 AMAZON.SearchQuery SlotType 不适合以这种方式使用。
    • 确实如此。 SearchQuery 槽是针对通用搜索数据进行训练的,可能无法准确识别来自许多不同领域的通用数据,例如会议记录。我建议在决定继续在这种情况下使用它之前,先尝试并进行试验,并测量您的用例的准确性。
    【解决方案2】:

    我设法意识到我的问题。 这是我的解决方案: 意图(用德语表达,但插槽 {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 简单地将 Speech-to-Text 传输。

    Lambda-Function 中的 Handler 如下所示:

     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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      相关资源
      最近更新 更多