Cake Time:

Construa uma Skill engajadora

Coletando variáveis uma a uma através de delegação automática

Na seção anterior, você criou uma skill Alexa que diz: “Olá! Bem-vindo a Cake Time. Veja como é fácil utilizar essa skill! Tchau!” Nesta seção, você tornará a skill mais útil, solicitando o aniversário do usuário. Quando o usuário responder, a skill entenderá e repetirá o aniversário do usuário.

Para fazer isso, você precisará usar enunciados, intenções e variáveis. Você também aprenderá como usar o gerenciamento de diálogo para que sua skill faça perguntas de acompanhamento automaticamente para coletar as informações necessárias. Por exemplo, se o usuário disser "eu nasci em 12 de julho", o gerenciamento de diálogo perguntará automaticamente ao usuário em que ano ele nasceu.

No final deste módulo, sua skill Cake Time será capaz de:

  • Fazer uma pergunta ao usuário
  • Escutar a resposta
  • Responder ao usuário

 

Use o Console do Portal dos Desenvolvedores de Alexa para este módulo. Faça login no console e abra a skill Cake Time.

Passo 1: peça o aniversário do usuário

Por hora, a skill simplesmente cumprimenta o usuário e sai. A mensagem de boas-vindas ajuda a definir o contexto da interação - o usuário sabe que está interagindo com a Cake Time. Agora você precisa capturar o aniversário do usuário para, eventualmente, calcular o número de dias até seu próximo aniversário. Para fazer isso, atualize a skill com a lógica de programação que instrui a Alexa a solicitar o aniversário do usuário.

a. No console do desenvolvedor, clique na guia Code (Código)

code nav link screenshot

Encontre o LaunchRequestHandler. Dentro do handler, a variável speechText é passada para a função .speak (). Na próxima etapa, atualize a string para solicitar o aniversário do usuário.

b. Dentro do LaunchRequestHandler, na função handle (), encontre a linha que começa com const speechText. Substitua essa linha pelo seguinte:

const speechText = 'Olá! Bem-vindo a Cake Time. Quando é seu aniversário?';

Agora, lembre-se de que, depois que a Alexa responder, a skill será encerrada. Você precisa dizer a Alexa para ouvir o usuário para que possa responder. Para fazer isso, você usará a função .reprompt (), que você apagou anteriormente.

const LaunchRequestHandler = {

    canHandle(handlerInput) {

        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'LaunchRequest';

    },

    handle(handlerInput) {

        const speakOutput = 'Hello! Welcome to Caketime. What is your birthday?';

c. No LaunchRequestHandler, na função handle (), remova a barra dupla (//) antes da função .reprompt ().

reprompt

A função .reprompt () faz duas coisas:

  • Diz à skill para aguardar a resposta do usuário, em vez de simplesmente sair
  • Permite especificar uma maneira de fazer a pergunta novamente ao usuário, caso ele não responda

Uma prática recomendada é tornar o texto de reprompt diferente do texto de fala inicial.

O usuário pode não ter respondido por vários motivos. A skill deve refazer a pergunta, mas de maneira natural. O reprompt deve fornecer mais contexto para ajudar o usuário a fornecer uma resposta. Especifique o texto de reprompt criando uma nova variável denominada repromptText.

 

d. Dentro do LaunchRequestHandler, na função handle (), encontre a linha que inicia const speechText. Crie uma nova linha abaixo dela, clicando no final da linha e pressionando ENTER.

e. Copie e cole o seguinte código na nova linha: const repromptText = 'Nasci em seis de novembro de dois mil e quatorze. Quando você nasceu?';

   handle(handlerInput) {

        const speakOutput = 'Hello! Welcome to Caketime. What is your birthday?';

        const repromptText = 'I was born Nov. 6th, 2014. When were you born?';    

 

        return handlerInput.responseBuilder

Observe que o reprompt fornece um exemplo do que a Alexa espera que o usuário diga, fazendo com que a Alexa dê seu próprio aniversário no formato que ela está procurando. Fornecer exemplos como esse é uma prática recomendada.

Observe que os números estão escritos no texto de reprompt. Você pode usar a Speech Synthesis Markup Language (SSML) para que a Alexa leia "2014".

Agora você deseja que o código passe a variável repromptText para a função .reprompt ().

 

f. Dentro do LaunchRequestHandler, na função handle (), substitua .reprompt(speechText) por .reprompt(repromptText)

A função handle () dentro do LaunchRequestHandler deve agora se parecer com o seguinte:

    handle(handlerInput) {

        const speakOutput = 'Hello! Welcome to Caketime. What is your birthday?';

        const repromptText = 'I was born Nov. 6th, 2014. When were you born?';    

 

        return handlerInput.responseBuilder

            .speak(speakOutput)

            .reprompt(repromptText)

            .getResponse();

Existe uma complicação potencial em pedir ao usuário seu aniversário. Eles podem responder de muitas maneiras diferentes. Por exemplo, o usuário pode fornecer apenas o mês e o dia ou pode dizer algo como "Próxima terça-feira".

Neste curso, você não lidará com todas as maneiras diferentes nas quais um usuário pode responder, mas nós o desafiamos a levar isso em consideração quando você terminar o curso. Vamos nos concentrar em uma maneira de garantir que a Alexa seja capaz de coletar o mês, dia e ano do usuário.

Antes de prosseguir, salve e implemente seu código atualizado.

g. Clique Save (Salvar).

save button

h. Clique Deploy (Implementar)

deploy button

Adquira o hábito de salvar e implementar suas alterações regularmente para garantir que você não perca nada. Salve conforme for evoluindo!

A skill Cake Time agora pode perguntar e ouvir, mas não pode responder ainda. Você precisa atualizar o front-end da skill antes de testá-la. Especificamente, você precisa criar uma intenção de interpretar a resposta do usuário à pergunta da skill.

Passo 2: use uma intenção e variáveis para capturar informações

Agora faça alguns ajustes no front-end da skill. Especificamente, você precisa criar uma intenção que interprete como o usuário responde à pergunta de Alexa.

Quando você nomear uma intenção, pense sobre o que a intenção vai fazer. Nesse caso, a intenção é capturar a data de nascimento do usuário, então nomeie-a como CaptureBirthdayIntent. Observe que as palavras não estão separadas por espaços e cada nova palavra começa com uma letra maiúscula.

a. Clique na guia Build (Criar).

 

b. À direita de Intents, clique em Add (Adicionar). A janela Add Intent (Adicionar Intenção) é aberta.

add intent screenshot

c. Selecione Create Custom Intent (Criar Intenção Customizada) e insira o seguinte texto para o nome da intenção: CaptureBirthdayIntent

add intent screenshot

d. Clique Create Custom Intent (Criar Intenção Customizada). A intenção é criada.

Lembre-se de que uma intenção é uma ação para atender a solicitação de um usuário. Um enunciado é o que invoca a intenção. Em resposta à pergunta de aniversário, um usuário pode dizer: "Eu nasci em sete de novembro de mil novecentos e oitenta e três." Você adicionará esse enunciado ao CaptureBirthdayIntent digitando-o exatamente da maneira que o usuário deve dizê-lo.

e. No campo Sample Utterances (Amostra de Enunciados) , digite o seguinte e pressione ENTER ou clique no ícone +: Eu nasci em sete de novembro de mil novecentos e oitenta e três

Observe que o texto não inclui pontuação.

add intent screenshot

Quando terminar, a skill Cake Time será capaz de capturar qualquer aniversário.

Nesse enunciado, existem três informações-chave para coletar: mês, dia e ano. Estes são chamados de slots (variáveis). Você precisa informar a Alexa quais palavras são slots e que tipo de slots elas são.

Comece com a variável do mês. No enunciado, você substituirá a palavra que representa o mês (novembro) pela palavra mês entre chaves ({}). Isso cria uma variável chamada mês. O enunciado será então assim: Eu nasci sete de {mês} de mil novecentos e oitenta e três.

Existem duas maneiras de criar um slot. A primeira maneira é selecionar a palavra na expressão da amostra onde a variável deve ir e digitar o nome da variável entre chaves (por exemplo, {mês}).

A segunda maneira é selecionar a palavra na expressão de amostra e usar a caixa de diálogo Select an Existing Slot (Selecionar um Slot Existente) quando ela aparecer. Na caixa de diálogo, clique no campo em Create a New Slot (Criar um Novo Slot), digite o nome da variável sem chaves (por exemplo, mês) e clique em Add (Adicionar).

intents screenshot

f. No enunciado, use qualquer um dos métodos para criar um slot chamado mês sobre a palavra Novembro.

 

g. Repita este processo para as outras variáveis (dia e ano).

Seu enunciado deve ser assim: Eu nasci em {dia} {mês} {ano}

E se o usuário omitir as palavras eu nasci? Responda adicionando um segundo enunciado apenas com as variáveis.

h. No campo Sample Utterances, digite o seguinte, e depois aperte ENTER ou clique no ícone + : {dia} {mês} {ano}

add intent screenshot

Ao digitar uma amostra de enunciado, você pode precisar pressionar ENTER duas vezes para que o enunciado seja adicionado. Você também pode clicar no ícone +.

Agora, você deve levar em consideração algumas outras combinações possíveis de variáveis.

i. Digite cada um dos exemplos abaixo como amostras de enunciados. Quando você terminar, você deve ter seis enunciados.

{dia} {mês}
{dia} {mês} {ano}
{mês} {ano}
Eu nasci {dia} {mês}
Eu nasci {dia} {mês} {ano}
Eu nasci em {mês} {ano}

Você deixou a Alexa saber quais variáveis precisam ser coletadas (e cobriu alguns dos diferentes padrões em que os usuários podem fornecer essas informações). Agora você precisa definir exatamente quais são essas variáveis atribuindo um tipo de variável a cada slot.

Role a página para baixo até Intent Slots (Variáveis de Intenção). Esta área exibe as variáveis (slots) que você criou.

intent slots screenshot

Slots são atribuídos a partir do menu suspenso Slot Type (Tipo de Variável) à direita de cada slot.

Existem dois tipos de slots: personalizadas (custom) e embutidas (built-in). Sempre que possível, use slots de built-in. A Alexa gerencia as definições das variáveis de built-in. Essas começam com AMAZON seguido pelo que elas definem (por exemplo, AMAZON.Month).

Se uma variável de built-in adequada não existir, crie uma personalizada e defina os valores que ela representa. Nesse curso, você só usará slots de built-in.

intent slots screenshot

j. A direita da variável mês, selecione AMAZON.Month no menu drop-down de Slot Type.

k. Para a variável dia, selecione AMAZON.Ordinal como o tipo de slot.

l. Para a variável ano, selecione AMAZON.FOURDIGITNUMBER como tipo de variável.

month day year slots

Você criou uma intenção de coletar a data de nascimento do usuário.

Mas e um usuário que não responde com todos os três valores de slot? Por exemplo, um usuário que responde apenas "em julho". Vamos dar uma olhada em como resolver esse problema.

m. Na parte superior da página, clique em Save Model (Salvar Modelo).

save model button

Passo 3: Use o gerenciamento de diálogos

Slots podem ser mandatórias ou opcionais. Ou seja, se você precisar de um determinado valor do usuário, poderá designar uma variável como mandatória, usando o gerenciamento de diálogos. Marcar uma slot (variável) como mandatória aciona a Alexa para trabalhar ativamente para preenchê-la. Comece transformando as variáveis em requisitos obrigatórios.

a. Na seção Intent Slots, à direita da variável mês, clique em Edit Dialog.

b. Em Slot Filling, arraste a barra para tornar essa variável obrigatória.

slot filling screenshot

O campo Alexa speech prompt aparece. Aqui, você digitará um texto para Alexa dizer caso o usuário não forneça um valor para a variável mês.

c. No campo, digite em que mês você nasceu? e, em seguida, pressione ENTER ou clique no ícone +.

slot filling screenshot

d. Repita o processo para as slots de dia e ano.

Nota: Volte para a tela onde você inseriu as amostras de enunciado clicando em CaptureBirthdayIntent no painel esquerdo.

Agora que as variáveis são mandatórias, se um usuário responder, "julho de mil novecentos e oitenta e dois", a Alexa reconhece que as variáveis do mês e do ano estão preenchidas, mas a do dia não.

Alexa irá solicitar do usuário cada variável não preenchida. Neste exemplo, Alexa perguntaria: "Em que dia você nasceu?"

Uma das grandes coisas sobre o gerenciamento de diálogos é que a skill não quebra ou fica confusa se o usuário deixa de fora uma informação ou a fornece fora da ordem esperada. Em vez disso, Alexa assume a responsabilidade de coletar informações designadas conforme necessário para garantir uma experiência útil e agradável.

Você criou uma intenção que ouve a resposta do usuário para a pergunta de aniversário. Quando o usuário responde, a Alexa coleta o mês de aniversário, o dia e o ano do usuário. Essas informações serão enviadas para o código de back-end da skill em um JSON request.

Antes de prosseguir, observe a intenção da HelloWorld no painel da esquerda. Isso é uma sobra do modelo inicial que você não precisa.

e. Exclua a intenção HelloWorldIntent clicando no ícone da lixeira à direita dela. Quando solicitado, clique em Delete Intent (Excluir Intenção).

Tenha cuidado para excluir o HelloWorldIntent e não o CaptureBirthdayIntent.

helloworldintent screenshot

Você pode perceber que outras intenções (como AMAZON.HelpIntent) foram adicionadas automaticamente à sua skill. Elas são necessárias para todas as skills e fornecem ao usuário meios para cancelar, parar e obter ajuda. Não remova estas.

f. No topo da página, clique em Save Model (Salvar Modelo)

save model button

g. Clique em Build Model (Criar Modelo).

build model button

Quando você clica em Build Model, sua skill começa a construir os dados de treinamento que ajudarão a Alexa a saber como mapear o que o usuário diz para as intenções da sua skill. Pode levar um minuto para o modelo ficar pronto.

Neste ponto, sua skill pode perguntar e escutar. Agora, faça a responder.

Passo 4: defina um novo handler

Para fazer a skill Cake Time responder, você precisa atualizar o back-end.

a. Clique na guia Code (Código).

code nav link screenshot

Lembra de ter modificado o LaunchRequestHandler? Desta vez, você irá construir um novo handler. Esse handler reconhecerá que o usuário forneceu seu aniversário e repete o aniversário de volta para o usuário.

Se você olhar o código, você notará o HelloWorldIntentHandler. Mas você apagou o HelloWorldIntent, certo? Não inteiramente. A intenção desapareceu do front-end, mas o handler do back-end ainda está lá. Você precisa de um novo handler, portanto, facilite as coisas e reutilize esse handler para um novo handler chamado CaptureBirthdayIntentHandler.

b. Encontre a linha que começa com const HelloWorldIntentHandler. Nessa linha, renomeie HelloWorldIntentHandler para CaptureBirthdayIntentHandler.

c. No CaptureBirthdayIntentHandler, na linha que inicia o && handlerInput, altere 'HelloWorldIntent' para 'CaptureBirthdayIntent'

Essa alteração garante que a função canHandle () seja invocada quando uma solicitação CaptureBirthdayIntent for recebida. O código do handler deve agora se parecer com o seguinte:

4-4c

Agora você precisa atualizar a lógica dentro do handler para que a Alexa confirme ao usuário que ela ouviu seu aniversário. Nesse caso, você terá a Alexa lendo o aniversário de volta para o usuário, assim: "Obrigado, lembrarei que você nasceu em {dia} {mês} {ano}".

Comece criando três variáveis no handler para salvar as variáveis que a skill está coletando.

d. Dentro do CaptureBirthdayIntentHandler, localize a linha que começa com handle(handlerInput) {. Crie uma nova linha abaixo dela.

e. Copie e cole o seguinte código na nova linha:

const year = handlerInput.requestEnvelope.request.intent.slots.year.value;
const month = handlerInput.requestEnvelope.request.intent.slots.month.value;
const day = handlerInput.requestEnvelope.request.intent.slots.day.value;

O código do handler deve agora se parecer com o seguinte:

4-4e

Em seguida, atualize o speechText. Para fazer isso, use a interpolação de string. Isso permite que você elimine as novas variáveis em uma cadeia de texto. Aqui está um exemplo de interpolação de string:

`Parece que você nasceu em $ {mês}\

Isso é semelhante a uma declaração de slot, mas há duas diferenças. Primeiro, observe o cifrão ($) antes das chaves ({}). Em segundo lugar, a instrução é encapsulada em crase (`) em vez de aspas simples ou duplas.

f. Dentro do CaptureBirthdayIntentHandler, na função handle (), encontre a linha que começa com const speechText. Substitua essa linha pelo seguinte código:

const speechText = `Obrigado, lembrarei que seu aniversário é $ {mês} $ {dia} $ {ano}.`;

Você está quase terminando. Lembra de ter alterado o HelloWorldIntentHandler para CaptureBirthdayIntentHandler? Em todas as skills que usam o SDK, há um local para notificar o SDK dos handlers disponíveis. Isso é chamado de registro. Atualize o código para registrar o novo handler.

g. Role para baixo no código até encontrar a linha que inicia com exports.handler.

Sob esta linha, observe a função .addRequestHandlers (). Dentro dessa função, observe a lista de handlers da skill. HelloWorldIntentHandler está listado e você precisa alterá-lo para CaptureBirthdayIntentHandler. Caso contrário, a skill dará erro.

h. Dentro da função .addRequestHandlers (), substitua HelloWorldIntentHandler por CaptureBirthdayIntentHandler

Certifique-se de deixar a vírgula (,) após CaptureBirthdayIntentHandler quando fizer a substituição.

O código do handler deve agora se parecer com o seguinte:

4-4h

i. Clique em Save (Salvar).

save button

j. Clique em Deploy (Implementar). Por causa do novo handler, sua skill levará alguns minutos para ser implementada.

deploy button

Passo 5: Teste sua skill

É hora de testar! A skill Cake Time agora deve ser capaz de fazer o seguinte:

  • Perguntar ao usuário por seu aniversário
  • Ouvir a resposta do usuário e fazer perguntas adicionais se houver alguma variável (dia, mês, ano) faltante
  • Responder ao usuário repetindo seu aniversário

Vamos testar a skill!

a. Clique na guia Test (Teste)

Lembre-se de que você pode testar digitando o que o usuário diria na caixa no canto superior esquerdo ou pode falar com a skill clicando e segurando o ícone do microfone e falando.

b. Teste sua skill abrindo Cake Time e respondendo quando a Alexa pedir seu aniversário.

test screenshot

Se você estiver testando, digitando o que o usuário diria, escreva os números (por exemplo, sete de novembro de mil novecentos e oitenta e três). Caso contrário, os números não serão compreendidos. Você deve ter notado que os números foram propositadamente escritos por extenso ao longo do curso. Este é o único requisito ao digitar. Se você fala com a skill, os números são convertidos automaticamente.

Alexa deve responder com "Obrigado, lembrarei que seu aniversário é {dia} {mês} {ano}".

Vá em frente e teste o que acontece se você fornecer apenas o ano, o ano e o dia, ou outras combinações. Alexa deve pedir-lhe qualquer valor de slot que você omitir.

Resumo

Neste ponto, sua skill se tornou um pouco mais útil. A skill agora pode pedir ao usuário sua data de aniversário e repetí-la. Parabéns!

No entanto, apesar de sua skill poder pedir o aniversário de um usuário, sua skill ainda não se lembra da mesma a próxima vez que um usuário tentar utilizá-la. Para uma melhor experiência, o ideal seria se a Cake Time se lembrasse do aniversário do usuário. Na próxima seção, você aprenderá como fazer com que sua skill tenha memória.

Código

Se sua skill não estiver funcionando ou se você estiver recebendo algum tipo de erro de sintaxe, faça o download da amostra de código de trabalho a seguir. Vá para a guia Code (Código) no Console do Portal dos Desenvolvedores de Alexa e copie e cole o código no arquivo index.js. Certifique-se de salvar e implementar o código antes de testá-lo.