top of page
Foto do escritorRan Isenberg

Serverless potencializa acessibilidade: converta texto em fala com Amazon Polly


Papagaio DALL-E sentado em uma nuvem lendo um livro enquanto canta
Papagaio DALL-E sentado em uma nuvem lendo um livro enquanto canta

Vivemos em uma era incrível de avanços e inovações tecnológicas transformando todos os aspectos de nossas vidas. Da inteligência artificial e aprendizado de máquina à automação e big data, não há como negar que o futuro está aqui.

Por exemplo, o título deste post de blog foi escrito com a ajuda do ChatGPT para torná-lo otimizado para SEO. A imagem do papagaio foi feita com a ajuda do DALL-E.

E o tocador de áudio que lê esse texto para você? Bem, acontece que isso também pode ser automatizado.


E é isso que discutiremos hoje: automatizar a conversão de texto em fala (TTS) com a ajuda do Amazon Polly.

Fornecerei uma solução Serverless totalmente funcional no GitHub com código Python e AWS CDK. Você pode implantar o código e aproveitar a transformação de texto para fala em minutos.


Clique aqui para acessar o projeto GitHub.

 

Índice

 

Acessibilidade é importante

Comecei meu site, RanTheBuilder , para compartilhar meu conhecimento sobre AWS e Serverless com o mundo. Um site acessível promove inclusão e garante que todas as pessoas possam acessar e se envolver com o conteúdo. A acessibilidade assumiu o palco principal nos últimos anos e mais sites estão percebendo isso.


Recentemente, notei que o Medium adicionou um reprodutor de áudio para as postagens do blog que as lê para você, o que é um ótimo recurso de acessibilidade.

Eu não tinha ideia de como eles faziam isso, e parecia fora de alcance.

No entanto, fui inspirado a agir imediatamente quando vi o seguinte vídeo no YouTube:


No vídeo, o construtor da comunidade AWS Johannes Koch entrevista Jimmy Dahlqvist , um colega construtor. Eles discutem como Jimmy automatizou a criação de seu blog com AWS Step Functions, o que resultou na versão falada do texto do post com Amazon Polly.

Nunca tinha ouvido falar do Amazon Polly, mas me senti inspirado a experimentá-lo e finalmente resolver um recurso de acessibilidade ausente no meu site.


Eu projetei uma solução simples que atende perfeitamente às minhas necessidades, que são relativamente modestas.

Antes de entrarmos em detalhes, vamos aprender sobre o Amazon Polly.

 

Introdução ao serviço de conversão de texto em fala do Amazon Polly

Amazon Polly é um serviço de conversão de texto em fala (TTS) baseado em nuvem. Ele usa tecnologias avançadas de aprendizado profundo para converter texto escrito em fala realista, permitindo que desenvolvedores criem aplicativos habilitados para fala com vozes que soem naturais.

Polly suporta uma ampla gama de idiomas (24 no momento da escrita), e os usuários podem escolher entre várias vozes masculinas e femininas com diferentes sotaques e tons (47 no total). O serviço também fornece recursos avançados, como reconhecimento automático de fala (ASR) e linguagem de marcação de síntese de fala (SSML), permitindo que os desenvolvedores ajustem a pronúncia, ênfase e entonação da saída de fala.


Um dos pontos fortes do Amazon Polly é que ele é um serviço Serverless. Ele emitirá arquivos de áudio diretamente para um bucket S3, facilitando a incorporação em qualquer arquitetura baseada em eventos. Ele manipulará qualquer tamanho de texto que você enviar automaticamente, você não precisa girar mais máquinas e você só paga pelo número de caracteres que transformar em fala.

Pelo pouco tempo que usei, percebi que é bem simples: o texto entra e o arquivo mp3 sai em um bucket S3.


Console Amazon Polly
o texto entra, a fala sai

O nível gratuito é impressionante e atenderá às necessidades de muitas pessoas, inclusive as minhas.

Saiba mais sobre preços .

Vamos ver como automatizar a criação de texto para fala com a API do Amazon Polly.

 

Meu serviço Python de conversão de texto em fala

Vamos analisar o objetivo do serviço, o design e os detalhes de implementação.


O Objetivo

Quero poder criar arquivos .mp3 dos meus posts de blog e carregá-los no meu site quando estiver trabalhando em novos posts. O serviço deve ser Serverless, simples de usar e implantado com AWS CDK.


Quero que o uso seja o mais simples possível:

  • Adicione um novo arquivo de texto à pasta 'text' do serviço TST (texto para fala).

  • Implante o serviço na AWS.

  • Receba um arquivo mp3 no meu endereço de e-mail.

Posso então carregar o arquivo mp3 no meu site e publicar a nova postagem do blog com um reprodutor de áudio integrado à postagem que reproduz o arquivo mp3, resolvendo assim um importante recurso de acessibilidade que faltava no meu site!

Para resumir: adicione um arquivo de texto à pasta 'text', implante na AWS, espere um minuto e receba um arquivo mp3 na sua caixa de entrada. Simples!


Se você quiser experimentar, acesse o projeto no GitHub e siga o arquivo leia-me para obter instruções e uso.

 

Design de alto nível

De uma perspectiva de design, o serviço é bem simples. Você tem sua entidade de armazenamento em nuvem que é usada para processamento de entrada e intermediário.

Então você tem dois grandes participantes: produtor e consumidor.

O produtor carrega arquivos de texto no armazenamento em nuvem, que são enviados ao consumidor.

O consumidor transformará o arquivo de texto em um arquivo mp3 e o enviará por e-mail para um endereço de e-mail como anexo.

Design de alto nível
Design de alto nível

Arquitetura de serviço

Vamos dar uma olhada na arquitetura e ver como implementei cada entidade.

Aviso Legal: Este serviço de nível POC fornece automação para minhas necessidades da forma mais simples possível. Contribuições de código são bem-vindas!


Arquitetura de serviço
Arquitetura de serviço

Fluxo de Eventos

  1. O usuário adiciona um novo arquivo de texto à pasta 'text' na pasta raiz do projeto.

  2. O usuário implanta o serviço com o AWS CDK (pode usar o comando 'make deploy').

  3. O arquivo é carregado no S3.

  4. A função Lambda do consumidor é acionada com um evento 'objeto criado no S3' e lê o nome do arquivo e o nome do bucket do evento.

  5. A função Lambda do consumidor envia o conteúdo do texto para o Amazon Polly e fica em espera/pesquisa até que a tarefa seja concluída.

  6. Uma vez que a tarefa é concluída, o arquivo mp3 de saída é baixado do bucket S3 e deletado. Como o enviamos por e-mail, não há necessidade de armazená-lo no S3, mas você pode desabilitá-lo e enviar de volta o link do objeto em vez do arquivo mp3.

  7. A função Lambda usa o Amazon SES para enviar o arquivo mp3 como um anexo para um endereço de e-mail predefinido.


Detalhes das Entidades de Serviço

Usamos um bucket do Amazon S3 para armazenamento de entrada e saída do Amazon Polly para a entidade de armazenamento em nuvem. O Polly tem integração nativa com o Polly, então faz todo o sentido. O código CDK do bucket pode ser encontrado aqui .


O produtor é uma construção especial do AWS CDK que carrega arquivos para o S3 de uma pasta específica. Eu costumo adicionar um arquivo por vez e implantar o serviço. Você também pode carregar um arquivo manualmente para o bucket, mas isso anula o propósito; queremos automação. O código CDK do produtor pode ser encontrado aqui .


O consumidor é uma função Lambda que assina os eventos 'on object create' do bucket do S3 e é acionada quando novos objetos são gravados.

A função pegará cada evento, lerá e enviará seu conteúdo para o Amazon Polly. Ele usa a API 'start_speech_synthesis_task'. Eu usei o wrapper oficial do Amazon Polly sample SDK, que obtém o conteúdo do arquivo de texto e retorna o arquivo mp3 como saída - bem simples!

O código CDK do consumidor pode ser encontrado aqui .

E o código da função Lambda pode ser encontrado aqui .

O uso do wrapper Polly no meu código pode ser encontrado aqui .


 

Desempenho e questões em aberto

Para meu caso de uso, uma postagem de blog de 11.000 caracteres leva cerca de 40-50 segundos para se transformar em um arquivo mp3 no meu endereço de e-mail depois que a implantação é concluída. Isso não é ruim.


Você deve estar se perguntando por que eu excluo o arquivo mp3 do S3 e o envio como anexo de e-mail.

Bem, eu quero que o arquivo mp3 seja excluído e enviado como anexo de e-mail porque quero enviá-lo para meu site, onde o armazenamento já está pago, em vez de armazená-lo e reproduzi-lo na minha conta pessoal de desenvolvimento da AWS.


Você também pode se perguntar, bem, é uma implementação legal, mas, é ótima? É a melhor opção de design?

Bem, não.

A função Lambda do consumidor espera e pesquisa o Polly até que sua tarefa de síntese seja concluída, o que é uma prática ruim tanto em termos de desempenho quanto de custo. No entanto, para um projeto POC que é executado uma vez a cada duas semanas (quando publico um novo post), isso é aceitável, pelo menos por enquanto.

Uma solução melhor é usar Step Functions com um estado de espera. Polly pode notificar um tópico SNS quando a tarefa for concluída; esse SNS pode enviar uma mensagem para uma mensagem SQS e então para um Lambda que despertará a função step com um token de espera para continuar enviando o arquivo para meu e-mail.

Então, por que escolhi uma função Lambda em vez de uma implementação de máquina de estados de função degrau? Algumas razões:

  1. O wrapper AWS Polly me permitiu avançar rapidamente e faz tudo no mesmo processo (ele faz o sleep e o poll para você), então a função Lambda é mais simples de usar do que a função step, que não poderá usar o SDK.

  2. Você não pode desenvolver e depurar funções step no IDE, diferentemente das funções Lambda. Eu queria fornecer valor o mais rápido possível para esse caso de uso e obter resultados rapidamente.

  3. É mais sobre fornecer acessibilidade e aprender algo novo, e menos sobre criar a melhor solução possível pronta para produção.

Então, neste caso, você deve usar a máquina de estados da função Step em vez de uma função Lambda?

Sim, claro. Eu farei isso como parte da v2 do serviço, mas contribuições de código também são bem-vindas!


Outra área de melhoria é que não estou usando léxicos ou linguagem de marcação de síntese (SSML), o que permite que os desenvolvedores ajustem a pronúncia, ênfase e entonação da saída de fala. Isso pode mudar o jogo, mas requer mais pesquisa para entender o recurso e como automatizá-lo.


E, por último, tratamento de erros, novas tentativas e testes - ainda precisam ser criados. Testei o código no IDE (chamado de manipulador Lambda com um evento gerado) e durante o tempo de implantação como um teste de ponta a ponta.

Quer saber mais sobre como testar aplicativos Serverless? Confira meu post aqui .

bottom of page