nodejs алекс умение продолжать, пока пользователь не скажет "Стоп" - PullRequest
0 голосов
/ 09 апреля 2020

Я пишу навык Алекса, который возвращает лучшие колледжи по городам. Я хочу, чтобы сессия и навык продолжались до тех пор, пока пользователь не скажет «Стоп». Код для TopCollegesByCityIntentHandler, который принимает название города, выглядит следующим образом:

const TopCollegesByCityIntentHandler = {
    canHandle(handlerInput) {
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
            && handlerInput.requestEnvelope.request.intent.name === 'TopCollegesByCity';
    },
    handle(handlerInput) {
        console.log('handlerInput.requestEnvelope.request', JSON.stringify(handlerInput.requestEnvelope.request));
        let speechText = '';
        const cityName = handlerInput.requestEnvelope.request.intent.slots.cityName.value;

        // logic to get top colleges by city name and modify speechText

        speechText += 'To know top colleges in your city say, top colleges in your city. To stop say, stop.';
        return handlerInput.responseBuilder
            .speak(speechText)
            .withSimpleCard('Top Colleges', speechText)
            .withShouldEndSession(false)
            .getResponse();
    }

Но если пользователь не говорит больше 5-10 секунд, умение умрет, сказав, что «запрошенный навык не отправил действительный ответ ". Как мне продолжить сеанс, пока пользователь не скажет "стоп"?

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Несколько проблем здесь ...

  • Во-первых, я не уверен, почему вы хотите оставить сеанс открытым. Вы не задаете вопрос. (И я рекомендую, чтобы вы этого не делали.)

  • Во-вторых, если вы делаете хотите оставить сеанс открытым, вы должны указать, что будет reprompt be (, который автоматически оставит сеанс открытым, больше не нужно withShouldEndSession).

  • В-третьих, вы должны поместить список колледжей в свою собственную переменную и добавьте это к SimpleCard, а не speechText. т. Е. Нет необходимости в простой карточке для включения фразы "остановить ..."

  • Наконец, если вы отвечаете длинным списком, который Похоже, что вы делаете, вы хотите, чтобы они знали, как остановить это или попросить что-то еще до того, как вы начнете список. (В противном случае им придется прослушать весь список, прежде чем он узнает, что его можно остановить.) Я бы рекомендовал начать с чего-то вроде To know top colleges in your city, say, "Alexa, ask {yourSkillName} for Top Colleges in", and the name of your city. To stop, say "Alexa, stop". Here are the Top Colleges by city: {super long collegeList}. Нет reprompt (потому что вы не хотите, чтобы сессия оставалась открытой). Тогда вы можете положиться на «один выстрел» для обработки других ваших запросов.

Этот дизайн Alexa делает c обрисовывает 8-секундный предел.

Официальный запрос функции UserVoice для установки лимита времени ожидания , если вы хотите добавить свой голос.

0 голосов
/ 09 апреля 2020

Вы не можете держать mi Alexa c открытым более 8 секунд.

Однако я бы предложил использовать метод reprompt, который бы снова задавал вопрос, если пользователь не отвечает в течение первых 8 секунд.

Вот как это будет выглядеть

speechText += 'To know top colleges in your city say, top colleges in your city. To stop say, stop.';
repromptText = 'Say top colleges in your city for the city.';
return handlerInput.responseBuilder
        .speak(speechText)
        .reprompt(repromptText)
        .withSimpleCard('Top Colleges', speechText)
        .withShouldEndSession(false)
        .getResponse();
...