Como construí um aplicativo de voz para o Google Home

Um dos cursos mais divertidos do programa Tow-Knight Center de Entrepreneurial Journalism — do qual fui um fellow em 2019 — foi a aula de prototipagem, comandada pelo jornalista, maker e professor John Keefe. Durante um semestre, vimos novas maneiras de usar máquinas, código e a tecnologia para fazer jornalismo e criar produtos úteis e bacanas.
Keefe falou sobre APIs, coleta de dados, chatbots, sensores, Arduino e interafaces de voz. Ao longo do semestre, nossa missão era a de usar algumas das ferramentas ensinadas em aula para criar um projeto, um protótipo. Ele poderia ou não ter relação com o produto que cada um de nós estava desenvolvendo dentro da fellowship.
Como vocês sabem, sou o criador do Me Explica?, um plataforma de jornalismo explicativo que contextualiza as notícias de um jeito leve e divertido, como se fosse um bate-papo. Quando comecei a pensar o que faria em meu trabalho final, logo cheguei à conclusão de que teria de ser algo que gerasse a mesma proximidade e tom de conversa que o Me Explica tem. Não demorou muito, decidi fazer um aplicativo para assistentes de voz.
Já vou entregar o ouro e mostrar como ele ficou no vídeo abaixo. Mas a jornada até chegar aqui foi longa.
Assistentes de voz crescem no Brasil e no mundo
Embora se tratasse de um protótipo, aprendi que esse é um produto que faz todo sentido no Brasil. O Android está presente em 89% dos smartphones. E 68% de quem tem um aparelho desses diz usar assistentes de voz.
Esse mercado tem crescido muito pelo mundo. O Google divulgou no começo do ano que mais de um bilhão de dispositivos usa seu Assistente. De acordo com a Amazon, mais de 100 milhões de dispositivos Echo (que vem equipado com a Alexa), estão em uso. No total, pelo mundo, eram 2,5 bilhões de aparelhos usando esse tipo de tecnologia. Uma empresa britânica de pesquisa estima que chegaremos a 8 bilhões até 2023.
O primeiro passo do protótipo: roteiro de interação
Para começar a desenvolver meu aplicativo, eu precisava decidir como ele iriar funcionar. Primeiro, pensei em fazer um modelo de interação que fosse bem simples: (1) a pessoa invoca o app dizendo "abra o Me Explica"; (2), o app responde dando boas e vindas e dizendo qual tema ele irá explicar naquela semana; (3) em seguida, o app começa a falar seu texto; (4) assim que acaba o primeiro trecho, ele dá à pessoa a opção de encerrar ou de se aprofundar mais um pouco; (5) depois de duas ou três vezes, o app se encerra sozinho.
Fiz o primeiro teste no Botsociety (uma plataforma para construir a estrutura de bots) seguindo essa ideia. Meu primeiro aprendizado foi que o texto estava muito longo. Quando uma voz robotizada lê três ou quatro frases em seguida, o resultado é uma explicação tediosa. A primeira coisa que fiz foi editar o texto e cortar muito. Deixei cada resposta do robô com — no máximo — duas frases muito curtas.
O corte melhorou muito meu bot de voz, mas eu ainda não estava satisfeito. Queria tentar reproduzir ao máximo a experiência de ler e assistir aos vídeos do Me Explica. Para fazer isso, eu precisaria deixar a interação um pouco mais complexa.
Criando uma estrutura básica de diálogo
Expliquei ao professor John Keefe o que eu queria fazer. Ele me disse que era possível criar o que eu imaginava, mas o processo ficaria um pouco mais complicado. Seria necessário ligar a plataforma de processamento de fala a um banco de dados onde estariam as diversas respostas possíveis. Estávamos usando o Dialogflow, uma excelente plataforma que pode ser usada para diversos tipos de bot que trabalham com linguagem (de texto ou de voz). No entanto, seria preciso usar o Airtable para armazenar as falas do robô.
O Dialogflow funciona de uma maneira razoavelmente intuitiva. Você programa "intenções", que são os gatilhos das ações a serem desempenhadas pelo aplicativo. Por exemplo: para abrir o aplicativo de voz do Me Explica, é preciso criar uma "intenção" inicial, que vai começar todo o processo.

A cada nova "encruzilhada" que o usuário encontra, ele precisará acionar uma intenção diferente. É claro que ele não saberá disso, pois estará tentando interagir com seu app de uma maneira intuitiva. É missão do criador tentar prever o que a comunidade pode dizer em cada caso.
A estrutura que eu queria criar não era muito complexa: o Me Explica daria boas-vindas ao usuário, que poderia escolher entre duas notícas diferentes. Cada uma teria seu desenrolar, permitindo o aprofundamento na notícia com simples "sim" ou "não".
Uma base de dados para o texto: Airtable e Glitch
Mas para fazer isso funcionar, eu precisaria ligar cada "intenção" a uma linha diferente de uma tabela da plataforma Airtable. Elas precisariam ter o mesmo nome para evitar erros. Importante também era lembrar de ligar a sequência de respostas umas às outras no Dialogflow. Só assim eu poderia garantir que as explicações viessem na sequência correta.
Uma coisa muito boa desse método é que você pode atualizar o texto em tempo real. Ou seja, se alguma informação nova aparecer, é possível mudar a resposta do assistente imediatamente.

Apareceu um problema no meio do caminho: não é possível integrar a tabela do Airtable diretamente ao Dialogflow. Era preciso fazer uma "gambiarra" para que os dois conversassem. Nesse momento, a expertise de John Keefe foi fundamental. Ele usou o Glitch para criar um web app que puxa a informação do Airtable e a fornece para o Dialogflow. Veja abaixo:
Feito isso, o app funciona perfeitamente. Com o processamento natural de linguagem do Dialogflow, você abre a possibilidade para que as pessoas interajam com seu app de uma maneira muito mais natural e intuitiva. Por exemplo: quando o aplicativo te dá duas opções, você pode escolher a segunda dizendo "Sri Lanka", "a segunda opção", "número dois", etc.
Outro aprendizado importante é criar os "fallback intents". Eles são os curingas do seu app e são acionados quando a pessoa diz algo que não está na sua lista de palavras. Eles são acionados toda vez que algo "estranho" é dito. Você pode programar o assistente para dizer: "Não entendi o que você disse", "Pode repetir". Ou então, você pode criar um "fallback intent" que encerra o aplicativo toda vez que alguém disser: "Tchau", "Chega", "Não quero mais", etc.
Conclusão: não vou parar por aí
Terminado o projeto, apresentei-o para meus colegas de sala, alguns professores e para a reitora da faculdade de jornalismo da CUNY, Sarah Bartlett. Veja os slides:
Quero investir mais tempo para traduzir esse aplicativo para o português e lançá-lo como um dos produtos do Me Explica. Ele pode ser atualizado toda semana, todo dia ou até todo minuto, depende da necessidade. Outra coisa que pretendo fazer é estudar como usar uma voz humana gravada para dizer as respostas. O robô é ótimo quando o texto é curto — dando a previsão do tempo, respondendo aos comandos dados ao Netflix — mas é preciso nuances para falar de notícias.
Se você quiser saber mais sobre como eu fiz esse aplicativo ou qualquer outro assunto, sinta-se à vontade para entrar em contato: diogorodriguez.com.