O blog da AWS
Indexando áudios com Amazon Transcribe, Amazon Comprehend e ElasticSearch
Por Felipe Brito e Eduardo Pereira, Arquitetos de Soluções AWS Brasil
Introdução
No ano de 2021, aulas por vídeos, podcasts e demais mídias estão sendo amplamente utilizados e, devido a pandemia e necessidade de aulas e trabalho remotos, a geração de conteúdo aumentou. Consequentemente, é necessário acompanhar esse crescimento. O maior desafio que encontramos nesse cenário é o gerenciamento desses materiais, questões como indexar, identificar e pesquisar aumentam em complexidade conforme a minha base de dados cresce e essas tarefas são trabalhosas e demandam tempo e esforço se forem realizadas manualmente.
Em um ambiente AWS, diferentes serviços podem ser utilizados para facilitar a implementação dessas etapas, como o Amazon Transcribe, para automatizar a criação de texto a partir de arquivos de áudio, o Amazon Comprehend, para análise e identificação de contexto e Amazon Elasticsearch Service, para criação e pesquisa de índices, porém, ainda é necessária a orquestração desses componentes.
Neste blog, explicaremos como criar uma solução de ingestão e indexação automática de arquivos de áudio se valendo de um workflow de orquestração baseado em AWS lambda. A solução segue a ideia de que, a partir do momento que ocorre o upload de um arquivo, o workload se inicia e realiza a transcrição, a análise de linguagem e o carregamento dos dados. Como resultado, é possível criar índices e gráficos para suportar soluções de pesquisa e facilitar a análise de dados.
Também demonstraremos quais são as etapas necessárias para criar índices e gráficos em cima dos dados gerados pelo workflow. Coisas como analisar os assuntos mais comentados nos áudios ou realizar buscas de certos assuntos nos arquivos, utilizando palavras-chave e metadados.
Solução
O seguinte diagrama ilustra os componentes utilizados na solução proposta:
Como observado na figura, a arquitetura consiste em utilizar os serviços Amazon Transcribe e Amazon Comprehend para transcrição e extração de metadados dos arquivos inseridos em um bucket S3. Utilizamos também o serviço Amazon Elasticsearch Service, que permite criar um cluster totalmente gerenciado e automatiza todo o processo de configuração do cluster e implementação do Kibana, ferramenta open-source de visualização e exploração de dados.
A solução segue um modelo de arquitetura serverless e utiliza os seguintes serviços:
- Amazon S3: Solução de Storage de objeto que será utilizada para o armazenamento dos áudios que serão indexados e arquivos gerados pelo workflow;
- Amazon Transcribe:serviço que permite a conversão dos arquivos de áudio para o formato de texto;
- Amazon Comprehend: serviço de processamento de linguagem natural que realizará análise em cima dos textos gerados pelo Amazon Transcribe e extrairá palavras-chave, pessoas, data, lugares e outros;
- AWS Lambda: Permite rodar códigos sem a necessidade de provisionar ou gerenciar servidor;
- AWS Step Functions: Solução para gerenciar o workflow de transcrição e análise dos arquivos de áudio realizadas por diferentes Lambda Functions;
- Amazon Elasticsearch Service: Cluster gerenciado de Elasticsearch que armazena as informações extraídas e permite a criação de índices e visualizações;
- Amazon Cognito: Autenticação e autorização de usuários para acessar o Kibana no cluster de Elasticsearch.
Workflow da aplicação
Como dito anteriormente, por envolver um conjunto de atividades que devem ser realizadas, optamos por utilizar os serviços AWS Step Functions e AWS Lambda Functions para orquestrar todo o processo de ingestão e indexação dos áudios. O Workflow é ativado no momento que realizamos o upload de arquivo no bucket S3 de origem (explicado de forma detalhada no decorrer deste post). As etapas presentes são:
- startTranscribeJob: inicia um job assíncrono de transcrição utilizando o Amazon Transcribe;
- getTranscribeJob: verifica se o job do Amazon Transcribe ainda está sendo executado ou se foi finalizado (com sucesso ou falha);
- isTranscribeJobComplete?: direciona o fluxo de acordo com o status final retornado pela etapa anterior. Se finalizado com sucesso, o processo segue para a próxima etapa, caso tenha acontecido alguma falha, o workflow é finalizado e por fim, se o job ainda não foi finalizado, o fluxo é direcionado para a etapa waitTranscribeJobs, onde é esperado 60 segundos e o processo é repetido;
- getTranscribeTranscript: com o job sucedido, pega-se as informações retornadas pelo Amazon Transcribe, como texto e localização dos arquivos;
- startComprehendJob: utilizando o Amazon Comprehend, inicia um job assíncrono para extração de entidades e palavras-chaves do arquivo transcrito;
- getComprehendJobsAsync: verifica se o job do Amazon Comprehend ainda está sendo executado ou se foi finalizado (com sucesso ou falha);
- isComprehendJobsAsyncCompleted?: direciona o fluxo de acordo com o status final retornado pela etapa anterior. Se sucedido, o processo segue para a próxima etapa, caso tenha acontecido alguma falha, o workflow é finalizado e por fim, se o job ainda não foi finalizado, o fluxo é direcionado para a etapa waitComprehendJobs, onde é esperado 60 segundos e o processo é repetido;
- extractComprehendOutputFiles: com o job sucedido, pega-se as informações retornadas pelo Amazon Comprehend, como localização dos arquivos que apresentam entidade e palavras-chaves;
- loadES: as entidade e palavras-chaves retornadas são inseridas no cluster do Amazon Elasticsearch Service
Implementando a solução
Para facilitar a replicação da solução, um projeto SAM foi implementado. Todos os componentes destacados na arquitetura e etapas do workflow podem ser implementados em uma conta AWS através da execução do seguinte repositório: https://github.com/aws-samples/serverless-audio-indexing.
As informações de como executa-lo e quais são os pré-requisitos estão presentes na raiz do projeto.
Executando o Workflow
Com a solução implementada na conta, podemos enfim iniciar a execução do workflow. Para isso, basta realizarmos o upload em um dos buckets criado pelo projeto na etapa anterior. Os passos são:
- Realizar o login no console da AWS e abrir o console do Amazon S3: https://console.aws.amazon.com/s3;
- Na página de listagem de buckets, abra a opção que contenha o nome RawS3Bucket no nome;
- Realize o upload de um arquivo no formato .mp3 ou .mp4 no bucket;
- Assim que o upload finalizar, um evento do S3 é disparado e acionará a máquina de estado que iniciará o workflow.
- Podemos então seguir para o console da AWS Step Functions, selecionar a maquina de estado criada pelo projeto e acompanhar a execução da mesma.
Criando Indexes no ElasticSearch
Uma vez que o workflow foi finalizado com sucesso e os dados foram ingeridos dentro do ElasticSearch pela primeira vez, é necessário a criação dos índices no cluster. Para acessarmos o link do Kibana associado ao nosso servidor, podemos entrar na página do Amazon Elasticsearch Service, selecionar o cluster criado pelo nosso stack de CloudFormation e utilizar o link no parâmetro Kibana.
Ao acessarmos pela primeira vez, será necessário criar um usuário no menu. Este usuário será criado no pool do Amazon Cognito.
Criação dos indexes no Kibana (etapa do passo a passo)
- Setup dos index
- Para criar o index dentro do Kibana, navegue na aba lateral à esquerda Stack Management, no menu Index Patterns e clique no botão Create index pattern:
- Uma vez que já existe dados dentro do Kibana, a própria ferramenta já te indica os indexes que você pode criar. No nosso cenário, os indexes sugeridos são entities e keyphrases.
- No step 2, só é necessário confirmar a criação do index.
- No próprio menu de Index, é possível ver os campos e seus tipos descritos que você poderá utilizar posteriormente. Após o index criado, é possível trabalhar com os Dashboards dentro do Kibana e também alterar os tipos dos dados do index, como configurar um campo do index para o formato de numero inteiro, por exemplo.
Visualizando e procurando documentos com Kibana
- Tutorial de procura simples
- Para explorar os dados inseridos no index, é possível fazer pela aba de “Discover” dentro do Kibana. Uma vez colocado os parâmetros da busca dentro da barra de busca, o Kibana retornará os itens correspondentes dentro do index.
- Uma outra forma de interagir com os dados do index no KIBANA, é utilizando o SQL Workbench:
- É possível criar visualizações e usa-las dentro de Dashboards, que são atualizados automaticamente conforme os dados são ingeridos. Há diversos tipos de gráficos disponíveis como gráfico de área, mapa de calor, barras verticais e horizontais, etc.
- No exemplo abaixo, um gráfico de Pizza foi criado para analisar e comparar os tipos de entidades que compõe o index:
- Para saber mais do Kibana: https://www.elastic.co/pt/what-is/kibana
Conclusão
Neste blog post pudemos explorar as possibilidades que a nuvem e os serviços da AWS podem agregar quanto à agilidade e facilidade. Utilizando serviços que possuem alto nível de abstração e que seguem o modelo serverless, implementamos uma solução rápida e fácil que automatiza todo o processo de ingestão e indexação de textos extraídos de arquivos de áudio.
Além da transcrição do áudio, novos insights também foram criados durante o workflow, onde utilizamos as análises do Amazon Comprehend para a extração de palavras-chave e entidades relevantes. Vale ressaltar que a solução pode ser ampliada através de novos insights, como extração de sentimentos.
Algumas das referencias que foram utilizadas durante a criação desse blog post são:
- https://aws.amazon.com/blogs/machine-learning/discovering-and-indexing-podcast-episodes-using-amazon-transcribe-and-amazon-comprehend/
- https://aws.amazon.com/blogs/machine-learning/building-an-nlp-powered-search-index-with-amazon-textract-and-amazon-comprehend/
Sobre os Autores
Eduardo Pereira é Arquiteto de Soluções. Atua ajudando clientes do setor Enterprise durante a sua jornada na nuvem da AWS. Tem grande interesse na área de infraestrutura, networking e serverless.
Felipe Brito é Arquiteto de Soluções na AWS e atua guiando clientes nas melhores práticas de arquitetura na nuvem. Possui experiência com projetos de desenvolvimento de software e Analytics.