Ir para a navegação

Streaming de texto em fala

Este guia mostra como fazer streaming de texto em fala e, opcionalmente, enviar áudio para o AWS S3.

Este guia aborda três abordagens: gerar fala 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 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 AWS com acesso ao S3.

Quer saber por que o streaming funciona dessa forma? Entenda o streaming de áudio explica detalhadamente o protocolo, o buffer e as compensações de latência.

Converter texto em fala (arquivo)

Para converter texto em fala e salvá-lo como arquivo, vamos usar o método convert do SDK da ElevenLabs e então salvá-lo 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

Você pode executar essa função com:

text_to_speech_file("Hello World")

Converter texto em fala (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

Você pode executar essa função com:

text_to_speech_stream("This is James")

Depois que os dados de áudio forem criados como arquivo ou stream, talvez você 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 para 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 AWS ao 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 AWS.
Painel do AWS IAM
  1. Crie um novo usuário (se necessário): no painel do IAM, selecione “Users” e depois “Add user”. Insira 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, apenas as permissões mínimas necessárias para executar uma tarefa. Talvez seja melhor criar uma política personalizada que permita especificamente 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, serão exibidos um ID de chave de acesso e uma chave de acesso secreta. Baixe e salve essas credenciais com segurança; a chave de acesso secreta não poderá ser recuperada novamente após esta etapa.
Chave secreta de acesso AWS
  1. Obtenha o nome da região AWS: ex.: us-east-1
Nome da região 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 o nome de um novo bucket do S3
Lista de buckets do S3

Instale o boto3 para interagir com serviços 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 gerado a partir 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, tornando-a 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 script a seguir:

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 fala e gerar uma URL assinada para compartilhar o arquivo de áudio. Essa funcionalidade abre várias 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 em formato de áudio, enviá-las ao S3 e compartilhar os links com os alunos para uma experiência de aprendizado mais envolvente fora do ambiente tradicional de sala de aula.

  2. Recursos de acessibilidade para sites: melhore a acessibilidade de sites oferecendo conteúdo em texto no formato de áudio. Isso pode tornar as informações dos sites mais acessíveis a 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 o suporte ao cliente, como perguntas frequentes ou atualizações de pedidos. Isso pode proporcionar uma experiência mais envolvente ao cliente em comparação com e-mails tradicionais em texto.

  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 aos alunos lições e exercícios em áudio. Isso permite praticar pronúncia e compreensão auditiva de forma direcionada.

Próximas etapas