Ошибки с многооборотным диалогом в навыках Алексы - PullRequest
0 голосов
/ 06 мая 2019

Я создал навык с именем "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.......................
};

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

Я говорю: "Alexa open dog app"

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

А когда

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

Он спрашивает "какая порода" (это мой определенный вопрос) Но он просто отлично работает и показывает цену

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

(или другое значение из массива данных) для любого XXXX (то есть типа собаки или не собаки). Почему Алекса не подтверждает, что слово в слоте установлено или нет? slot conf

А когда

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

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

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

Ответы [ 2 ]

1 голос
/ 07 мая 2019

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


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

Я говорю: "Alexa open dog app"
Он должен быть просто готов выслушать намерение ...

Вы ожидаете, что Алексапросто послушайте, но на самом деле Alexa открывает ваши навыки и ожидает, что вы получите общий приветственный ответ на этом этапе.Alexa отправит Запрос на запуск на вашу Lambda.Это отличается от 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 также предоставит ей рекомендуемые значения разрешения слотов.Например, вы можете включить «Ротти» в качестве синонима «Ротвейлер», и Алекса заполнит слот «Ротвейлером», но также предложит вам разрешить это слово в «Ротвейлере».console.log и CloudWatch для просмотра значений слотов, которые принимает и заполняет Alexa.


3.Целенаправленно не запускают навык

Я говорю: "открой собачью кору".
Я ожидал, что Алекса не поймет вопрос, но это дало мне факт насчет лая.

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

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

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


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

0 голосов
/ 07 мая 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 вашей лямбды Это может не решить все ваши проблемы, но поможет вам справиться с событием, когда пользователь не упоминает собаку.

...