Vai alla navigazione

Streaming da testo a voce

Questa guida mostra come trasmettere da testo a voce in streaming e, facoltativamente, caricare l'audio su AWS S3.

Questa guida illustra tre approcci: generare il parlato come file, trasmettere direttamente la risposta audio in streaming e, facoltativamente, caricare l’audio generato in un bucket AWS S3 per condividerlo tramite un URL firmato.

Questa guida presuppone che tu abbia configurato la chiave API e l’SDK. Completa prima la guida rapida, se non l’hai ancora fatto. La sezione facoltativa sul caricamento su S3 richiede anche un account AWS con accesso a S3.

Ti chiedi perché lo streaming funziona in questo modo? Comprendere lo streaming audio spiega in dettaglio il protocollo, il buffering e i compromessi in termini di latenza.

Converti testo in parlato (file)

Per convertire testo in parlato e salvarlo come file, useremo il metodo convert dell’SDK ElevenLabs e lo salveremo localmente come file .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

Puoi quindi eseguire questa funzione con:

text_to_speech_file("Hello World")

Converti testo in parlato (streaming)

Se preferisci trasmettere l’audio direttamente in streaming senza salvarlo in un file, puoi usare la nostra funzionalità di 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

Puoi quindi eseguire questa funzione con:

text_to_speech_stream("This is James")

Dopo aver creato i dati audio come file o stream, potresti volerli condividere con i tuoi utenti. Un modo per farlo è caricarli in un bucket AWS S3 e generare un link di condivisione sicuro.

Per caricare i dati su S3, dovrai aggiungere l’ID della chiave di accesso AWS, la chiave di accesso segreta e il nome della regione AWS al file .env. Segui questi passaggi per trovare le credenziali:

  1. Accedi alla console di gestione AWS: vai alla pagina iniziale di AWS e accedi con il tuo account.
Accesso alla console AWS
  1. Accedi alla dashboard IAM (Identity and Access Management): puoi trovare IAM in “Security, Identity, & Compliance” nel menu dei servizi. La dashboard IAM gestisce in modo sicuro l’accesso ai tuoi servizi AWS.
Dashboard AWS IAM
  1. Crea un nuovo utente (se necessario): nella dashboard IAM, seleziona “Users” e poi “Add user”. Inserisci un nome utente.
Aggiungi un utente AWS IAM
  1. Imposta le autorizzazioni: collega le policy direttamente all’utente in base al livello di accesso che desideri concedere. Per i caricamenti su S3, puoi usare la policy AmazonS3FullAccess. Tuttavia, è consigliabile applicare il principio del privilegio minimo, ovvero concedere le autorizzazioni minime necessarie per svolgere un’attività. Potresti creare una policy personalizzata che consenta esclusivamente le azioni necessarie sul tuo bucket S3.
Imposta le autorizzazioni per l'utente AWS IAM
  1. Rivedi e crea l’utente: controlla le impostazioni e crea l’utente. Al momento della creazione, riceverai un ID della chiave di accesso e una chiave di accesso segreta. Assicurati di scaricare e salvare queste credenziali in modo sicuro; la chiave di accesso segreta non potrà più essere recuperata dopo questo passaggio.
Chiave di accesso segreta AWS
  1. Ottieni il nome della regione AWS: ad es. us-east-1
Nome della regione AWS

Se non hai un bucket AWS S3, dovrai crearne uno nuovo seguendo questi passaggi:

  1. Accedi alla dashboard S3: puoi trovare S3 in “Storage” nel menu dei servizi.
Dashboard AWS S3
  1. Crea un nuovo bucket: nella dashboard S3, fai clic sul pulsante “Create bucket”.
Fai clic sul pulsante Create Bucket
  1. Inserisci un nome per il bucket e fai clic sul pulsante “Create bucket”. Puoi lasciare le altre opzioni del bucket predefinite. Il bucket appena aggiunto apparirà nell’elenco.
Inserisci un nuovo nome per il bucket S3
Elenco dei bucket S3

Installa boto3 per interagire con i servizi AWS usando pip e npm.

pip install boto3

Poi aggiungi le variabili d’ambiente al file .env in questo modo:

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

Aggiungi le seguenti funzioni per caricare lo stream audio su S3 e generare un URL firmato.

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

Puoi quindi chiamare la funzione di caricamento con lo stream audio del testo.

s3_file_name = upload_audiostream_to_s3(audio_stream)

Dopo aver caricato il file audio su S3, genera un URL firmato per condividere l’accesso al file. Questo URL avrà una durata limitata, ovvero scadrà dopo un certo periodo, rendendolo sicuro per la condivisione temporanea.

Ora puoi generare un URL da un file con:

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

Se vuoi usare il file più volte, dovresti salvare il path del file S3 nel database e rigenerare l’URL firmato ogni volta che ne hai bisogno, invece di salvare direttamente l’URL firmato, perché scadrà.

Per mettere tutto insieme, puoi usare il seguente 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()

Conclusione

Ora sai come convertire il testo in parlato e generare un URL firmato per condividere il file audio. Questa funzionalità offre molte opportunità per creare e condividere contenuti in modo dinamico.

Ecco alcuni esempi di ciò che potresti creare.

  1. Podcast educativi: crea contenuti educativi personalizzati a cui gli studenti possono accedere su richiesta. Gli insegnanti possono convertire le proprie lezioni in formato audio, caricarle su S3 e condividere i link con gli studenti per un’esperienza di apprendimento più coinvolgente al di fuori dell’ambiente scolastico tradizionale.

  2. Funzionalità di accessibilità per siti web: migliora l’accessibilità del sito web offrendo i contenuti testuali in formato audio. Questo può rendere le informazioni sui siti web più accessibili alle persone con disabilità visive o a chi preferisce l’apprendimento uditivo.

  3. Messaggi automatici per l’assistenza clienti: crea messaggi audio automatici e personalizzati per l’assistenza clienti, come FAQ o aggiornamenti sugli ordini. Questo può offrire un’esperienza cliente più coinvolgente rispetto alle tradizionali email di testo.

  4. Audiolibri e narrazione: converti libri interi o racconti brevi in formato audio, offrendo al pubblico un nuovo modo di apprezzare la letteratura. Autori ed editori possono diversificare la propria offerta di contenuti e raggiungere chi preferisce ascoltare anziché leggere.

  5. Strumenti per l’apprendimento delle lingue: sviluppa strumenti per l’apprendimento delle lingue che offrano agli studenti lezioni ed esercizi audio. Questo consente di esercitare in modo mirato la pronuncia e le capacità di ascolto.

Passaggi successivi