Ошибки при многооборотном диалоге в навыках alexa

Я создал навык с названием "BuyDog", а его вызов - "приложение для собак".

Это должно означать, что я могу использовать определенные внутри намерения только после того, как будет услышано имя вызова. (это правильно?)

Затем я определил намерения со слотами как:

"what is {dog} price."

"Tell me the price of {dog}."

где слот {dog} относится к типу слота "DogType". Я пометил этот слот как требуемый для выполнения

Затем я добавил конечную точку в лямбда-функцию AWS, где я использовал код чертежа проекта factskills в node.js, и сделал несколько незначительных изменений, чтобы увидеть, как работает.

const GET_DOG_PRICE_MESSAGE = "Here's your pricing: ";

const data = [
    'You need to pay $2000.',
    'You need to pay Rs2000.',
    'You need to pay $5000.',
    'You need to pay INR 3000.',

];
const handlers = {
//some handlers.......................
'DogIntent': function () {
        const factArr = data;
        const factIndex = Math.floor(Math.random() * factArr.length);
        const randomFact = factArr[factIndex];
        const speechOutput = GET_DOG_PRICE_MESSAGE + randomFact;
}
//some handlers.......................
};

В соответствии с кодом, который я ожидал, когда

Я говорю: "Алекса открытое приложение для собак"

Он просто должен быть готов выслушать намерение "какова цена {собака}" и другое. Вместо этого он говорит случайную строку из массива data[] кода node.js. Я ожидал этого ответа после того, как было произнесено намерение, поскольку слот требовался для выполнения намерения. Требовать

И когда

Я говорю: «Откройте приложение для собак и скажите мне цену ХХХХ».

Он спрашивает, «какой породы» (это мой определенный вопрос), но он просто отлично работает и показывает цены

Алекса говорит: «Вот ваша цена: вам нужно заплатить 5000 долларов».

(или другое значение из массива данных) для любого XXXX (т.е. типа собаки или нет). Почему alexa не подтверждает, что слово находится в наборе слотов или нет? < img src = "https://i.stack.imgur.com/25TJX.png" alt = "slot conf">

И когда

Я говорю: «открой собачий лай».

Я ожидал, что Алекса не поймет вопроса, но это дало мне информацию о лае. ПОЧЕМУ? Как это произошло?
Есть ли у Алекси набор навыков по умолчанию? например, поиск в Google / Amazon и т. д.

Я так растерялся. Пожалуйста, помогите мне понять, что происходит?


person RC0993    schedule 06.05.2019    source источник
comment
Можете ли вы опубликовать свой полный код? Я думаю, вы, должно быть, использовали шаблон навыка фактов по умолчанию   -  person Maruthi Adithya    schedule 06.05.2019
comment
Да, я использовал шаблон навыков фактов в лямбда-функции с упомянутыми изменениями.   -  person RC0993    schedule 06.05.2019
comment
@MaruthiAdithya Вы сделали многооборотный диалог с навыком alexa?   -  person RC0993    schedule 07.05.2019


Ответы (2)


Не имея полного кода, чтобы точно видеть, что происходит, и давать ответы по коду, я надеюсь, что простое объяснение ваших проблем / вопросов укажет вам правильное направление.


1. Запуск навыка

Я говорю: «Алекса, открытое приложение для собак».
Оно должно быть готово выслушать намерение ...

Вы ожидаете, что Алекса просто послушает, но на самом деле Алекса раскрывает ваши навыки и ожидает, что на этом этапе вы получите общий приветственный ответ. Alexa отправит запрос на запуск в вашу лямбду. Это отличается от IntentRequest, поэтому вы можете определить это, проверив request.type. Обычно встречается с:

this.event.request.type === 'LaunchRequest'

Я предлагаю вам добавить журналы в свою Lambda и использовать CloudWatch , чтобы увидеть входящий запрос от Alexa:

console.log("ALEXA REQUEST= " + event)

2. Признание стоимости слота

Я говорю: «Откройте приложение для собак и скажите мне цену XXXX».
Почему Алекса не подтверждает, что слово находится в наборе слотов или нет?

Alexa не ограничивает slot значениями слотов, установленными в slotType. Значения, которые вы задаете slotType, используются в качестве ориентировочных, но допустимы и другие значения.

В вашей лямбда-функции вы должны проверить эти значения слотов, чтобы убедиться, что они установлены на принимаемое вами значение. Есть много способов сделать это, поэтому просто начните с определения того, чем заполнен слот. Обычно встречается с:

this.event.request.intent.slots.{slotName}.value;

Если вы решите настроить синонимы в slotType, Alexa также предоставит рекомендованное ей разрешение значений слота. Например, вы можете включить «Ротвейлер» как синоним «Ротвейлера», и Алекса заполнит слот словом «Ротвейлер», но также предложит вам разрешить это как «Ротвейлер».

var resolutionsArray = this.event.request.intent.slots.{slotName}.resolutions.resolutionsPerAuthority;

Опять же, используйте console.log и CloudWatch для просмотра значений слотов, которые Alexa принимает и заполняет.


3. Умышленно не запустить навык

Я говорю: «Открой собачий лай».
Я ожидал, что Алекса не поймет вопроса, но это дало мне факт о лае.

Вы должны делать это за пределами своего Навыка, когда Алекса будет принимать любые входные данные и пытаться распознать активированный навык или справиться с ее наилучшим предположением о способностях по умолчанию.

У Alexa есть встроенные способности по умолчанию (на самом деле, не навыки), чтобы отвечать на общие вопросы, и просто быть веселым и дружелюбным. Вы можете увидеть, на что она способна самостоятельно, здесь: Alexa - что стоит попробовать

Я предполагаю, что Алекса решила, что вы спрашиваете что-то о собачьем лае, и поэтому дала ответ. Вы можете попытаться спросить ее: «Что такое собачий лай» и посмотреть, ответит ли она точно так же, как «открой собачий лай», просто чтобы подтвердить эти подозрения.


Чтобы по-настоящему понять развитие навыков Alexa, вам следует потратить время на очень ознакомление с этой документацией: Alexa Форматы JSON запросов и ответов

person Jay A. Little    schedule 07.05.2019
comment
Это очень проницательно. Я опубликую здесь код .js через несколько часов (у меня сейчас нет пароля к учетной записи AWS), но это хорошо составленный ответ [+1] - person RC0993; 07.05.2019
comment
Рад, что это было полезно, но, честно говоря, это очень большой вопрос. И когда я его разобрал, у вас действительно было 3 разные проблемы, которые могли быть 3 разными вопросами. Так что на вашем месте я бы не стал редактировать этот большой вопрос. Вместо этого возвращайтесь с отдельными проблемами, включите весь связанный код и задавайте новые вопросы по каждой проблеме, с которой вы столкнулись. Так вы должны получать лучшие ответы. Удачи. - person Jay A. Little; 07.05.2019

Вы не публиковали много своего кода, поэтому трудно точно сказать, что вы имели в виду, но обычно для обработки неполных событий у вас может быть неполный обработчик четности, подобный этому:

const IncompleteDogsIntentHandler = {
// Occurs when the required slots are not filled
canHandle(handlerInput) {
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
        && handlerInput.requestEnvelope.request.intent.name === 'DogIntent'
        && handlerInput.requestEnvelope.request.dialogState !== 'COMPLETED'
},
async handle(handlerInput) {
    return handlerInput.responseBuilder
        .addDelegateDirective(handlerInput.requestEnvelope.request.intent)
        .getResponse();
}

вы добавляете этот обработчик прямо над вашим фактическим обработчиком, как правило, в файле index.js вашей лямбды. Это может не решить всех ваших проблем, но поможет вам обработать событие, когда пользователь не упоминает собаку.

person Andrew Jouffray    schedule 07.05.2019