Streaming zamiany tekstu na mowę

Ten przewodnik pokazuje, jak przesyłać strumieniowo zamianę tekstu na mowę i opcjonalnie przesłać audio do AWS S3.

Ten przewodnik przedstawia trzy podejścia: generowanie mowy jako pliku, bezpośrednie streamowanie odpowiedzi audio oraz opcjonalne przesyłanie wygenerowanego audio do koszyka AWS S3, aby udostępniać je przez podpisany URL.

Ten przewodnik zakłada, że masz już skonfigurowany klucz API i SDK. Jeśli jeszcze tego nie zrobiono, najpierw ukończ szybki start. Opcjonalna sekcja przesyłania do S3 wymaga też konta AWS z dostępem do S3.

Chcesz wiedzieć, dlaczego streaming działa w ten sposób? Jak działa streaming audio szczegółowo wyjaśnia protokół, buforowanie i kompromisy związane z opóźnieniami.

Zamiana tekstu na mowę (plik)

Aby zamienić tekst na mowę i zapisać go jako plik, użyjemy metody convert z SDK ElevenLabs, a następnie zapiszemy wynik lokalnie jako plik .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

Następnie uruchom tę funkcję tak:

text_to_speech_file("Hello World")

Zamiana tekstu na mowę (streaming)

Jeśli wolisz streamować audio bezpośrednio bez zapisywania go do pliku, możesz użyć funkcji streamingu.

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

Następnie uruchom tę funkcję tak:

text_to_speech_stream("This is James")

Dodatkowo — przesyłanie do AWS S3 i uzyskiwanie bezpiecznego linku do udostępniania

Gdy dane audio zostaną utworzone jako plik lub strumień, możesz chcieć udostępnić je użytkownikom. Możesz w tym celu przesłać je do koszyka AWS S3 i wygenerować bezpieczny link do udostępniania.

Aby przesłać dane do S3, musisz dodać identyfikator klucza dostępu AWS, tajny klucz dostępu i nazwę regionu AWS do pliku .env. Aby znaleźć te poświadczenia, wykonaj te kroki:

  1. Zaloguj się do konsoli AWS Management Console: przejdź na stronę główną AWS i zaloguj się na swoje konto.
Logowanie do konsoli AWS
  1. Otwórz panel IAM (Identity and Access Management): IAM znajdziesz w menu usług w sekcji „Security, Identity, & Compliance”. Panel IAM pozwala bezpiecznie zarządzać dostępem do usług AWS.
Panel AWS IAM
  1. Utwórz nowego użytkownika (jeśli to konieczne): w panelu IAM wybierz „Users”, a następnie „Add user”. Wpisz nazwę użytkownika.
Dodawanie użytkownika AWS IAM
  1. Ustaw uprawnienia: przypisz zasady bezpośrednio do użytkownika, zależnie od poziomu dostępu, który chcesz przyznać. Do przesyłania plików do S3 możesz użyć zasady AmazonS3FullAccess. Najlepiej jednak stosować zasadę najmniejszych uprawnień, czyli przyznawać tylko minimalne uprawnienia potrzebne do wykonania zadania. Możesz utworzyć własną zasadę, która zezwala tylko na niezbędne działania w koszyku S3.
Ustawianie uprawnień użytkownika AWS IAM
  1. Sprawdź ustawienia i utwórz użytkownika: sprawdź ustawienia i utwórz użytkownika. Po utworzeniu zobaczysz identyfikator klucza dostępu i tajny klucz dostępu. Pobierz je i bezpiecznie zapisz; po tym kroku nie będzie można ponownie uzyskać tajnego klucza dostępu.
Tajny klucz dostępu AWS
  1. Pobierz nazwę regionu AWS, np. us-east-1
Nazwa regionu AWS

Jeśli nie masz koszyka AWS S3, utwórz nowy, wykonując te kroki:

  1. Otwórz panel S3: S3 znajdziesz w menu usług w sekcji „Storage”.
Panel AWS S3
  1. Utwórz nowy koszyk: w panelu S3 kliknij przycisk „Create bucket”.
Kliknij przycisk Create Bucket
  1. Wpisz nazwę koszyka i kliknij przycisk „Create bucket”. Pozostałe opcje koszyka możesz zostawić domyślne. Nowy koszyk pojawi się na liście.
Wpisz nazwę nowego koszyka S3
Lista koszyków S3

Zainstaluj boto3, aby korzystać z usług AWS przez pip i npm.

pip install boto3

Następnie dodaj zmienne środowiskowe do pliku .env:

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

Dodaj poniższe funkcje, aby przesłać strumień audio do S3 i wygenerować podpisany URL.

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

Możesz teraz wywołać funkcję przesyłania ze strumieniem audio utworzonym z tekstu.

s3_file_name = upload_audiostream_to_s3(audio_stream)

Po przesłaniu pliku audio do S3 wygeneruj podpisany URL, aby udostępnić dostęp do pliku. Ten URL będzie ograniczony czasowo, czyli wygaśnie po określonym czasie, dzięki czemu nadaje się do tymczasowego udostępniania.

Teraz możesz wygenerować URL z pliku:

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

Jeśli chcesz używać pliku wiele razy, zapisz ścieżkę pliku S3 w bazie danych, a następnie generuj podpisany URL za każdym razem, gdy go potrzebujesz. Nie zapisuj bezpośrednio podpisanego URL-a, ponieważ wygaśnie.

Aby połączyć wszystko w całość, użyj poniższego skryptu:

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

Podsumowanie

Wiesz już, jak zamieniać tekst na mowę i generować podpisany URL do udostępniania pliku audio. Ta funkcja daje wiele możliwości dynamicznego tworzenia i udostępniania treści.

Oto kilka przykładów tego, co możesz dzięki niej zbudować.

  1. Podcasty edukacyjne: twórz spersonalizowane treści edukacyjne dostępne dla uczniów na żądanie. Nauczyciele mogą zamieniać lekcje na format audio, przesyłać je do S3 i udostępniać uczniom linki, aby nauka poza tradycyjną klasą była ciekawsza.

  2. Funkcje dostępności na stronach internetowych: zwiększ dostępność strony, oferując treści tekstowe w formacie audio. Dzięki temu informacje na stronach będą bardziej dostępne dla osób z wadami wzroku lub tych, które wolą uczyć się ze słuchu.

  3. Automatyczne wiadomości obsługi klienta: twórz automatyczne i spersonalizowane wiadomości audio dla obsługi klienta, np. odpowiedzi na najczęstsze pytania lub aktualizacje zamówień. Może to zapewnić ciekawsze doświadczenie niż tradycyjne e-maile tekstowe.

  4. Audiobooki i narracja: zamieniaj całe książki lub opowiadania na format audio, oferując odbiorcom nowy sposób na kontakt z literaturą. Autorzy i wydawcy mogą poszerzać ofertę treści i docierać do osób, które wolą słuchać niż czytać.

  5. Narzędzia do nauki języków: twórz materiały do nauki języków, które oferują uczącym się lekcje i ćwiczenia audio. Umożliwia to ukierunkowane ćwiczenie wymowy i rozumienia ze słuchu.

Kolejne kroki