Alexa Skill - Как получить значение слота в лямбда-функции

Я разрабатываю навык Alexa с одним намерением, которое включает в себя слот с несколькими возможными значениями.

Мой слот определяется с помощью "name" : "Channel", "type" : "LIST_OF_CHANNELS" и значений

  1. икрам
  2. Ингрид
  3. Фил
  4. Клайд

Как мне получить произнесенное значение слота для использования в моей лямбда-функции? Это "получить значение слота из части высказывания". Я ищу ответ. Большое спасибо.

 // retrieve value of slot from utterance     
 var c = intent.slots.Channel.value; 

 // append value to end of URL that references API
 fetchEnseParse("/channel/" + c, function(body) {

 // continuation of this function is below 

person Ingrid    schedule 16.01.2017    source источник


Ответы (5)


var c = this.event.request.intent.slots.slotname.value

Это должно дать вам то, что вы ищете.

person Pseuplex    schedule 06.06.2017
comment
Спасибо. Этот маленький фрагмент кода разблокировал меня! Не могли бы вы дать ссылку на документацию, где я могу прочитать больше? Спасибо! - person Kostas Demiris; 04.10.2018

Если ваша лямбда получит, вы можете найти ее здесь ...

{
  "request": {
    "type": "IntentRequest",
    "intent": {
      "name": "YourIntentName",
      "slots": {
        "slotname": {
          "name": "slotname",
          "value": "HERE!"
        }
      }
    },
    "locale": "en-US"
  },
} 

Событие передается вашему обработчику лямбда.

person Tom    schedule 16.01.2017

Для меня сработало следующее:

event.currentIntent.slotDetails.<slot-name>.originalValue

где slot-name равно Channel.

person Bharat Anand    schedule 22.11.2017

Допустим, вы сказали Алексе слово «монета», и вы запрограммировали его как синоним биткойна (основного имени объекта).

Теперь вы можете получить 2 результата.

Во-первых: вы получаете исходное значение «биткойн», которое является исходным значением / сопоставленным значением.

Или во-вторых: вы получаете голосовое значение «монета».

Первый (биткойн):

this.event.request.intent.slots.<yourslotname>.resolutions.resolutionsPerAuthority[0].values[0].value.name

Секунда (монета):

this.event.request.intent.slots.<yourslotname>.value

Внимание: имя вашего слота не соответствует типу слота! Это имя

person chainstair    schedule 10.06.2018
comment
Не уверен, почему здесь -1? У меня сейчас такой же cse. Я расширил один из списков AMAZON (AMAZON.Room) и добавил несколько синонимов для маленькой комнаты (компьютерная комната, игровая комната), поэтому, когда Alexa предоставит мне ценность для моей Lambda, она может предоставить компьютерную комнату, и я не планирую внедрять сопоставление синонимов на уровне Lambda, поэтому я бы точно попытался получить значение от ResolutionPerAuthority - person Mariusz; 04.01.2019
comment
Спасибо @MariuszKarpicki. Я серьезно не знаю, почему я получил здесь -1, но мне повезло, что я смог помочь ✌ - person chainstair; 04.01.2019
comment
здесь я нашел более подробное описание на случай, если кто-то еще захочет прочитать больше: developer.amazon.com/blogs/alexa/post/ - person Mariusz; 06.01.2019

Просто смотреть на this.event.request.intent.slots.<yourslot>.value небезопасно

Это значение имеет только «высказывание», и это может быть не то, что вы ищете.

Мне пришлось глубже вникнуть в объект, посмотреть на объект разрешений и проверить авторитетный объект со статусом code=="ER_SUCCESS_MATCH"

Вот мой java-код, который работал - вы можете сделать то же самое в Nodejs

private String getSlotValue(JSONObject s)
{

    String utterance="";
    String choice ="NA";

  try {

        if(s.has("option"))
        {

        JSONObject optionObject =s.getJSONObject("option");

        utterance =optionObject.getString("value");

        JSONObject resolutionsObject =optionObject.getJSONObject("resolutions");



        JSONArray resolutionsPerAuthority =resolutionsObject.getJSONArray("resolutionsPerAuthority");

        for (int i = 0; i < resolutionsPerAuthority.length(); ++i) {
            JSONObject auth = resolutionsPerAuthority.getJSONObject(i);

            if (auth.getJSONObject("status").getString("code").equals("ER_SUCCESS_MATCH") )

                {
                if(auth.has("values"))
                    {
                    JSONArray  values = auth.getJSONArray("values");

                    choice=values.getJSONObject(0).getJSONObject("value").getString("id");
                    }
                }           

        }

        }

    return choice;

    }
  catch (Exception e) {
   choice="Error "+e.getMessage();
   return choice;
   }
}
person user10112683    schedule 27.07.2018