Skip to navigation

Tekst naar spraak streamen

In deze handleiding leer je hoe je tekst naar spraak streamt en audio optioneel uploadt naar AWS S3.

Deze handleiding behandelt drie manieren: spraak genereren als bestand, het audioantwoord rechtstreeks streamen en gegenereerde audio optioneel uploaden naar een AWS S3-bucket om deze te delen via een ondertekende URL.

Deze handleiding gaat ervan uit dat je je API-sleutel en SDK hebt ingesteld. Voltooi eerst de quickstart als je dat nog niet hebt gedaan. Voor het optionele gedeelte over S3-upload heb je ook een AWS-account met toegang tot S3 nodig.

Benieuwd waarom streaming werkt zoals het werkt? Audio-streaming begrijpen legt het protocol, buffering en de afwegingen rond latency uitgebreid uit.

Tekst omzetten naar spraak (bestand)

Om tekst om te zetten naar spraak en deze als bestand op te slaan, gebruiken we de methode convert van de ElevenLabs SDK en slaan we deze vervolgens lokaal op als een .mp3-bestand.

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

Je kunt deze functie vervolgens uitvoeren met:

text_to_speech_file("Hello World")

Tekst omzetten naar spraak (streaming)

Als je de audio liever rechtstreeks streamt zonder deze op te slaan in een bestand, kun je onze streamingfunctie gebruiken.

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

Je kunt deze functie vervolgens uitvoeren met:

text_to_speech_stream("This is James")

Zodra je audiogegevens zijn gemaakt als bestand of stream, wil je deze misschien delen met je gebruikers. Een manier om dit te doen, is ze uploaden naar een AWS S3-bucket en een beveiligde deellink genereren.

Om de gegevens naar S3 te uploaden, moet je je AWS access key ID, secret access key en AWS-regionaam toevoegen aan je .env-bestand. Volg deze stappen om de inloggegevens te vinden:

  1. Log in bij je AWS Management Console: ga naar de AWS-homepagina en log in met je account.
Inloggen bij AWS Console
  1. Open het IAM-dashboard (Identity and Access Management): je vindt IAM onder “Security, Identity, & Compliance” in het servicesmenu. Het IAM-dashboard beheert de toegang tot je AWS-services op een veilige manier.
AWS IAM-dashboard
  1. Maak een nieuwe gebruiker (indien nodig): selecteer in het IAM-dashboard “Users” en daarna “Add user”. Voer een gebruikersnaam in.
AWS IAM-gebruiker toevoegen
  1. Stel de rechten in: koppel policies rechtstreeks aan de gebruiker volgens het toegangsniveau dat je wilt verlenen. Voor S3-uploads kun je de policy AmazonS3FullAccess gebruiken. Het is echter een best practice om het principe van least privilege toe te passen, dus alleen de minimale rechten te verlenen die nodig zijn om een taak uit te voeren. Misschien wil je een aangepaste policy maken die specifiek alleen de benodigde acties voor je S3-bucket toestaat.
Rechten instellen voor AWS IAM-gebruiker
  1. Controleer en maak de gebruiker: controleer je instellingen en maak de gebruiker. Na het maken krijg je een access key ID en een secret access key te zien. Download deze inloggegevens en bewaar ze veilig; je kunt de secret access key na deze stap niet opnieuw ophalen.
AWS Access Secret Key
  1. Vraag de AWS-regionaam op: bijv. us-east-1
AWS-regionaam

Als je geen AWS S3-bucket hebt, moet je een nieuwe maken door deze stappen te volgen:

  1. Open het S3-dashboard: je vindt S3 onder “Storage” in het servicesmenu.
AWS S3-dashboard
  1. Maak een nieuwe bucket: klik in het S3-dashboard op de knop “Create bucket”.
Klik op de knop Create Bucket
  1. Voer een bucketnaam in en klik op de knop “Create bucket”. Je kunt de andere bucketopties op de standaardwaarden laten staan. De nieuw toegevoegde bucket verschijnt in de lijst.
Een nieuwe S3-bucketnaam invoeren
S3-bucketlijst

Installeer boto3 om met AWS-services te werken via pip en npm.

pip install boto3

Voeg vervolgens de omgevingsvariabelen als volgt toe aan het .env-bestand:

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

Voeg de volgende functies toe om de audiostream naar S3 te uploaden en een ondertekende URL te genereren.

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

Je kunt vervolgens de uploadfunctie aanroepen met de audiostream uit de tekst.

s3_file_name = upload_audiostream_to_s3(audio_stream)

Genereer na het uploaden van het audiobestand naar S3 een ondertekende URL om toegang tot het bestand te delen. Deze URL is tijdelijk en verloopt na een bepaalde periode, waardoor deze veilig is voor tijdelijk delen.

Je kunt nu een URL uit een bestand genereren met:

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

Als je het bestand meerdere keren wilt gebruiken, moet je het S3-bestandspad in je database opslaan en de ondertekende URL telkens opnieuw genereren wanneer je die nodig hebt, in plaats van de ondertekende URL rechtstreeks op te slaan, want deze verloopt.

Om alles samen te brengen, kun je het volgende script gebruiken:

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

Conclusie

Je weet nu hoe je tekst omzet in spraak en een ondertekende URL genereert om het audiobestand te delen. Deze functionaliteit biedt veel mogelijkheden om dynamisch content te maken en te delen.

Hier zijn enkele voorbeelden van wat je hiermee kunt bouwen.

  1. Educatieve podcasts: maak gepersonaliseerde educatieve content die studenten op aanvraag kunnen beluisteren. Docenten kunnen hun lessen omzetten naar audioformaat, uploaden naar S3 en de links delen met studenten voor een boeiendere leerervaring buiten het traditionele klaslokaal.

  2. Toegankelijkheidsfuncties voor websites: verbeter de toegankelijkheid van websites door tekstcontent in audioformaat aan te bieden. Zo wordt informatie op websites toegankelijker voor mensen met een visuele beperking of voor mensen die liever via audio leren.

  3. Geautomatiseerde klantenserviceberichten: maak geautomatiseerde en gepersonaliseerde audioberichten voor klantenservice, zoals veelgestelde vragen of bestelupdates. Dit kan een boeiendere klantervaring bieden dan traditionele e-mails met tekst.

  4. Luisterboeken en vertelling: zet volledige boeken of korte verhalen om naar audioformaat en bied je publiek een nieuwe manier om literatuur te beleven. Auteurs en uitgevers kunnen hun contentaanbod uitbreiden en een publiek bereiken dat liever luistert dan leest.

  5. Hulpmiddelen voor taalonderwijs: ontwikkel hulpmiddelen voor het leren van talen die cursisten audiolessen en oefeningen bieden. Daarmee kunnen ze gericht uitspraak en luistervaardigheid oefenen.

Volgende stappen