Diffuser du texte en parole

Ce guide explique comment diffuser du texte en parole et, si nécessaire, importer l’audio vers AWS S3.

Ce guide présente trois approches : générer de la parole sous forme de fichier, diffuser directement la réponse audio en streaming et, en option, téléverser l’audio généré vers un bucket AWS S3 pour le partager via une URL signée.

Ce guide suppose que vous avez configuré votre clé API et votre SDK. Terminez d’abord le guide de démarrage rapide si ce n’est pas déjà fait. La section facultative consacrée au téléversement vers S3 requiert également un compte AWS avec accès à S3.

Vous vous demandez pourquoi le streaming fonctionne ainsi ? Comprendre le streaming audio explique en détail le protocole, la mise en mémoire tampon et les compromis de latence.

Convertir du texte en parole (fichier)

Pour convertir du texte en parole et l’enregistrer dans un fichier, nous utiliserons la méthode convert du SDK ElevenLabs, puis l’enregistrerons localement au format .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

Vous pouvez ensuite exécuter cette fonction avec :

text_to_speech_file("Hello World")

Convertir du texte en parole (streaming)

Si vous préférez diffuser l’audio directement en streaming sans l’enregistrer dans un fichier, vous pouvez utiliser notre fonctionnalité 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

Vous pouvez ensuite exécuter cette fonction avec :

text_to_speech_stream("This is James")

Bonus : téléverser vers AWS S3 et obtenir un lien de partage sécurisé

Une fois vos données audio créées sous forme de fichier ou de flux, vous souhaiterez peut-être les partager avec vos utilisateurs. Vous pouvez notamment les téléverser vers un bucket AWS S3 et générer un lien de partage sécurisé.

Pour téléverser les données vers S3, vous devez ajouter l’identifiant de votre clé d’accès AWS, votre clé d’accès secrète et le nom de votre région AWS à votre fichier .env. Suivez ces étapes pour trouver ces identifiants :

  1. Connectez-vous à votre console de gestion AWS : accédez à la page d’accueil AWS et connectez-vous avec votre compte.
Connexion à la console AWS
  1. Accédez au Dashboard IAM (Identity and Access Management) : vous trouverez IAM dans la section « Security, Identity, & Compliance » du menu des services. Le Dashboard IAM gère de façon sécurisée l’accès à vos services AWS.
Dashboard AWS IAM
  1. Créez un nouvel utilisateur, si nécessaire : dans le Dashboard IAM, sélectionnez « Users », puis « Add user ». Saisissez un nom d’utilisateur.
Ajouter un utilisateur AWS IAM
  1. Définissez les autorisations : associez directement des stratégies à l’utilisateur selon le niveau d’accès que vous souhaitez accorder. Pour les téléversements vers S3, vous pouvez utiliser la stratégie AmazonS3FullAccess. Il est toutefois recommandé d’accorder le minimum de privilèges, soit uniquement les autorisations nécessaires à l’exécution d’une tâche. Vous pouvez créer une stratégie personnalisée qui autorise uniquement les actions nécessaires sur votre bucket S3.
Définir les autorisations pour un utilisateur AWS IAM
  1. Vérifiez et créez l’utilisateur : vérifiez vos paramètres et créez l’utilisateur. Lors de sa création, vous recevrez un identifiant de clé d’accès et une clé d’accès secrète. Téléchargez et enregistrez ces identifiants de manière sécurisée ; vous ne pourrez plus récupérer la clé d’accès secrète après cette étape.
Clé d'accès secrète AWS
  1. Obtenez le nom de la région AWS : par exemple, us-east-1
Nom de région AWS

Si vous n’avez pas de bucket AWS S3, créez-en un en suivant ces étapes :

  1. Accédez au Dashboard S3 : vous trouverez S3 dans la section « Storage » du menu des services.
Dashboard AWS S3
  1. Créez un bucket : dans le Dashboard S3, cliquez sur le bouton « Create bucket ».
Cliquer sur le bouton Create bucket
  1. Saisissez un nom de bucket et cliquez sur le bouton « Create bucket ». Vous pouvez conserver les valeurs par défaut pour les autres options du bucket. Le bucket nouvellement ajouté apparaîtra dans la liste.
Saisir un nouveau nom de bucket S3
Liste des buckets S3

Installez boto3 pour interagir avec les services AWS à l’aide de pip et npm.

pip install boto3

Ajoutez ensuite les variables d’environnement au fichier .env comme suit :

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

Ajoutez les fonctions suivantes pour téléverser le flux audio vers S3 et générer une URL signée.

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

Vous pouvez ensuite appeler la fonction de téléversement avec le flux audio issu du texte.

s3_file_name = upload_audiostream_to_s3(audio_stream)

Après avoir téléversé le fichier audio vers S3, générez une URL signée pour partager l’accès au fichier. Cette URL est limitée dans le temps, ce qui signifie qu’elle expire après une certaine période et permet un partage temporaire sécurisé.

Vous pouvez maintenant générer une URL à partir d’un fichier avec :

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

Si vous souhaitez utiliser le fichier plusieurs fois, stockez le chemin du fichier S3 dans votre base de données et régénérez l’URL signée chaque fois que nécessaire, plutôt que d’enregistrer directement l’URL signée, car elle expirera.

Pour tout assembler, vous pouvez utiliser le script suivant :

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()

Conclusion

Vous savez désormais convertir du texte en parole et générer une URL signée pour partager le fichier audio. Cette fonctionnalité offre de nombreuses possibilités pour créer et partager du contenu de façon dynamique.

Voici quelques exemples de ce que vous pourriez créer avec cette fonctionnalité.

  1. Podcasts éducatifs : créez du contenu éducatif personnalisé, accessible à la demande par les étudiants. Les enseignants peuvent convertir leurs cours au format audio, les téléverser vers S3 et partager les liens avec leurs étudiants pour une expérience d’apprentissage plus engageante, hors du cadre traditionnel de la salle de classe.

  2. Fonctionnalités d’accessibilité pour les sites web : améliorez l’accessibilité d’un site web en proposant son contenu textuel au format audio. Les informations deviennent ainsi plus accessibles aux personnes malvoyantes ou à celles qui préfèrent l’apprentissage auditif.

  3. Messages automatisés du support client : produisez des messages audio automatisés et personnalisés pour le support client, tels que des FAQ ou des mises à jour de commande. Vous offrez ainsi une expérience client plus engageante que les emails textuels traditionnels.

  4. Livres audio et narration : convertissez des livres entiers ou des nouvelles au format audio pour offrir au public une nouvelle manière de profiter de la littérature. Les auteurs et éditeurs peuvent diversifier leur offre de contenu et atteindre les publics qui préfèrent écouter plutôt que lire.

  5. Outils d’apprentissage des langues : développez des outils d’apprentissage des langues qui proposent aux apprenants des leçons et exercices audio. Ils peuvent ainsi travailler la prononciation et la compréhension orale de façon ciblée.

Prochaines étapes