Alexa – desenvolvimento para assistente virtual

Estamos no meio de 2019 e acredito que boa parte das pessoas já ouviram falar na Alexa. Se você não ouviu, não se preocupe, que em breve você vai ouvir bastante.

O Alexa é um serviço de voz baseado em cloud que permite que você execute tarefas como por exemplo:

  • Pedir que toque uma música no spotify
  • Perguntar como está o trânsito até o seu destino antes de sair de casa
  • Montar uma lista de compra e enviar para o seu e-mail

Parece muito legal não? mas porque você nunca ouviu falar ou nunca deu muita atenção para a Alexa ?

Eu não sei, mas vou tentar adivinhar: é porque a Alexa não falava português.

Nos EUA por exemplo, uma estatística de setembro de 2018, diz que 25% das casas americanas possuem um assistente de voz como o Alexa. Claro que existem outros concorrentes como o google assistant e a siri como podem ver na linha do tempo abaixo

O Echo é o dispositivo que você compra pra colocar em sua casa, ele que se comunica com a Alexa. Ó mesmo ocorre com o google home que utiliza o google assistant e o homePod da apple com a siri.

Esses assistentes de voz não são muito populares no Brasil, muito por conta do suporte a nossa língua, mas uma vez que esse suporte seja oferecido com qualidade por big players, não há motivo para pensar que não vamos introduzir esses dispositivos em nossas vidas.

Agora vamos a notícia boa. O suporte ao português brasileiro foi liberado no início de 2019!

E como isso afeta nós desenvolvedores ? Filhos da Internet, os Não usuários, Pais de códigos legíveis e ilegíveis, Reis da Cloud, do On Premise e dos Primeiros bugs, Senhores das Sete linguagens, Khaleesi das integrações

Sempre que uma tecnologia se torna acessível a um público, grandes oportunidades surgem e é ai que nós entramos. Vamos ver como podemos utilizar este recurso para criarmos novas soluções.

um novo começo

Desenvolver uma aplicação baseada em voz muda bastante a forma como você modela a sua solução, é preciso pensar nesse tipo de interação e o que funciona e não funciona.

Uma interface de voz não deve ser projetada da mesma forma que você projeta um sistema web ou um app para smartphone. Vamos ver dois cenários para pensar sobre isso

cenario 1

Você está num metrô lotado e lembra que precisa passar no mercado para comprar algumas coisas, você abre o assistente e começa a falar em voz alta LARANJA, BANANA, FEIJÃO, ARROZ, CEBOLA, INHAME, BATATA … acho que a maioria de nós, ficaria constrangido ao ficar dividindo as suas tarefas com todos os passageiros do seu vagão. No Brasil então, a chance de um engraçadinho gritar CERVEJA e PICANHA nessa hora é bem grande 🙂

cenario 2

Você está sozinho em seu carro dirigindo e ele possui um assistente virtual embutido no software do painel. Você então lembra que precisa fazer compras, mesma situação do metrô, mas agora em seu carro. Nesse momento você nem precisa usar as mãos, você monta a sua lista com a assistente, pede pra ela enviar pra você por e-mail e ainda pede pra ela adicionar na rota do GPS o mercado que você faz compras.

Os dois cenários acima, servem para você pensar em que situação o seu usuário iria utilizar o assistente de voz. Qual a melhor maneira de abordar essas interação ? Da mesma forma que pensamos em UX para construir soluções para web e apps, temos o voice UX para nos ajudar a definir esse caminho.

Nem toda ideia ou negócio serve para esse tipo de interação, veja esse vídeo abaixo de um comercial da amazon no superbowl mostrando projetos que não deram certo com a alexa (em inglês). Claro que se trata de uma brincadeira 🙂

Eu costumo me deparar frequentemente com esse tipo de situação, onde as pessoas escolhem a tecnologia e tentam aplica-la ao seu negócio, quando deveria ser o contrário. Normalmente isso ocorre por hype ou apego. Um bom exemplo disso é o blockchain que é uma tecnologia incrível, mas com um nicho bastante restrito.

Agora se você possui um negócio ou ideia que se aplica muito bem em um assistente virtual, o resto do artigo vai te ajudar bastante a pensar e construir essa solução.

Alexa, vamos em frente!

Falando com a Alexa

Vamos utilizar a frase abaixo como exemplo para o restante do artigo. Nesta frase pedimos a alexa que pergunte ao setor de pedidos se estamos tendo algum atraso nas entregas.

WAKE UP

A Alexa fica em standby sempre que está ligada. Ela fica neste modo aguardando que você diga a palavra mágica “Alexa”. A partir daí, tudo o que você disser posteriormente ela passa a interpretar como um comando.

FRASE INICIAL

Logo após o wake up deve ser informada a frase inicial (starting phrase) para indicar que tipo de requisição está sendo feito. No nosso exemplo a frase inicial é “pergunte”

SKILL NAME (invocation name)

o terceiro item da estrutura é o nome da skill que será utilizada (vamos ver isso mais a frente). Em nosso exemplo a skill chamasse “Setor de Pedidos” e ela será responsável por tratar as informações deste setor da empresa.

Toda skill que você desenvolve possui uminvocation name único.

INTENTS (intenções)

Em nosso exemplo estamos querendo saber do setor de pedidos se existe algum atraso nas entregas. “Saber se existe um atraso” é a intenção do usuário que aciona a alexa, então neste caso teríamos uma Intent com o nome AtrasoIntent

O uso de Intents aqui é bem semelhante a construção de um chatbot utilizando o watson assistant da IBM. Artigo que já abordamos anteriormente.

Uma skill possui N Intents associadas.

UTTERANCES

Para que a skill identifique qual Intent está sendo chamada, é necessário associar um número X de expressões a intent, como a do nosso exemplo “se estamos com algum atraso”. Poderíamos adicionar outras como “se existe atraso” ou “sobre o atraso nas entregas”.

Cada expressão é chamada de UTTERANCE e são diferentes formas de se expressar para conseguir o mesmo objetivo

Alexa Developer

Vamos iniciar agora a construção da solução. Paraódesenvolver soluções para alexa é necessário criar uma conta de developer na amazon. Pode fazer o cadastro clicando nesse link caso ainda não tenha.

Após o cadastro acesso o endereço developer.amazon.com/alexa.

No menu superior a direita onde está escrito “Your Alexa Consoles”, selecione a opção Skills

Você será direcionado para fazer o login da área de developer do alexa. Informe o seu login e senha e clique em Sign In

Após o login você será direcionado para a área Alexa Skill Kit, onde gerenciamos e criamos as nossas skills

Criando uma Skill

Clique no botão Create Skill e informe o nome da skill “SetorPedidoSkill“. Selecione o idioma Portugues (BR) e marque a opção Custom e Provision your own. Clique em Create Skill para finalizar a construção

Após a criação da skill, você será direcionado para a seguinte interface que a princípio parece bem confusa

Nesta tela existem diversos links, documentações e instruções para que você aprenda a desenvolver para o Alexa, caso queira se aprofundar mais ao terminar este artigo, é um ótimo ponto de partida, pois a documentação é excelente.

invocation (nome da invocação)

Com a skill criada, começamos sempre informando o nome de invocação, que é a frase identificada pela Alexa que serve como gatilho para a sua skill.

Clique em Invocation, informe o nome setor de pedidos e em seguida clique em Save Model

no momento nós temos uma skill que pode ser identificada pelo alexa ao pronunciar “setor de pedidos”, mas não sabemos o que fazer ainda com essa informação. É o que vamos fazer agora com as intents.

Intents

Ao interagir com a Alexa fazendo uma pergunta ao setor de pedido, nós podemos ter várias intenções, como por exemplo:

  • saber se estamos com algum atraso
  • informações sobre o volume de pedidos na ultima hora
  • obter o status de algum pedido

para cada uma das intenções acima, nós precisamos criar uma Intent. É o que vamos fazer agora para saber se existe algum pedido em atraso.

No menu a esquerda, embaixo de intents, já existem 4 intents criadas por padrão para atender interações básicas com a alexa. Essa intenções estão vazias e podem ser utilizadas para melhorar a experiencia de uso da skill

Vamos lá, clique em Add e informe o nome da sua intent como AtrasoIntent.

Após clicar em Create Custom Intent, você será direcionado para o gerenciamento de Utterances da Intent

Utterance

Uma Utterance é uma expressão utilizada para identificar uma intenção, e como nós podemos nos expressar de diversas formas, uma Intent precisa de um conjunto de Utterances para que a experiencia seja a melhor possível para o usuário.

Em nosso exemplo neste artigo, usamos a frase “Alexa, pergunte ao setor de pedidos se estamos com algum atraso“. A utterance é toda expressão que vem após o nome de invocação da skill, no caso setor de pedidos.

Nossa primeira utterance então será: se estamos com algum atraso

Como podemos nos expressar de outras formas, vamos cadastrar também as utterances abaixo

  • existe algum pedido atrasado
  • se temos atraso
  • informações sobre atraso
  • sobre os atrasos nos pedidos
  • se existe algum atraso

Fique a vontade para cadastrar mais expressões, não existe um número limite para isso. Apenas para ter como base, um número razoável de Utterances por Intent deve ter de 10 a 15 expressões.

Após informar as utterances, clique em save model e em seguida em build model

Após clicar em build model, o modelo de machine learning da alexa para a sua skill será treinado e isso leva algum tempo que conforme o tamanho da sua skill pode levar alguns minutos.

Nosso modelo do alexa está finalizado, temos uma skill com invocation name e uma intent que identifica uma intenção de um usuário para receber informações sobre atraso de pedido. Agora nós vamos linkar essa intent ao nosso backend

backend

Para construir nosso backend vamos utilizar uma estrutura 100% serverless e para isso vamos utilizar o recurso de lambda functions da AWS. Não vamos nos aprofundar sobre como criar lambda functions, pois isso já foi feito no artigo AWS Experience. Caso não conheça, é bom dar uma parada por aqui e ler esse artigo.

Um detalhe importante é que a alexa no momento em que escrevo esse artigo, enxerga somente as regiões abaixo. Caso crie uma função lambda fora dessas regiões, não será possível conectar ao Alexa.

  • US East (N. Virginia)
  • US West (Oregon)
  • EU (Ireland)
  • Asia Pacific (Tokyo)

Ao criar uma função lambda, certifique-se de selecionar a opção Browse serverless app repository e então escolher o app de exemplo alexa-skills-kit-nodejs-factskill, que é um template para interação com skills da alexa.

Na tela seguinte, informe o nome da sua aplicação, que estamos chamando de alexaCodechain e clique em deploy.

AApós o deploy você vai perceber que foram gerados 3 recursos pelo cloud formation da AWS. O primeiro dos 3 recursos é a nossa função lambda, clique nela e vamos ver o a nossa função.

Ao acessar a interface da função lambda, vemos que o alexa skill kit já aparece integrado como gatilho para chamar a função

No index.js, cole o código abaixo completo. Ele está todo comentado informando o que faz cada handler do nosso backend.

[cc lang=”javascript”]

const Alexa = require(‘ask-sdk-core’);

//cada uma das constantes abaixo são um handler para processar cada tipo de interação com a Alexa.

/*
Este handler é para tratar requisições do tipo LaunchRequest, que são
requisições que nidentificam a skill, mas não possuem utterances.
*/
const LaunchRequestHandler = {

canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === ‘LaunchRequest’;
},
handle(handlerInput) {

// Nossa skill vai receber um LaunchRequest quando um usuario invocar a skill
// atraves do seu invocation name, mas não informar nenhuma utterance
// Exemplo, “Alexa, pergunte ao setor de pedidos”

const textOutput = ‘Já estamos conectados ao setor de pedidos, o que você precisa?’;

// o ResponseBuilder gera o JSON que será retornado a Alexa
return handlerInput.responseBuilder
.speak(textOutput) // O texto passado para o metodo speak é o que será dito pela Alexa.
.getResponse();
},
};

/*
Este handler nos criamos para tratar a interação com a nossa intent de atraso.
*/
const AtrasoHandler = {

canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === ‘IntentRequest’
&& handlerInput.requestEnvelope.request.intent.name === ‘AtrasoIntent’;
},
handle(handlerInput) {

// este é o texto que a alexa vai responder quando for detectada
// a intent de AtrasoIntent

const textOutput = ‘Não temos nenhum pedido em atraso no momento. Nossas operações estão a todo vapor capitão. com exceção do Renan, que está dormindo desde que chegou.’;

// o ResponseBuilder gera o JSON que será retornado a Alexa
return handlerInput.responseBuilder
.speak(textOutput) // O texto passado para o metodo speak é o que será dito pela Alexa.
.getResponse();
},
};

/*
Os handlers abaixo são para tratar as intents basicas que foram geradas na criação da nossa skill.
No caso do helper, sao intenções que o usuario questiona a alexa o que pode fazer.
*/
const HelpHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === ‘IntentRequest’
&& handlerInput.requestEnvelope.request.intent.name === ‘AMAZON.HelpIntent’;
},
handle(handlerInput) {

const textOutput = ‘Você pode perguntar para mim sobre os status dos pedidos’;

return handlerInput.responseBuilder
.speak(textOutput)
.getResponse();
},
};

/*
Este handler é para identificar um fim de processo.
*/
const CancelAndStopHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === ‘IntentRequest’
&& (handlerInput.requestEnvelope.request.intent.name === ‘AMAZON.CancelIntent’
|| handlerInput.requestEnvelope.request.intent.name === ‘AMAZON.StopIntent’);
},
handle(handlerInput) {
const textOutput = ‘OK! Tchau Tchau’;

return handlerInput.responseBuilder
.speak(textOutput)
.getResponse();
},
};

const SessionEndedRequestHandler = {

canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === ‘SessionEndedRequest’;
},
handle(handlerInput) {
console.log(‘Sessão finalizada: ${handlerInput.requestEnvelope.request.reason}’);

return handlerInput.responseBuilder.getResponse();
},
};

const ErrorHandler = {
canHandle() {
return true;
},
handle(handlerInput, error) {
console.log(`Error handled: ${error.message}`);
console.log(error.trace);

return handlerInput.responseBuilder
.speak(‘Não entendi o que você quer dizer.’)
.getResponse();
},
};

const skillBuilder = Alexa.SkillBuilders.custom();

exports.handler = skillBuilder
.addRequestHandlers(
LaunchRequestHandler,
AtrasoHandler,
HelpHandler,
CancelAndStopHandler,
SessionEndedRequestHandler,
)
.addErrorHandlers(ErrorHandler)
.lambda();

[/cc]

Com a função lambda criada, vamos agora criar o link entre ela e a skill da alexa. Para isso copie o ARN da função, que é o seu nome único dentro da AWS para a sua função. Fica na parte de cima da página

Retorne para a interface de edição de skill do alexa, selecione a opção endpoint -> AWS Lambda ARN e cole o ARN da função lambda em default region

neste mesmo local você pode selecionar HTTP e usar um endpoint que não seja a sua função lambda, podendo ser um serviço externo em qualquer outro servidor.

Após informar os dados acima, clique em SAVE ENDPOINTS

Testando sua skill

Com tudo construído vamos aos testes, na interface da alexa, clique em Test no menu. Esta ação vai abrir o developer console

no developer console, altere a configuração skill test is enable in para development.

Na segunda seta vermelha temos o campo de input da Alexa. Você pode utilizar um microfone conectado no computador para falar com a Alexa segurando o ícone do microfone para falar e soltando ao terminar. Ou se preferir, escrever o texto diretamente no campo utilizando o teclado.

Vamos começar o teste falando/escrevendo o nosso invocation name sem utterance.

Alexa, pergunte ao setor de pedidos

Após falar ou escrever a frase acima no developer console, se tudo estiver correto, o alexa vai identificar sua skill pelo invocation name e então vai acionar a lambda function associada a ela.

Se estiver usando o teclado como entrada de dados, não utilize virgulas ou qualquer outra pontuação.

Na caixa de diálogo a esquerda temos um tipo de chat que exibe com fundo escuro o que você digitou/falou e em azul a resposta da alexa. O resultado do último fluxo de interação entrada/saída é sempre exibido no painel a direita com um json gerado pela alexa a partir do entendimento dela sobre a sua frase (json a esquerda) e outro json que é a saída do seu backend, no caso um json retornado pela sua função lambda

Na imagem temos uma seta vermelha na esquerda indicando um campo importante do json de entrada, que é o type. Neste caso o valor enviado é “LaunchRequest“. Este tipo de requisição é identificado como um inicializador da skill e é gerado quando uma skill é identificada sem utterances.

Voltando ao nosso código, você pode olhar o handler LaunchRequestHandler que verifica se o type é do tipo
LaunchRequest, gerando então a saída do json exibido a direita.

dentro da função lambda, você consegue acessar o conteúdo do json da esquerda utilizando o atributo handlerInput.requestEnvelope.

seguindo com o nosso teste, diga:

Alexa pergunte ao setor de pedidos se temos algum atraso

Agora usamos uma utterance que identifica além da nossa skill, uma de nossas Intents. Repare no tipo de requisição identificada que agora é IntentRequest e possui um novo atributo informando o nome da Intent identificada (AtrasoIntent)

DEPLOY

Skill criada, backend criado, Alexa testada utilizando a skill e agora, como eu posso ouvir no meu echo dot a minha aplicação funcionando ? se outra pessoa com que tenha um echo, fizer a mesma pergunta do nosso artigo vai funciona para ela também ? vamos com calma …

Existem duas formas de você disponibilizar uma skill que voce criou no alexa.

Private (Alexa for Business)

Skills privadas são acessíveis somente através de uma organização e estão disponíveis para qualquer usuário, que tenha um dispositivo associado a organização.

Para publicar uma skill privada é necessário utilizar o serviço Alexa for Business da AWS. Este serviço infelizmente está disponível somente nos USA e não vamos aborda-lo.

O Alexa for business vai muito além de criar skills privadas, ele disponibiliza toda uma estrutura para controlar uma empresa por voz, integrando conferencia, salas de reunião, suporte, meetings e vários outros recursos. Os cases estão disponíveis em vídeo no link mais acima e vale a pena dar uma olhada.

Public

Uma skill publica está disponível para qualquer pessoa que se comunique com o Alexa. Ou seja, qualquer um que tiver um dispositivo echo em sua casa, poderá interagir com a skill.

Vamos imaginar um exemplo interessante. Você trabalha numa tv a cabo e constrói uma skill para interagir com seus clientes, eles podem então no sofá de sua casa, comendo pipoca enquanto assiste a um filme, falar com a alexa:

  • Alexa, pergunte a NET se existe algum problema técnico na minha região.
  • Alexa, pergunte a VIVO o preço do pacote da HBO que eu quero ver game of thrones essa noite.
  • Alexa confirme com a OI a compra do payperview do combate para essa noite.

Claro que para disponibilizar uma API pública requer um processo de homologação por parte da amazon, e é essa parte que vamos ver agora

Clique no menu distribution no console do alexa

Existem 3 formulários para serem preenchidos com perguntas sobre a sua aplicação, como você vai utiliza-la, se existe algum tipo de propaganda. São diversas perguntas e dois ícones para fazer upload.

Apésssssss preencher todos os campos vá para o menu certification e execute a validação clicando em RUN, se estiver com 0 erros você está no caminho certo

O passo seguinte é clicar em functional test e executar também os testes funcionais.

Caso não seja encontrado erro, sua skill está pronta para ser enviada a amazon. Clique em Submission e em seguida Submit for review

Após o envio você será direcionado para a tela inicial das suas skills informando que a skill que acabamos de mexer está in review

Após a aprovação da Skill, você pode utilizar a configuração do seu echo para habilitar skills, da mesma forma que através do seu smartphone você baixa apps de uma store, no echo você busca por skills e habilita elas para o seu aparelho.

Espero que tenham gostado do artigo e se tiverem duvidas manda no comentário que eu respondo a todos

Related Posts

WKS – Watson Knowledge Studio
AWS Experience: Encurtador de URL
× Como posso te ajudar?