【Alexa 스킬】 다이얼로그 모델의 슬롯의 검증을 Lambda로 한다

소개



알렉사 스킬 개발 중에 받은 슬롯의 검증을 하고 싶은 장면이 있어 조사했습니다.


이 의도에서는 {option} 슬롯이 필수 항목입니다.
유저는 【물】과 【컵】을 부탁할지, 【물】만 부탁할지의 선택사항이 있습니다.

{option} 없이 인텐트가 호출되면 알렉사는 [컵]도 주문하거나 듣습니다.

슬롯의 변형은 다음과 같습니다.
※ 여기에 【컵】도 들어가 버리는 것이 잘되지 않습니다. 좋은 방법이 있으면 댓글을 달아주세요. . .


alexa developer console에서 유효성 검사 규칙을 설정했지만. . .





테스트해 보면,,,


2회 상정외의 회답을 하면 스킬이 강제 종료해 버렸습니다.
이번 스킬에서는 사용자의 올바른 대답이 있을 때까지 몇번이나 되돌려주었으면 했으므로 곤란합니다.

Lambda로 확인하여 사용자에게 응답을 유도합니다.



드디어 본제입니다.
Alexa측의 검증을 제외해 버려, Lambda측에서 검증을 실시합니다.
const OrderIntentHandler = {
  canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'OrderIntent';
  },
  handle(handlerInput) {
    const { slots } = handlerInput.requestEnvelope.request.intent;

    if (slots.option.resolutions["resolutionsPerAuthority"][0]["status"]["code"] != 'ER_SUCCESS_MATCH') {
      return handlerInput.responseBuilder
        .speak('答えは「はい」か「いいえ」でお願いします。キャンセルする場合は「キャンセル」と言ってください。')
        .addElicitSlotDirective('option')
        .getResponse();
    }
    const option = slots.option.resolutions["resolutionsPerAuthority"][0]["values"][0]["value"]["id"];
    // 本来の処理は省略
    return handlerInput.responseBuilder
      .speak('ご注文を承りました。')
      .withShouldEndSession(true)
      .getResponse();
  }
};

우선 slots.option.resolutions["resolutionsPerAuthority"][0]["status"]["code"] != 'ER_SUCCESS_MATCH' 로 슬롯에 들어간 단어가 상정하고 있는 바리에이션의 동의어인가 어떤가를 판정합니다.
사용자에게 다시 말하도록 하려면 .addElicitSlotDirective('option')를 호출합니다.option는 슬롯 이름입니다.

또, 동의어로 ID를 설정하고 있는 경우는 slots.option.resolutions["resolutionsPerAuthority"][0]["values"][0]["value"]["id"] 로 일의의 ID를 취득할 수 있으므로 여러가지 말회가 상정되는 경우는 편리합니다.

이제 여러 번 사용자에게 말을 촉구할 수 있었습니다!


결론



더 예쁜 모양이 있을 것 같지만 우선은 실현하고 싶을 수 있었습니다.
앞으로 더 건간 만져 가려고 생각합니다.

좋은 웹페이지 즐겨찾기