Text to Speech streamen

Dieser Leitfaden zeigt, wie Sie Text to Speech streamen und Audio optional in AWS S3 hochladen.

Dieser Leitfaden behandelt drei Ansätze: Sprache als Datei erzeugen, die Audioantwort direkt streamen und generiertes Audio optional in einen AWS-S3-Bucket hochladen, um es über eine signierte URL zu teilen.

Dieser Leitfaden setzt voraus, dass Sie Ihren API-Schlüssel und Ihr SDK eingerichtet haben. Schließen Sie zuerst die Schnellstartanleitung ab, falls Sie dies noch nicht getan haben. Für den optionalen S3-Upload benötigen Sie außerdem ein AWS-Konto mit Zugriff auf S3.

Möchten Sie wissen, warum Streaming so funktioniert? Audio-Streaming verstehen erläutert das Protokoll, die Pufferung und die Latenz-Kompromisse ausführlich.

Text in Sprache umwandeln (Datei)

Um Text in Sprache umzuwandeln und als Datei zu speichern, verwenden wir die Methode convert des ElevenLabs SDK und speichern sie anschließend lokal als .mp3-Datei.

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

Sie können diese Funktion anschließend wie folgt ausführen:

text_to_speech_file("Hello World")

Text in Sprache umwandeln (Streaming)

Wenn Sie das Audio direkt streamen möchten, ohne es als Datei zu speichern, können Sie unsere Streaming-Funktion verwenden.

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

Sie können diese Funktion anschließend wie folgt ausführen:

text_to_speech_stream("This is James")

Sobald Ihre Audiodaten als Datei oder Stream erstellt wurden, möchten Sie sie möglicherweise mit Ihren Nutzern teilen. Eine Möglichkeit ist, sie in einen AWS-S3-Bucket hochzuladen und einen sicheren Freigabelink zu generieren.

Um die Daten in S3 hochzuladen, müssen Sie Ihre AWS-Zugriffsschlüssel-ID, den geheimen Zugriffsschlüssel und den AWS-Regionsnamen zu Ihrer .env-Datei hinzufügen. So finden Sie die Anmeldedaten:

  1. Melden Sie sich bei Ihrer AWS Management Console an: Navigieren Sie zur AWS-Startseite und melden Sie sich mit Ihrem Konto an.
AWS-Console-Anmeldung
  1. Öffnen Sie das IAM-Dashboard (Identity and Access Management): Sie finden IAM im Servicemenü unter „Security, Identity, & Compliance“. Das IAM-Dashboard verwaltet den Zugriff auf Ihre AWS-Services sicher.
AWS-IAM-Dashboard
  1. Erstellen Sie einen neuen Benutzer (falls erforderlich): Wählen Sie im IAM-Dashboard „Users“ und dann „Add user“. Geben Sie einen Benutzernamen ein.
AWS-IAM-Benutzer hinzufügen
  1. Legen Sie die Berechtigungen fest: Hängen Sie Richtlinien entsprechend der gewünschten Zugriffsebene direkt an den Benutzer an. Für S3-Uploads können Sie die Richtlinie AmazonS3FullAccess verwenden. Es ist jedoch Best Practice, das Prinzip der geringsten Berechtigung anzuwenden, also nur die für eine Aufgabe notwendigen Berechtigungen zu erteilen. Sie sollten eine benutzerdefinierte Richtlinie erstellen, die nur die erforderlichen Aktionen für Ihren S3-Bucket erlaubt.
Berechtigung für AWS-IAM-Benutzer festlegen
  1. Überprüfen und erstellen Sie den Benutzer: Prüfen Sie Ihre Einstellungen und erstellen Sie den Benutzer. Nach der Erstellung erhalten Sie eine Zugriffsschlüssel-ID und einen geheimen Zugriffsschlüssel. Laden Sie diese Anmeldedaten herunter und speichern Sie sie sicher. Der geheime Zugriffsschlüssel kann nach diesem Schritt nicht erneut abgerufen werden.
Geheimer AWS-Zugriffsschlüssel
  1. AWS-Regionsnamen abrufen: z. B. us-east-1
AWS-Regionsname

Falls Sie keinen AWS-S3-Bucket haben, müssen Sie einen neuen erstellen:

  1. Öffnen Sie das S3-Dashboard: Sie finden S3 im Servicemenü unter „Storage“.
AWS-S3-Dashboard
  1. Erstellen Sie einen neuen Bucket: Klicken Sie im S3-Dashboard auf „Create bucket“.
Schaltfläche „Create bucket“ auswählen
  1. Geben Sie einen Bucket-Namen ein und klicken Sie auf „Create bucket“. Sie können die übrigen Bucket-Optionen auf den Standardwerten belassen. Der neue Bucket erscheint in der Liste.
Neuen S3-Bucket-Namen eingeben
S3-Bucket-Liste

Installieren Sie boto3 für die Interaktion mit AWS-Services über pip und npm.

pip install boto3

Fügen Sie dann die Umgebungsvariablen wie folgt zur .env-Datei hinzu:

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

Fügen Sie die folgenden Funktionen hinzu, um den Audiostream in S3 hochzuladen und eine signierte URL zu generieren.

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

Sie können die Upload-Funktion anschließend mit dem Audiostream aus dem Text aufrufen.

s3_file_name = upload_audiostream_to_s3(audio_stream)

Generieren Sie nach dem Hochladen der Audiodatei in S3 eine signierte URL, um Zugriff auf die Datei zu gewähren. Diese URL ist zeitlich begrenzt und läuft nach einem bestimmten Zeitraum ab. Dadurch eignet sie sich für die temporäre Freigabe.

Sie können jetzt mit Folgendem eine URL aus einer Datei generieren:

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

Wenn Sie die Datei mehrfach verwenden möchten, sollten Sie den S3-Dateipfad in Ihrer Datenbank speichern und die signierte URL bei Bedarf jeweils neu generieren, statt die signierte URL direkt zu speichern, da sie abläuft.

Um alles zusammenzuführen, können Sie das folgende Skript verwenden:

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

Fazit

Sie wissen jetzt, wie Sie Text in Sprache umwandeln und eine signierte URL generieren, um die Audiodatei zu teilen. Diese Funktion eröffnet zahlreiche Möglichkeiten, Inhalte dynamisch zu erstellen und zu teilen.

Hier sind einige Beispiele dafür, was Sie damit entwickeln können.

  1. Bildungspodcasts: Erstellen Sie personalisierte Bildungsinhalte, auf die Schüler bei Bedarf zugreifen können. Lehrkräfte können ihren Unterricht in ein Audioformat umwandeln, in S3 hochladen und die Links mit Schülern teilen, um das Lernen außerhalb des klassischen Klassenzimmers interessanter zu gestalten.

  2. Barrierefreiheitsfunktionen für Websites: Verbessern Sie die Barrierefreiheit Ihrer Website, indem Sie Textinhalte als Audio anbieten. So werden Informationen auf Websites für Personen mit Sehbeeinträchtigungen oder für Menschen, die auditives Lernen bevorzugen, zugänglicher.

  3. Automatisierte Kundensupport-Nachrichten: Erstellen Sie automatisierte und personalisierte Audionachrichten für den Kundensupport, etwa FAQs oder Bestellupdates. Das kann im Vergleich zu klassischen Text-E-Mails ein ansprechenderes Kundenerlebnis bieten.

  4. Hörbücher und Vertonung: Wandeln Sie ganze Bücher oder Kurzgeschichten in ein Audioformat um und bieten Sie Ihrem Publikum einen neuen Zugang zu Literatur. Autoren und Verlage können ihr Inhaltsangebot diversifizieren und Menschen erreichen, die lieber hören als lesen.

  5. Sprachlern-Tools: Entwickeln Sie Sprachlernhilfen, die Lernenden Audiolektionen und Übungen bieten. So lassen sich Aussprache und Hörverständnis gezielt trainieren.

Nächste Schritte