Streaming de texto a voz

Esta guía te muestra cómo transmitir texto a voz y, opcionalmente, subir audio a AWS S3.

Esta guía explica tres enfoques: generar voz como archivo, transmitir la respuesta de audio directamente y, de forma opcional, subir el audio generado a un bucket de AWS S3 para compartirlo mediante una URL firmada.

Esta guía presupone que ya has configurado tu clave de API y el SDK. Completa primero la guía de inicio rápido si aún no lo has hecho. La sección opcional de carga a S3 también requiere una cuenta de AWS con acceso a S3.

¿Tienes curiosidad por saber cómo funciona el streaming? Entender el streaming de audio explica en detalle el protocolo, el almacenamiento en búfer y las compensaciones de latencia.

Convierte texto en voz (archivo)

Para convertir texto en voz y guardarlo como archivo, usaremos el método convert del SDK de ElevenLabs y después lo guardaremos localmente como archivo .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

Después puedes ejecutar esta función con:

text_to_speech_file("Hello World")

Convierte texto en voz (streaming)

Si prefieres transmitir el audio directamente sin guardarlo en un archivo, puedes usar nuestra función 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

Después puedes ejecutar esta función con:

text_to_speech_stream("This is James")

Extra: subir a AWS S3 y obtener un enlace seguro para compartir

Una vez que tus datos de audio se hayan creado como archivo o como flujo, quizá quieras compartirlos con tus usuarios. Una forma de hacerlo es subirlos a un bucket de AWS S3 y generar un enlace seguro para compartirlos.

Para subir los datos a S3, tendrás que añadir el ID de la clave de acceso de AWS, la clave de acceso secreta y el nombre de la región de AWS a tu archivo .env. Sigue estos pasos para encontrar las credenciales:

  1. Inicia sesión en la consola de administración de AWS: ve a la página de inicio de AWS e inicia sesión con tu cuenta.
Inicio de sesión en la consola de AWS
  1. Accede al panel de IAM (Identity and Access Management): puedes encontrar IAM en «Security, Identity, & Compliance» en el menú de servicios. El panel de IAM gestiona de forma segura el acceso a tus servicios de AWS.
Panel de AWS IAM
  1. Crea un usuario nuevo (si es necesario): en el panel de IAM, selecciona «Users» y después «Add user». Introduce un nombre de usuario.
Añadir usuario de AWS IAM
  1. Configura los permisos: asocia políticas directamente al usuario según el nivel de acceso que quieras conceder. Para las cargas en S3, puedes usar la política AmazonS3FullAccess. Sin embargo, se recomienda conceder el mínimo privilegio o los permisos mínimos necesarios para realizar una tarea. Puede que quieras crear una política personalizada que permita específicamente solo las acciones necesarias en tu bucket de S3.
Configurar permisos para un usuario de AWS IAM
  1. Revisa y crea el usuario: revisa la configuración y crea el usuario. Al crearlo, se te mostrarán un ID de clave de acceso y una clave de acceso secreta. Asegúrate de descargar y guardar estas credenciales de forma segura; la clave de acceso secreta no se podrá recuperar después de este paso.
Clave de acceso secreta de AWS
  1. Obtén el nombre de la región de AWS: p. ej., us-east-1
Nombre de la región de AWS

Si no tienes un bucket de AWS S3, tendrás que crear uno nuevo siguiendo estos pasos:

  1. Accede al panel de S3: puedes encontrar S3 en «Storage» en el menú de servicios.
Panel de AWS S3
  1. Crea un bucket nuevo: en el panel de S3, haz clic en el botón «Create bucket».
Haz clic en el botón Create Bucket
  1. Introduce un nombre de bucket y haz clic en el botón «Create bucket». Puedes dejar el resto de opciones del bucket con los valores predeterminados. El bucket recién añadido aparecerá en la lista.
Introduce un nombre para un nuevo bucket de S3
Lista de buckets de S3

Instala boto3 para interactuar con los servicios de AWS mediante pip y npm.

pip install boto3

A continuación, añade las variables de entorno al archivo .env de esta 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

Añade las siguientes funciones para subir el flujo de audio a S3 y generar una URL firmada.

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

Después puedes llamar a la función de carga con el flujo de audio del texto.

s3_file_name = upload_audiostream_to_s3(audio_stream)

Después de subir el archivo de audio a S3, genera una URL firmada para compartir el acceso al archivo. Esta URL tendrá una duración limitada, es decir, caducará después de un periodo determinado, lo que la hace segura para compartirla temporalmente.

Ahora puedes generar una URL a partir de un archivo con:

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

Si quieres usar el archivo varias veces, debes guardar la ruta del archivo de S3 en tu base de datos y regenerar la URL firmada cada vez que la necesites, en lugar de guardar directamente la URL firmada, ya que caducará.

Para unirlo todo, puedes usar el siguiente 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()

Conclusión

Ahora ya sabes cómo convertir texto en voz y generar una URL firmada para compartir el archivo de audio. Esta funcionalidad abre numerosas posibilidades para crear y compartir contenido de forma dinámica.

Estos son algunos ejemplos de lo que podrías crear con ella.

  1. Podcasts educativos: crea contenido educativo personalizado al que el alumnado pueda acceder bajo demanda. El profesorado puede convertir sus lecciones a formato de audio, subirlas a S3 y compartir los enlaces con el alumnado para ofrecer una experiencia de aprendizaje más atractiva fuera del entorno tradicional del aula.

  2. Funciones de accesibilidad para sitios web: mejora la accesibilidad de los sitios web ofreciendo contenido de texto en formato de audio. Esto puede hacer que la información de los sitios web sea más accesible para personas con discapacidad visual o para quienes prefieren el aprendizaje auditivo.

  3. Mensajes automatizados de atención al cliente: crea mensajes de audio automatizados y personalizados para atención al cliente, como preguntas frecuentes o actualizaciones de pedidos. Esto puede ofrecer una experiencia de cliente más atractiva que los correos electrónicos de texto tradicionales.

  4. Audiolibros y narración: convierte libros completos o relatos cortos a formato de audio, ofreciendo al público una nueva forma de disfrutar de la literatura. Autores y editoriales pueden diversificar su oferta de contenido y llegar a quienes prefieren escuchar en lugar de leer.

  5. Herramientas de aprendizaje de idiomas: desarrolla recursos para el aprendizaje de idiomas que proporcionen lecciones y ejercicios de audio. Así es posible practicar la pronunciación y la comprensión auditiva de forma específica.

Próximos pasos