Como podemos ajudar?

05. Como receber e processar um áudio de WhatsApp com Zenvia Bots, ZenAPI e STT (Speech-To-Text) do Google
6 min
Criado por Humanz em 03/06/2022 12:40
Atualizado por MLMC em 25/10/2022 15:22

 

A comunicação por envio de áudios gravados no WhatsApp é um comportamento muito recorrente entre usuários brasileiros, e não é incomum ver clientes se perguntando sobre a possibilidade de reconhecer o conteúdos destes áudios.

Boa notícia! Com Zenvia Bots e ZenAPI, dá. 
 
Neste tutorial, explicaremos num breve passo a passo como utilizar os melhores recursos desses dois produtos para criar bots capazes de não só compreender, mas também de escutar o que dizem os usuários.

1. Configurando o recebimento da mensagem

Os payloads enviados pelas mensagens de WhatsApp pelo Zenvia Bots já vêm com atributos de identificação do tipo do conteúdo trafegado. Para avançarmos neste tutorial, usaremos os atributos 'fileMimeType' e 'fileUrl', que são declarados nativamente a cada mensagem recebida. 
 
Quando um áudio é enviado via WhatsApp para o Zenvia Bots, ele gera um atributo de valor 'audio/ogg; codecs=opus' para o MimeType e uma URL hospedando o conteúdo em 'fileUrl'. 
 
Para passar esses parâmetros para o Google STT, que só lê arquivos hospedados no Firebase e binários em Base64, a melhor estratégia é utilizar uma expressão regular para que o Zenvia Bots realize o download do áudio e converta para o binário. Para isso, em todo campo de resposta que possamos esperar um áudio do usuário, deveremos criar uma variável nomeada (ex.: 'resultado') e, na expressão, aplicar a seguinte fórmula:
1
#base64.encodeBase64String(T(org.apache.commons.io.IOUtils).toByteArray(new java.net.URL(fileUrl)))
No passo de mensagem do usuário, deve ficar assim:
7a827f7a-00f2-42be-abc7-997feb107870.png
Essa expressão fará com que toda mensagem que chegue em formato de áudio seja imediatamente convertida para uma variável que possa ser enviada para o Google STT.

2. Utilizando ponto de decisão para diferenciar áudio de texto

O próximo passo será utilizar o ponto de tomada de decisão para que o Zenvia Bots consiga diferenciar audio inputs de áudio de text inputs  do usuário. Para isso, devemos criar uma expressão regular utilizando o atributo 'fileMimeType' para validar a qualidade do input recebido pelo usuário. A fórmula é a seguinte:
1
fileMimeType=="audio/ogg; codecs=opus"
Na prática, a configuração fica assim:

 

2744a302-54ca-4d96-bb9c-11b9915869ad (1).png
Com esse setup, o Zenvia Bots será capaz de tratar o input do usuário de uma forma X ou Y de acordo com o tipo de comunicação utilizada. (Ou seja, sem que o envio de texto seja desconsiderado.)

3. Transcrevendo a fala do usuário com Google STT

Para realizar a transcrição utilizando a API de Speech-to-Text do Google, utilizaremos o componente de Json API para realizar uma chamada POST. Os atributos informados devem ser:
 
1. O codec do áudio recebido com:
  • Tipo de arquivo;
  • Bitrate;
  • Código do idioma a ser interpretado.
2. O conteúdo do áudio a ser transcrito.
 
Dessa forma, enviaremos o seguinte body para a requisição:
1
2
3
4
5
6
7
8
9
{
    "config": {
        "encoding": "OGG_OPUS",
        "sampleRateHertz": 16000,
        "languageCode": "pt-BR"
    },
    "audio": {
        "content": "#{resultado}"
    }
  • encoding: é o atributo que define o formato de áudio enviado (OGG/Opus, no caso de mensagens de WhatsApp). 
  • sampleRateHertz: define a bitrate a ser processada. Convém usar o padrão de 16.000.
  • languageCode: cadastrado como 'pt-BR', transcreve para português.
  • content: variável que deve passar o binário resgatado no passo 1 deste tutorial, informado como variável.  
 
A URL a ser chamada deverá ser:
1
2
3
https://speech.googleapis.com/v1/speech:recognize?key=API_KEY

(sendo API_KEY a chave gerada dentro do console do Google)
Para recuperar as informações de transcrição vindas da API, utilizaremos a seguinte expressão:

 

1
retornoApi: response.results[0].alternatives[0].transcript
Ou, nas telas do Zenvia Bots:
5fbd2d4f-d7fa-4525-b63c-d18662bb2e03.png
c309bb7e-609b-4aff-a5ee-8337ae09eedf.png
1539f6c9-db48-42cf-9e46-acaddb965bd3.png
Dessa maneira, todos os retornos por voz dos usuários ficarão armazenados em variáveis que poderão ser retornadas para o Zenvia Bots tanto para utilização de outros mecanismos de NLP quanto para avaliação de keywords, e assim por diante.

Seguindo as instruções que colocamos aqui, seus bots já podem começar a entender português!  😊

Assim:
 
aae90bdb-722a-4d36-892b-5b2838b7a0d5.png