Streaming de texto em voz

Este guia mostra como transmitir texto em voz e, opcionalmente, enviar o áudio para o AWS S3.

Este guia aborda três abordagens: gerar voz como um arquivo, transmitir a resposta de áudio diretamente e, opcionalmente, enviar o áudio gerado para um bucket do AWS S3 para compartilhá-lo por meio de uma URL assinada.

Este guia pressupõe que você já configurou sua chave de API e o SDK. Conclua o guia de início rápido primeiro, caso ainda não tenha feito isso. A seção opcional de envio para o S3 também exige uma conta da AWS com acesso ao S3.

Quer saber por que o streaming funciona dessa forma? Entenda o streaming de áudio explica em detalhes o protocolo, o buffering e os impactos na latência.

Converter texto em voz (arquivo)

Para converter texto em voz e salvá-lo como arquivo, usaremos o método convert do SDK da ElevenLabs e o salvaremos localmente como um arquivo .mp3.

import os
import uuid
from dotenv import load_dotenv
from elevenlabs import VoiceSettings
from elevenlabs.client import ElevenLabs
load_dotenv()
ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")
elevenlabs = ElevenLabs(
api_key=ELEVENLABS_API_KEY,
)
def text_to_speech_file(text: str) -> str:
# Calling the text_to_speech conversion API with detailed parameters
response = elevenlabs.text_to_speech.convert(
voice_id="pNInz6obpgDQGcFmaJgB", # Adam pre-made voice
output_format="mp3_22050_32",
text=text,
model_id="eleven_flash_v2_5", # use the flash model for low latency
# Optional voice settings that allow you to customize the output
voice_settings=VoiceSettings(
stability=0.0,
similarity_boost=1.0,
style=0.0,
use_speaker_boost=True,
speed=1.0,
),
)
# uncomment the line below to play the audio back
# play(response)
# Generating a unique file name for the output MP3 file
save_file_path = f"{uuid.uuid4()}.mp3"
# Writing the audio to a file
with open(save_file_path, "wb") as f:
for chunk in response:
if chunk:
f.write(chunk)
print(f"{save_file_path}: A new audio file was saved successfully!")
# Return the path of the saved audio file
return save_file_path

Depois, execute esta função com:

text_to_speech_file("Hello World")

Converter texto em voz (streaming)

Se preferir transmitir o áudio diretamente sem salvá-lo em um arquivo, você pode usar nosso recurso de streaming.

import os
from typing import IO
from io import BytesIO
from dotenv import load_dotenv
from elevenlabs import VoiceSettings
from elevenlabs.client import ElevenLabs
load_dotenv()
ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")
elevenlabs = ElevenLabs(
api_key=ELEVENLABS_API_KEY,
)
def text_to_speech_stream(text: str) -> IO[bytes]:
# Perform the text-to-speech conversion
response = elevenlabs.text_to_speech.stream(
voice_id="pNInz6obpgDQGcFmaJgB", # Adam pre-made voice
output_format="mp3_22050_32",
text=text,
model_id="eleven_multilingual_v2",
# Optional voice settings that allow you to customize the output
voice_settings=VoiceSettings(
stability=0.0,
similarity_boost=1.0,
style=0.0,
use_speaker_boost=True,
speed=1.0,
),
)
# Create a BytesIO object to hold the audio data in memory
audio_stream = BytesIO()
# Write each chunk of audio data to the stream
for chunk in response:
if chunk:
audio_stream.write(chunk)
# Reset stream position to the beginning
audio_stream.seek(0)
# Return the stream for further use
return audio_stream

Depois, execute esta função com:

text_to_speech_stream("This is James")

Depois que seus dados de áudio forem criados como arquivo ou stream, você talvez queira compartilhá-los com seus usuários. Uma forma de fazer isso é enviá-los para um bucket do AWS S3 e gerar um link seguro de compartilhamento.

Para enviar os dados ao S3, você precisará adicionar o ID da chave de acesso da AWS, a chave de acesso secreta e o nome da região da AWS ao seu arquivo .env. Siga estas etapas para encontrar as credenciais:

  1. Faça login no AWS Management Console: acesse a página inicial da AWS e entre com sua conta.
Login no Console da AWS
  1. Acesse o painel do IAM (Identity and Access Management): você encontra o IAM em “Security, Identity, & Compliance” no menu de serviços. O painel do IAM gerencia com segurança o acesso aos seus serviços da AWS.
Painel do AWS IAM
  1. Crie um novo usuário (se necessário): no painel do IAM, selecione “Users” e depois “Add user”. Digite um nome de usuário.
Adicionar usuário do AWS IAM
  1. Defina as permissões: anexe políticas diretamente ao usuário de acordo com o nível de acesso que deseja conceder. Para envios ao S3, você pode usar a política AmazonS3FullAccess. No entanto, a prática recomendada é conceder o menor privilégio, ou seja, as permissões mínimas necessárias para realizar uma tarefa. Talvez você queira criar uma política personalizada que permita apenas as ações necessárias no seu bucket do S3.
Definir permissão para usuário do AWS IAM
  1. Revise e crie o usuário: revise suas configurações e crie o usuário. Após a criação, você receberá um ID de chave de acesso e uma chave de acesso secreta. Baixe e salve essas credenciais em segurança; a chave de acesso secreta não poderá ser recuperada novamente após esta etapa.
Chave secreta de acesso da AWS
  1. Obtenha o nome da região da AWS: por exemplo, us-east-1
Nome da região da AWS

Se você não tiver um bucket do AWS S3, precisará criar um seguindo estas etapas:

  1. Acesse o painel do S3: você encontra o S3 em “Storage” no menu de serviços.
Painel do AWS S3
  1. Crie um novo bucket: no painel do S3, clique no botão “Create bucket”.
Clique no botão Criar bucket
  1. Insira um nome para o bucket e clique no botão “Create bucket”. Você pode deixar as outras opções do bucket com os valores padrão. O bucket recém-adicionado aparecerá na lista.
Insira um novo nome de bucket do S3
Lista de buckets do S3

Instale o boto3 para interagir com serviços da AWS usando pip e npm.

pip install boto3

Em seguida, adicione as variáveis de ambiente ao arquivo .env desta forma:

AWS_ACCESS_KEY_ID=your_aws_access_key_id_here
AWS_SECRET_ACCESS_KEY=your_aws_secret_access_key_here
AWS_REGION_NAME=your_aws_region_name_here
AWS_S3_BUCKET_NAME=your_s3_bucket_name_here

Adicione as funções a seguir para enviar o stream de áudio ao S3 e gerar uma URL assinada.

import os
import boto3
import uuid
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
AWS_REGION_NAME = os.getenv("AWS_REGION_NAME")
AWS_S3_BUCKET_NAME = os.getenv("AWS_S3_BUCKET_NAME")
session = boto3.Session(
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
region_name=AWS_REGION_NAME,
)
s3 = session.client("s3")
def generate_presigned_url(s3_file_name: str) -> str:
signed_url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": AWS_S3_BUCKET_NAME, "Key": s3_file_name},
ExpiresIn=3600,
) # URL expires in 1 hour
return signed_url
def upload_audiostream_to_s3(audio_stream) -> str:
s3_file_name = f"{uuid.uuid4()}.mp3" # Generates a unique file name using UUID
s3.upload_fileobj(audio_stream, AWS_S3_BUCKET_NAME, s3_file_name)
return s3_file_name

Depois, você pode chamar a função de envio com o stream de áudio do texto.

s3_file_name = upload_audiostream_to_s3(audio_stream)

Após enviar o arquivo de áudio ao S3, gere uma URL assinada para compartilhar o acesso ao arquivo. Essa URL terá tempo limitado, ou seja, expirará após determinado período, o que a torna segura para compartilhamento temporário.

Agora você pode gerar uma URL a partir de um arquivo com:

signed_url = generate_presigned_url(s3_file_name)
print(f"Signed URL to access the file: {signed_url}")

Se quiser usar o arquivo várias vezes, armazene o caminho do arquivo no S3 no seu banco de dados e gere novamente a URL assinada sempre que precisar, em vez de salvar a URL assinada diretamente, pois ela expirará.

Para juntar tudo, você pode usar o seguinte script:

import os
from dotenv import load_dotenv
load_dotenv()
from text_to_speech_stream import text_to_speech_stream
from s3_uploader import upload_audiostream_to_s3, generate_presigned_url
def main():
text = "This is James"
audio_stream = text_to_speech_stream(text)
s3_file_name = upload_audiostream_to_s3(audio_stream)
signed_url = generate_presigned_url(s3_file_name)
print(f"Signed URL to access the file: {signed_url}")
if __name__ == "__main__":
main()

Conclusão

Agora você sabe como converter texto em voz e gerar uma URL assinada para compartilhar o arquivo de áudio. Essa funcionalidade abre diversas possibilidades para criar e compartilhar conteúdo de forma dinâmica.

Veja alguns exemplos do que você pode criar com isso.

  1. Podcasts educacionais: crie conteúdo educacional personalizado que os alunos possam acessar sob demanda. Professores podem converter suas aulas para o formato de áudio, enviá-las ao S3 e compartilhar os links com os alunos para uma experiência de aprendizagem mais envolvente fora do ambiente tradicional da sala de aula.

  2. Recursos de acessibilidade para sites: melhore a acessibilidade de sites oferecendo conteúdo textual em formato de áudio. Isso pode tornar as informações dos sites mais acessíveis para pessoas com deficiência visual ou que preferem aprender ouvindo.

  3. Mensagens automatizadas de suporte ao cliente: produza mensagens de áudio automatizadas e personalizadas para suporte ao cliente, como FAQs ou atualizações de pedidos. Isso pode proporcionar uma experiência mais envolvente ao cliente em comparação com e-mails de texto tradicionais.

  4. Audiolivros e narração: converta livros inteiros ou contos em formato de áudio, oferecendo uma nova forma de o público aproveitar a literatura. Autores e editoras podem diversificar sua oferta de conteúdo e alcançar públicos que preferem ouvir a ler.

  5. Ferramentas de aprendizado de idiomas: desenvolva recursos de aprendizado de idiomas que ofereçam aulas e exercícios em áudio. Isso possibilita praticar a pronúncia e as habilidades de escuta de forma direcionada.

Próximas etapas