Tweet

2018年12月1日土曜日

【AmazonAlexaスキル開発】インテントのサンプル発話のスロットを表記ゆれに影響されず取得する方法を少しだけ工夫して取っている話

こういう人向け

  • 下記のアクセスで失敗している人
    • intent.slots.stotTypeA.name で取得している人
    • intent.slots.stotTypeA.value で取得している人

    前手条件(説明)

    下記のようなスロットタイプとインテント(サンプル発話1件)があるとします。

    ■スロットタイプ


     ■インテント


    この状況で何故 intent.slots.userNames.valueを取得したら駄目なのか。

    実際のログ貼ってみます。
    これはAlexaシミュレータの左側の出力ログをコピペしたログになります。
    ※長いので色が付いている所だけ流し見してください。

    {
    "version": "1.0",
    "session": {
    "new": false,
    "sessionId": "amzn1.echo-api.session.dummy",
    "application": {
    "applicationId": "amzn1.ask.skill.dummydummydummydummy"
    },
    "user": {
    "userId": "amzn1.ask.account.dummydummydummydummy"
    }
    },
    "context": {
    "System": {
    "application": {
    "applicationId": "amzn1.ask.skill.dummydummydummydummy"
    },
    "user": {
    "userId": "amzn1.ask.account.dummydummydummydummy"
    },
    "device": {
    "deviceId": "amzn1.ask.device.dummydummydummydummy",
    "supportedInterfaces": {}
    },
    "apiEndpoint": "https://api.fe.amazonalexa.com",
    "apiAccessToken": "省略"
    },
    "Viewport": {
    "experiences": [
    {
    "arcMinuteWidth": 246,
    "arcMinuteHeight": 144,
    "canRotate": false,
    "canResize": false
    }
    ],
    "shape": "RECTANGLE",
    "pixelWidth": 1024,
    "pixelHeight": 600,
    "dpi": 160,
    "currentPixelWidth": 1024,
    "currentPixelHeight": 600,
    "touch": [
    "SINGLE"
    ]
    }
    },
    "request": {
    "type": "IntentRequest",
    "requestId": "amzn1.echo-api.request.dummydummydummydummy",
    "timestamp": "2018-12-01T09:59:54Z",
    "locale": "ja-JP",
    "intent": {
    "name": "subUserPoint",
    "confirmationStatus": "NONE",
    "slots": {
    "userNames": {
    "name": "userNames",
    "value": "ユーザー 1",
    "resolutions": {
    "resolutionsPerAuthority": [
    {
    "authority": "amzn1.er-authority.echo-sdk.amzn1.ask.skill.dummydummydummydummy.userNames",
    "status": {
    "code": "ER_SUCCESS_MATCH"
    },
    "values": [
    {
    "value": {
    "name": "ユーザー1",
    "id": "ccc28363fa483331f49945a6f38257e0"
    }
    }
    ]
    }
    ]
    },
    "confirmationStatus": "NONE",
    "source": "USER"
    },
    "amazonNumber": {
    "name": "amazonNumber",
    "value": "5000",
    "confirmationStatus": "NONE",
    "source": "USER"
    }
    }
    }
    }
    }


    上記の差異がわかりますかね、そうです。半角スペースの有無です。
    上(intent.slots.userNames.value):「ユーザー 1」
    下:「ユーザー1」

    たとえば下記のような条件分岐していたら、
    「ユーザー 1」(半角あり)はif文通らないです。

    const  userCheckString =  intent.slots.userNames.value;
    if(userCheckString === "ユーザー1"){
     //書きたい処理
    }

    解決方法

    if(userCheckString === "ユーザー1" || userCheckString === "ユーザー 1")
    こんな何の捻りもなく今後の改修で2倍かかるようなコードは書かないでくださいね。

    修正前:intent.slots.userNames.value
    修正後:intent.slots.userNames.resolutions["resolutionsPerAuthority"][0]["values"][0]["value"]["name"];

    こうやって取得しましょう。[0]に関しては問題ない場合は[0]を使ってください。
    複数ある場合は選択する必要があります。([1]など)

    こうやって書くことによって表記揺れを気にせず書けるよって書き方でした。
    僕はいつもこうやって書いてます。

    intent.slots.userNames.valueが正しい値取れている時も、
    intent.slots.userNames.resolutions["resolutionsPerAuthority"][0]["values"][0]["value"]["name"]
    こちらも生成されるので問題ありません。







    0 件のコメント:

    コメントを投稿