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ços | Comprimento do texto | Duração do discurso | Custo Padrão TTS | Custo Neural TTS |
---|---|---|---|---|
1.000 solicitações, 1.000 caracteres por solicitação | 1 milhão de caracteres | ~23 horas, 8 min | $4.00 | $16.00 |
10.000 solicitações, 100 caracteres por solicitação | 1 milhão de caracteres | ~23 horas, 8 min | $4.00 | $16.00 |
Carta de acionistas da Amazon de 2016 | 1.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 destacado | 10k 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:
Buckets S3
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.
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ço | Limite | Descrição |
---|---|---|
Amazon S3 | 5 GB | Infraestrutura de armazenamento de objetos segura, durável e escalável |
Armazenamento Padrão | 5 GB | - |
Solicitações de Recuperação | 20.000 | - |
Solicitações de Envio | 2.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ço | Limite |
---|---|
Armazenamento | 25 GB por mês |
Unidades de capacidade de escrita provisionadas | 25 por mês |
Unidades de capacidade de leitura provisionadas | 25 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
- 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:
- 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.
- Você pode aplicar até cinco léxicos ao texto de entrada.
- 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.
Resources: