Aprendizagem de Máquina é Divertido: Parte 6

Reconhecimento de Voz com Aprendizagem Profunda

Josenildo Costa da Silva
Machina Sapiens
11 min readJun 30, 2018

--

Nota do Tradutor: Este post é uma tradução de um artigo por Adam Geitgey , de uma série de artigos originalmente em inglês. Leia a série completa original: Part 1, Part 2, Part 3, Part 4, Part 5, Part 6, Part 7 and Part 8!

Você pode ler em português a Parte 1, Parte 2, Parte 3, Parte 4, Parte 5, Parte 6, Parte 7 e Parte 8.

Reconhecimento de voz está invadindo nossas vidas. Está nos nossos celulares, nos consoles de jogos, e nos smart watches. Está presente até nos assistentes domésticos. Por apenas 50 Dólares, você pode comprar um Amazon Eco Dot — uma caixa mágica que te permite pedir pizza, saber a previsão do tempo ou comprar sacos de lixo — apenas falando:

Alexa, peça uma pizza por favor!

O Eco Dot tornou-se tão popular no final de 2016 que a Amazon não conseguiu mantê-lo em estoque!

Reconhecimento de voz vem sendo desenvolvido há algumas décadas. Então, por que ficou tão popular de repente? A razão é que aprendizagem profunda (deep learning) finalmente tornou reconhecimento de voz precisa o suficiente para ser útil fora de ambientes cuidadosamente controlados.

Andrew Ng previu há muito tempo que assim que reconhecimento de voz passar de 95% para 99% de acurácia, ela iria ser o modo preferencial de interação com computadores. A ideia é que estes 4% restantes é a diferença entre irritantemente instável e incrivelmente útil. Graças à aprendizagem profunda, finalmente estamos chegando à este patamar.

Neste artigo, vamos aprender como fazer reconhecimento de voz com aprendizagem profunda!

Aprendizagem de Máquina nem sempre é uma Caixa Preta

Se você sabe como funciona tradução automática baseada em redes neurais, deve ter imaginado que poderíamos simplesmente passar gravações de sons como entrada para redes neurais e treiná-la para produzir texto.

Este é o santo graal do reconhecimento de voz com aprendizagem profunda, mas ainda não chegamos lá (pelo menos até quando este post foi escrito — talvez em mais alguns anos).

O grande desafio é que a velocidade da voz varia. Uma pessoa pode dizer “Olá!” bem rápido e outra pode dizer “Ooooooolllllllllááááá´” bem lentamente, produzindo arquivos de sons com muito mais dados. Ambos os arquivos de sons, entretanto, devem ser reconhecidos exatamente como o mesmo texto — “Olá!”. Alinhar automaticamente arquivos de áudio de tamanhos variados para um tamanho fixo tem se mostrado uma tarefa bastante difícil.

Para superar isto, temos que utilizar alguns truques especiais e processamento extra além da rede neural profunda. Vamos ver como isto funciona!

Transformando Sons em Bits

O primeiro passo para reconhecimento de voz é óbvio — precisamos alimentar o computador com ondas sonoras.

Na Parte 3, aprendemos como tratar uma imagem como um vetor de números que pode ser passado diretamente para uma rede neural para reconhecimento de imagens:

Imagens são apenas vetores de números que codificam a intesidade de cada pixel

Mas o som é transmitido em ondas. Como transformar ondas sonoras em números? Vamos usar um trecho de som onde eu digo “Hello!”:

Uma onda sonora de Adam Geitgey dizendo “Hello”

Ondas sonoras são unidimensionais. A cada instante elas possuem um único valor baseado na altura da onda. Vamos analizar em detalhes um pequena parte da onda sonora:

Para transformar esta onda sonora em números iremos registrar a altura da onda em espaços de tempo iguais:

Amostragem em uma onda sonora

Esta técnica chama-se amostragem (sampling). Realizamos uma leitura milhares de vezes por segundos e registramos a altura da onda sonora em cada ponto do tempo. Isto é basicamente um arquivo de áudio .wav não comprimido.

Áudio em “Qualidade de CD” tem amostragem de 44.1 kHz (44.100 amostras por segundo). Para reconhecimento de voz, uma amostragem de 16kHz (16.000 amostras por segundo) é suficiente para capturar todo o espectro de frequência da voz humana.

Vamos fazer amostragem da onda sonora do nosso “Hello” 16.000 vezes por segundo. Aqui estão as 100 primeiras amostras:

Cada número reprsenta a amplitude da onda sonora em intervalos de 1/16000 avos de segundo.

Desvio Rápido sobre Amostragem Digital

Você pode estar com a impressão que amostragem cria uma aproximação grosseira da onda sonora original, já que faz apenas leituras ocasionais. Há espaços entre as leituras, logo estamos perdendo dados, certo?

Amostragem digital podem recriar a onda sonora analógica original perfeitamente? E os espaços entre as leituras?

Graças ao teorema de Nyquist, sabemos que é possível utilizar matemática para reconstruir perfeitamente a onda sonora original a partir de amostras — desde que façamos amostras duas vezes mais rápido do que a maior frequencia que desejamos registrar.

Menciono isto apenas porque quase todo mundo entende isto errado e assume que utilizar uma taxa de amostragem mais alta sempre produz qualidade de áudio melhor. Isto não é verdade.

Mas chega de conversa, vamos voltar ao que interessa.

Pré-processando os Dados de Amostragem de Áudio

Agora temos um punhado de números que representam a amplitude da onda sonora coletados a cada 1/16.000 avos de segundo.

Poderíamos passar estes números direto para uma rede neural. Entretanto, reconhecimento de padrões de voz a partir de amostras de som é muito difícil. Ao invés disto, podemos tornar o problema um pouco mais fácil fazendo algum pré-processamento nos dados de áudio.

Inicialmente vamos agrupar nossas amostras em pedaços de 20 milisegundos de duração. Aqui está nosso primeiro trecho de 20 milisegundos de áudio (ou seja, nossas primeiras 320 amostras):

Ao plotar estes números em um gráfico de linha simples nos dá uma aproximação grosseira da onda sonora original para estes primeiros 20 milisegundos:

Esta gravação representa apenas 1/50 avos de segundos de duração. Mas mesmo este trecho curto é um complexo emaranhado de várias frequencias de som. Há sons de baixa frequencia, alguns de frequência média, e até alguns agudos estão presentes. Mas no fim das contas, estas frequencias se mistruram e compõem o complexo som da voz humana.

Para tornar estes dados mais fáceis de processar com uma rede neural, vamos dividir esta onda complexa em seus elementos fundamentais. Vamos separar sons graves, médios, etc. Assim, ao mensurar quanta energia está presente em cada faixa de frequência (de grave até agudo), estaremos criando uma espécie de código identificação único para cada trecho de áudio.

Imagine que você tem uma gravação de alguém tocando um acorde de Dó maior em um piano. Este som é a combinação de três notas musicais-Dó, Mi,e Sol — todos misturados em um só complexo. O nosso objetivo é separar o som complexo em suas notas individuais para descobrir que elas são Dó, Mi e Sol. Esta é exatamente a mesma ideia.

Isto é ralizado através de uma operação matemática chamada de Transformada de Fourier. Esta operação divide uma onda sonora complexa em em suas ondas componentes. Uma vez de posse destas ondas componentes, podemos identificar quanta energia está presente em cada uma delas.

O resultado é uma medida de importancia de cada faixa de frequencia, de graves até os agudos. Cada número abaixo representa a quantidade de energia em cada faixa de 50Hz no nosso clip de áudio de 20 milisegundos.

Each number in the list represents how much energy was in that 50hz frequency band

Mas tudo é bem mais fácil se visualizarmos estes número em um gráfico:

Você pode notar que nosso trecho de áudio de 20 milisegundos tem mais energia na baixa frequência do que na alta frequencia, típico de vozes masculinas.

Repetindo este processo a cada 20 milisegundo de audio, construimos um espectrograma (cada coluna da esquerda para direita é um trecho de 20 milisegundos).

Este é o espectrograma completo para o audio da palavra “Hello”.

Um espectrograma nos permite visualizar notas musicais e outros padrões de frequências em dados de áudio. Uma rede neural pode encontrar estes padrões mais facilmente no espectrograma do que nas ondas sonoras originais. Portanto, é este o tipo de representação de dados que iremos utilizar para alimentar nossa rede neural.

Reconhecendo Caracteres a partir de Sons Curtos

Agora que temos o áudio em um formato mais fácil para processar, iremos passá-lo para uma rede neural profunda. A entrada para a rede neural será os trechos de 20 milisegundos de áudio. Para cada clip de áudio, a rede tentará associar a letra correspondente ao som falado no áudio.

Vamos utilizar uma rede neural recorrente — isto é, uma rede neural que tem memória para influenciar suas predições. Isto porque cada letra predita deve afetar a probabilidade da próxima letra que será predita. Por exemplo, se foi dito “HEL” até então, é muito provável que irá ser dito “LO” para completar a palavra “HELLO”. É muito menos provável que seja dito algo impronunciável tal como “XYZ”. Portanto, a memória de predições passadas ajuda a rede neural a fazer predições mais corretas.

Depois de passar o nosso áudio completo para rede neural (um pedaço por vez), teremos mapeado cada pedaço de áudio para letras que sejam mais prováveis de ter sido pronunciadas naquele trecho. Aqui está um exemplo deste mapeamento para a palavra “Hello”:

Nossa rede neural prediz que provavelmente foi falado “HHHEE LL LLLOOO”. Mas também não descarta a possibilidade de que tenha sido dito “HHHUU LL LLLOOO”, ou até mesmo “AAAUU LL LLLOOO”.

Ainda é necessário organizar melhor a saída. Primeiro, vamos substituir caracteres repetidos por um único caractere:

  • HHHEE_LL_LLLOOO torna-se HE_L_LO
  • HHHUU_LL_LLLOOO torna-se HU_L_LO
  • AAAUU_LL_LLLOOO torna-se AU_L_LO

Depois vamos remover os brancos:

  • HE_L_LO torna-se HELLO
  • HU_L_LO torna-se HULLO
  • AU_L_LO torna-se AULLO

O resultado são treis possíveis transcrições — “Hello”, “Hullo” e “Aullo”. Se você pronunciar em voz alta [em inglês], estas três palavras se parecem com “Hello”. Como ela está predizendo um caractere por vez, a rede neural produzirá transcrições muito próximas do som pronunciado. Por exemplo, se você disser “He would not go”, ela poderá gera um possível transcrição como “He wud net go”.

O pulo do gato é combinar estas predições baseadas em pronúncias com probabilidades baseadas em grandes bases de texto escrito (livros, notícias, etc). Assim, podemos descartar transcrições que sejam menos prováveis de ocorrer em um texto e mantém as transcrições que pareçam mais realistas.

Dentre as transcrições possíveis “Hello”, “Hullo” e “Aullo”, é óbvio que “Hello” vai aparecer mais frequentemente em uma base de textos (e também no áudio original utilizado no treinamento) e por isso é provavelmente correto. Assim, escolhemos “Hello” como nossa transcrição final em detrimento das outras opções. Pronto!

Não! Espera aí!

Você pode estar pensando “Mas e se alguém disser ‘Hullo’? É uma palavra válida. Quem sabe ‘Hello’ é a transcrição errada!

“Hullo! Who dis?”

Claro, é possivel que alguém realmente diga “Hullo” ao invés de “Hello”. Mas um sistema de reconhecimento de voz como este (treinado em inglês americano) provavelmente nunca irá produzir “Hullo” como transcrição. Simplemente algo tão improvável de se dizer comparado com “Hello” que sempre irá preferir “Hello” não importa o quanto você enfatize o som do ‘U’.

Tente você mesmo! Se seu telefone pode ser configurado para Inglês Americano, tente fazer com que o assistente digital no seu smartphone reconheça a palavra “Hullo”. Não dá! Ele se recusa! Ele sempre irá entender como “Hello”.

Não compreender “Hullo” é um comportamento razoável, mas algumas vezes você ficará irritado quando seu smartphone se recusar a reconhecer algo válido que você esteja dizendo. Por isso que modelos de reconhecimento de voz estão constantemente sendo retreinados para corrigir estes casos extremos.

Posso Implementar meu Próprio Sistema de Reconhecimento de Voz?

Uma das coisas mais legais em aprendizagem de máquina é como ás vezes tudo parece ser tão simples. Você pega um punhado de dados, treina um algoritmo de aprendizagem de máquina e magicamente tem um sistema de IA de altíssima qualidade rodando na placa de vídeo do seu notebook de jogos … certo?

Pode ser verdade em alguns casos, mas não para voz. Reconhecimento de voz é um problema muito difícil. Você tem uma infinidade de desafios a superar: má qualidade de microfones, ruído de fundo, reverberação e eco, variações de sotaques, e assim por diante. Todos estes problemas devem estar presentes na sua base de treinamento para garantir que a rede neural será capaz de lidar com eles.

Aqui vai outro exemplo: você sabia que quando você fala em uma sala barulhenta você inconscientemente aumenta o tom da sua voz para poder ser compreendido em meio ao barulho? Humanos não tem dificuldade para compreender uns aos outros em qualquer situação, mas redes neurais precisam ser treinadas para cada caso especial. Por isso, você precisa de dados de treinamento de pessoas gritando em meio ao barulho!

Para implementar um sistema de reconhecimento de voz que tenha o nível de performance da Siri, Google Now!, ou Alexa, você precisará de uma enorme quantidade de dados — muito mais dados do que você poderá conseguir sem contratar centenas de pessoas para gravá-los para você. E como usuários tem pouca tolerância à sistemas de reconhecimento de voz de baixa qualidade, você não pode economizar nisto. Ninguém quer um sistema de reconhecimento de voz que acerte apenas 80% das vezes.

Para uma compania como a Google ou a Amazon, centenas de milhares de horas de áudio falado gravado em situações da vida real é ouro. Este é o item fundamental que separa os sistemas de reconhecimento de voz de primeira linha deles de um sistema amador. O principal objetivo ao colocar Google Now! e Siri em cada smartphone de graça, ou vender unidades de Alexa por $50 sem taxa de assinatura para que você os use o máximo possível. Cada coisa que você diz para estes sistemas é gravado para sempre e utilizado depois como dados de treinamento para versões futuras de sistemas de reconhecimento de voz. Esta é a grande verdade!

Não acredita em mim? Se você tem um smartphone com Android e Google Now!, clique aqui para ouvir gravações reais suas dizendo toda besteira que você já disse ao Android:

Você pode acessar a mesma coisa na Amazon com seu aplicativo Alexa. A Apple, infelizmente, não permite que você acesse os dados de sua voz na Siri.

Se você está procurando uma ideia para uma start-up, eu não recomendaria tentar construir seu próprio sistema de reconhecimento de voz para competir com a Google. Ao invés disto, tente descobrir como fazer as pessoas te entregarem áudios delas mesmas falando por horas. Esta based de áudio pode ser seu produto.

Onde Aprender Mais

  • O Algoritmo (superficialmente) descrito aqui para lidar com áudio de tamanho variado é chamado de Classificação Temporal Conexionista ou CTC. Você pode ler o paper original de 2006.
  • Adam Coates da Baidu deu uma excelente palestra sobre Deep Learning para reconhecimento de voz na Bay Area Deep Learning School. Você pode assistir ao vídeo no YouTube (a sua palestra inicia em 3:51:00). Altamente recomendado.

Nota do autor: Se você gostou deste artigo, considere assinar a minha lista de emails Machine Learning is Fun! Só irei enviar mensagens quando eu tiver alguma coisa nova e interessante para compartilhar. Esta é a melhor maneira de ficar sabendo quando eu escrever mais artigos iguais a este.

Você pode me seguir no Twitter em @ageitgey, me enviar email diretamente ou me encontrar no linkedin. Eu vou adorar poder ajudá-lo ou a sua equipe com aprendizagem de máquina.

Agora continue a jornada com Machine Learning is Fun! Part 7!

--

--