Aprenda a usar as ferramentas serverless da AWS para sintetizar texto em arquivos de áudio de fala semelhante à humana, tudo escrito em TypeScript e implantado com o AWS CDK.

No mundo do desenvolvimento cloud native, ‘serverless’ é um termo mágico. Ele não só simplifica a arquitetura de aplicações (embora essa afirmação possa ser controversa), mas também reduz significativamente os custos operacionais. Hoje, vou mostrar como construir um pipeline de Texto para Fala (Text-to-Speech) serverless usando o AWS Cloud Development Kit (CDK), escrito em TypeScript. Esta solução é um exemplo prático de como o AWS CDK simplifica o desenvolvimento, implantação e gerenciamento de recursos AWS de uma maneira eficiente e “na moda”.

Estou entusiasmado para compartilhar com vocês como eu brinquei com o AWS CDK para construir esta solução serverless em apenas alguns minutos. Este projeto foi uma incrível oportunidade para criar uma ferramenta útil e ganhar entendimento sobre o funcionamento do CDK.

Tendo tido alguma experiência com o CloudFormation e Terraform, achei a transição para o CDK intrigante. O CDK permite que você defina seus recursos de nuvem na linguagem de programação com a qual se sente confortável, tornando todo o processo de desenvolvimento mais intuitivo. Por meio desta experiência prática, exploraremos o serviço Amazon Polly, que abordaremos nos próximos tópicos.

O que é o AWS CDK?

Antes de mergulharmos nos detalhes de nossa aplicação, permita-me apresentar o AWS CDK. AWS CDK é um framework de desenvolvimento de software de código aberto para definir infraestrutura de nuvem como código (IaC) e provisioná-la através do AWS CloudFormation. Ele permite que você defina seus recursos de nuvem usando linguagens de programação familiares, proporcionando as vantagens da robustez, flexibilidade e poder dessas linguagens.

Os conceitos chave no CDK são Stacks e Constructs.

Stacks

Uma stack no AWS CDK é uma unidade de implantação. Cada stack que você define com o AWS CDK é transpilada para uma stack do CloudFormation e implantada como uma unidade atômica.

Constructs

Por outro lado, os Constructs são os blocos de construção básicos dos aplicativos AWS CDK. Um construct representa um “componente de nuvem” e encapsula tudo que o AWS CloudFormation precisa para criar o componente.

Ao combinar esses conceitos, você pode decompor sua aplicação serverless em unidades gerenciáveis, simplificando o processo de construção de recursos de nuvem complexos.

O que é o Amazon Polly?

Agora, vamos falar sobre o Amazon Polly, que está no coração de nossa aplicação. Amazon Polly é um serviço que transforma texto em fala realista. Ele usa tecnologias de deep learning avançadas para sintetizar a fala que soa como uma voz humana.

Em nossa função de Texto para Fala, nós aproveitamos o Amazon Polly para ler os arquivos de texto e convertê-los em áudio.

Amazon Polly pricing

Para as vozes padrão da Amazon Polly, o nível gratuito inclui 5 milhões de caracteres por mês para discurso (~119 horas). Para vozes neurais, o nível gratuito inclui 1 milhão de caracteres por mês para discurso (~23 horas).

O preço pode variar de acordo com o número de caracteres sintetizados e o modelo que você usa, aqui está a tabela de exemplos de preços da página oficial de preços da Amazon Polly:

Exemplos de preçosComprimento do textoDuração do discursoCusto Padrão TTSCusto Neural TTS
1.000 solicitações, 1.000 caracteres por solicitação1 milhão de caracteres~23 horas, 8 min$4.00$16.00
10.000 solicitações, 100 caracteres por solicitação1 milhão de caracteres~23 horas, 8 min$4.00$16.00
Carta de acionistas da Amazon de 20161.3k caracteres, uma página~1 min. 40 seg$0.005$0.021
Mensagem de e-mail média~3.1k caracteres~4 min$0.01$0.05
Artigo de notícias típico~6.5k caracteres, três páginas~9 min$0.03$0.10
“Um Conto de Natal” de Charles Dickens~165k caracteres, 64 páginas~3 horas 50 min$0.66$2.64
Contação de histórias com texto destacado para crianças: - Comprimento do texto para a história: 10k caracteres - Necessidade de marcas de fala para sincronizar o texto destacado10k caracteres de fala sintetizada 10k caracteres de dados de marcas de fala~13 min$0.08$0.32

Pipeline Texto para Fala

A interação entre os recursos forma um pipeline de conversão de texto para fala. Quando um arquivo de texto é adicionado ao Bucket de Texto, ele dispara uma série de eventos que resultam na criação de um arquivo de áudio no Bucket de Áudio e na atualização dos metadados na tabela DynamoDB. Vamos detalhar:

Descrição da imagem

Buckets S3

  1. Bucket de Texto: Este bucket é usado para armazenar os arquivos de texto que serão convertidos em fala. Quando um novo arquivo de texto é adicionado a este bucket, ele dispara uma mensagem para a Fila de Processamento.

  2. Bucket de Áudio: Este bucket é usado para armazenar os arquivos de áudio que são o resultado da conversão de texto para fala.

Ambos os buckets têm versionamento desativado, usam criptografia gerenciada pelo S3 e bloqueiam todo o acesso público.

Elegível para o nível gratuito:

ServiçoLimiteDescrição
Amazon S35 GBInfraestrutura de armazenamento de objetos segura, durável e escalável
Armazenamento Padrão5 GB-
Solicitações de Recuperação20.000-
Solicitações de Envio2.000-

Tabela DynamoDB

Uma tabela DynamoDB chamada MetadataTable é criada para armazenar metadados sobre os arquivos de texto e áudio e o status da conversão. Ela usa o modo de faturamento pay-per-request, o que significa que você só é cobrado pelas leituras e gravações que seu aplicativo realiza na tabela.

Sempre gratuito nesta configuração:

ServiçoLimite
Armazenamento25 GB por mês
Unidades de capacidade de escrita provisionadas25 por mês
Unidades de capacidade de leitura provisionadas25 por mês

Fila SQS

Uma fila SQS chamada ProcessingQueue é criada para gerenciar o processamento dos arquivos de texto. Quando um novo arquivo de texto é adicionado ao Bucket de Texto, uma mensagem é enviada para esta fila. O tempo de visibilidade para a fila é definido como 300 segundos, o que significa que uma mensagem recebida desta fila será invisível para outros componentes receptores por 300 segundos.

Gratuito neste nível:

Você pode começar a usar o Amazon SQS gratuitamente. Todos os clientes podem fazer 1 milhão de solicitações da Amazon SQS gratuitamente por mês. Alguns aplicativos podem ser capazes de operar dentro deste limite do nível gratuito.

Funções Lambda

  1. Função Texto para Fala: Esta função é acionada por mensagens na fila SQS. Ela lê o arquivo de texto do Bucket de Texto, chama a API SynthesizeSpeech da Amazon Polly e salva o áudio mp3 resultante no bucket de áudio. Ela também atualiza os metadados na tabela DynamoDB com o status da conversão e os metadados do áudio. Esta função tem acesso de leitura ao Bucket de Texto, acesso de leitura e gravação à tabela DynamoDB, acesso de gravação ao Bucket de Áudio e permissão para usar a Amazon Polly para síntese de fala.

Elegível para o nível gratuito

1 milhão de solicitações gratuitas por mês com o AWS Free Tier

Para garantir que trabalhamos dentro das limitações da API SynthesizeSpeech, é importante notar as seguintes restrições:

  1. O texto de entrada não deve exceder 3000 caracteres faturáveis (6000 caracteres totais). Vale mencionar que as tags SSML não são contadas como caracteres faturáveis.
  2. Você pode aplicar até cinco léxicos ao texto de entrada.
  3. A transmissão de áudio de saída, ou síntese, é limitada a um máximo de 10 minutos. Se o texto exceder esse limite, qualquer fala restante será cortada.

Para superar essas limitações, uma opção alternativa é utilizar a API SpeechSynthesisTask, que é assíncrona. Esta API permite que o Polly coloque o áudio diretamente no bucket s3 designado. Para obter mais informações detalhadas, consulte a documentação oficial.

Usando o AWS CDK, podemos modelar esses recursos como pilhas e construções, permitindo-nos construir, replicar e gerenciar a infraestrutura de forma eficiente.

Implementando com CDK

Antes de poder implementar este projeto, você precisa ter o AWS CDK instalado. Se ainda não o instalou, você pode fazê-lo executando npm install -g aws-cdk. Você também precisa ter suas credenciais AWS configuradas. Você pode seguir o Guia de Introdução ao AWS CDK para obter mais informações.

Uma vez que você tenha o AWS CDK instalado e suas credenciais configuradas, você pode implementar o projeto seguindo estas etapas:

  • Clone o repositório: git clone git@github.com:brenonaraujo/aws-cdk-serverless-text-to-speech.git

  • Navegue até o diretório do projeto: cd aws-cdk-serverless-text-to-speech

  • Instale as dependências: npm install

  • Compile o código TypeScript: npm run build

  • Implemente a pilha: cdk deploy

Por favor, note que o comando cdk deploy criará recursos reais em sua conta AWS e pode incorrer em custos se você estiver fora do período de nível gratuito (12 meses após a criação da conta).

Uma vez concluído, você pode simplesmente destruir todos os recursos criados: cdk destroy

Testando nosso aplicativo

Após o processo de implementação ter terminado, você agora pode ir à sua conta e encontrar o bucket de texto e colocar um arquivo de texto nele. Após alguns segundos, você deve ver seu arquivo de áudio no bucket de áudio.

Pensamentos Finais e Exploração Futura

Esta jornada com o AWS CDK foi esclarecedora. Ela nos permitiu desconstruir aplicações complexas em componentes gerenciáveis, simplificando assim a criação, manutenção e compreensão de soluções serverless.

O Amazon Polly se tornou outro ativo valioso. Algumas semanas atrás, eu estava considerando pagar por um SaaS que oferece exatamente o que podemos alcançar com o Amazon Polly por 23 horas mensais sem nenhum custo inicial. É quase como dizer que podemos sintetizar um livro por mês em um nível gratuito (lembre-se de respeitar as leis de direitos autorais).

Obrigado por me acompanhar nesta jornada. Sinta-se à vontade para compartilhar qualquer feedback.

Na segunda parte deste artigo vc irá encontrar detalhes sobre a implementação utilizando a CDK e typescript

Resources: