Neue OpenAI Sprachmodelle: Verbesserte OpenAI Text-to-Speech Funktionalitäten unter Python genutzt

()

Vor etwa einem Jahr habe ich mir die Text-to-Speech Funktion von OpenAI angeschaut. Die Sprachausgabe war damals noch verbesserungswürdig. Mittlerweile hat OpenAI die sogenannte Realtime API veröffentlicht, mit der relative verzögerungsfrei Gespräche in höherer Qualität möglich sind. Sicherlich werden viele Lernanbieter bald auf diese neuen Funktionen aufspringen – spätestens wenn die Preise sinken.

Durch diese neuen Funktionalitäten gibt es nun über einen kleinen Umweg Zugang zu den verbesserten Stimmen. Dies funktioniert über sogenannte Chat-Completions. Das bedeutet, dass kein klassisches Text-To-Speech angeboten wird. Stattdessen reagiert ein spezielles GPT-Modell auf ein Prompt mit Audioausgaben. Instruiert man GPT nun durch ein entsprechendes Systemprompt nur einen bestimmten Text zu sprechen, kann man das Modell auch für einfache Text-to-Speech Anwendungen nutzen.

Spezifische Anweisungen zur Sprechweise möglich

Das Besondere bei der neuen Funktionsweise ist, dass mit dem Systemprompt auch spezifische Anweisungen zur Sprechweise mitgegeben werden können. Im einfachsten Fall kann so die zu verwendende Sprache angegeben werden. Aber man kann auch weitere Anweisungen geben und Dinge wie die Stimmung der Person oder die Sprechgeschwindigkeit festlegen.

Demo Video

Hier ist ein kurzes Demo-Video, das einige Beispiele der neuen Funktionen zeigt. Unter anderem habe ich mit mäßigem Erfolg versucht über Anweisungen deutschsprachige Dialekte zu verwenden. Aber schaut es euch am besten selbst an:

Wie kann die API verwendet werden

Zunächst musst du sicherstellen, dass das OpenAI-Modul aktuell ist. Aktualisiere es zum Beispiel mit dem Befehl: pip install --upgrade openai

Danach wird der Client initialisiert und die notwendigen Module geladen. Achte darauf, dass ein OpenAI API Key benötigt wird, der am besten in einer Umgebungsvariable gespeichert wird (siehe Kommentar).

from openai import OpenAI
client = OpenAI()
import base64

# set the Environment variable OPEN_API_KEY to your API key or use this code (and uncomment):
# client = OpenAI(
#    api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", # put your key here
#)

Als Nächstes wird die Funktion create_speech() definiert. Dieser Funktion kannst du als Parameter einen Text für die Sprachausgabe, einen Systemprompt, einen Dateinamen und eine Stimme mitgeben. Der Text wird durch den Aufruf in eine mp3-Datei umgewandelt.

Die neuen verfügbaren Stimmen heißen: ash, ballad, coral, sage und verse.

def create_speech(tts_text,system,path,voice="alloy",model="gpt-4o-audio-preview"):
    """
    Erzeugt eine Sprachdatei im MP3-Format aus einem gegebenen Text mittels eines Sprachsynthese-Modells.

    Diese Funktion nutzt ein Chat-basiertes Sprachsynthese-Modell, um einen Text in eine Audiodatei umzuwandeln.
    Die Audiodatei wird am angegebenen Pfad gespeichert.

    Parameter:
    tts_text (str): Der Text, der in Sprache umgewandelt werden soll.
    system (str): Systemnachricht, die den Kontext für das Sprachsynthese-Modell bereitstellt.
    path (str): Der Dateipfad, an dem die erzeugte MP3-Datei gespeichert wird.
    voice (str, optional): Die Stimme, die für die Sprachausgabe verwendet werden soll. Standardwert ist "alloy".
                           Verfügbare Stimmen sind: ["alloy", "echo", "shimmer", "ash", "ballad", "coral", "sage", "verse"]
    model (str, optional): Das Modell, das für die Sprachsynthese verwendet werden soll. Standardwert ist "gpt-4o-audio-preview".

    Rückgabewert:
    None: Die erzeugte MP3-Datei wird am angegebenen Pfad gespeichert.

    Beispiel:
    create_speech("Sage: Hallo Welt", 
                  "You are a helpful assistant that can generate audio from text. Speak in German language. Say exactly what you get as text input - nothing else.", 
                  "output.mp3"
                 )
    """

    completion = client.chat.completions.create(
        model=model,
        modalities=["text", "audio"],
        audio={"voice": voice, "format": "mp3"},
        temperature=0,
        messages=[
            {
                "role": "system",
                "content": system,
            },
            {
                "role": "user",
                "content": tts_text,
            }
        ],
    )
    mp3_bytes = base64.b64decode(completion.choices[0].message.audio.data)
    with open(path, 'wb') as f:
        f.write(mp3_bytes)

Ein Beispielaufruf kann wie folgt aussehen. Ich habe die Erfahrung gemacht, dass es hilfreich ist den Prompt mit „Sage folgendes:“ anzufangen. So wird wirklich der Text gesprochen und die Wahrscheinlichkeit verringert sich erheblich, dass eine Anweisung aus dem Text interpretiert wird.

create_speech(
    tts_text="Sag folgendes: Wow, wie originell. Noch jemand, der denkt, er kann das nächste Google bauen oder so. Viel Spaß beim Code starren bis nachts um drei, während alle anderen Spaß haben. Aber hey, wenn du glaubst, dass das dein Ding ist... go for it, I guess.",
    system="You are a helpful assistant that can generate audio from text. Speak in German language with a bavarian accent and enunciate like you're talking like a grumpy 16 year old. Talk fast, you don't have much time! Say exactly what you get as text input - nothing else.",
    path="Sprachausgabe_test.mp3",
    voice="sage"
)

Für den Versuch mit dem kölschen Dialekt habe ich folgenden Aufruf verwendet:

create_speech(
    "Boah, echt jetzt? Willste echt so’n Nerd werden, der den janzen Tach nur vorm Rechner hockt? Ey, wat weiß ich, mach, watte meinst, aber glaub bloß nich, dat ich dir dann helfe, wenn de mal ’nen Bug hast oder so. Dat is nix für mich, ey! Aber, jo, wenn et dir Spaß macht, ne... Dann mal viel Jlöck, Jung!",
    "You are a helpful assistant that can generate audio from text. Speak in German language with an accent from Cologne and enunciate like you're talking like a grumpy 16 year old. Talk fast, you don't have much time! Say exactly what you get as text input - nothing else.",
    path="chat_beispiel_verse_cologne_fast.mp3",
    voice="verse"
)

Zu Beachten

Ein GPT Modell – keine klassische TTS Engine

Es handelt sich bei dieser Lösung nicht um eine klassische Text-To-Speech Anwendung. Stattdessen handelt es sich um ein GPT-Modell welches statt Text gesprochene Sprache ausgibt. Dieses versuche ich über Anweisungen dazu zu bringen, dass ein bestimmter Text gesprochen wird. Dies kann dazu führen, dass der eingegebene Text nicht immer wörtlich wiedergegeben wird. Der Beispieltext den ich verwendete enthält zum Beispiel einen englischen Teil. Einige Male wurde dieser Text zum Beispiel automatisch ins Deutsche Übersetz gesprochen.

Um eine höhere Wahrscheinlichkeit für eine konsistente Wiedergabe der eingegebenen Texte zu erreichen habe ich die Temperatur des Chat-Completion Aufrufs auf 0 gesetzt. Dies sollte zu einem stabileren Antwortverhalten führen sollte.

Kostenaspekt

Die neuen Funktionen haben noch relativ hohe Preise. Bei meinen Tests hatte ich Kosten von etwa 1$ für 5 Minuten gesprochenen Text. Es ist jedoch davon auszugehen dass die Funktionalität bald günstiger wird oder neue Modelle herauskommen, die geringere Kosten verursachen.

Eigentlicher Einsatzzweck

Eigentlich sind die neuen Chat.Completion Funktionen als Text-to-Voice-, Voice-to-Text- oder Voice-to-Voice-Prompting gedacht. Der Vorteil dieser neuen Funktionalität liegt darin, dass nicht immer erst ein Umweg über ein Textmodell genutzt werden muss wenn eine Spracheingabe oder -ausgabe benötigt wird. Somit spart man sich einen zusätzlichen API-Aufruf und reduziert gleichzeitig die Latenz.

Stimmproben

Hier noch die verschiedenen Beispieltexte die ich erzeugt habe:

ash


ballad

coral – Mit der Aweisung einen sächsischen Dialekt zu sprechen. Hier konnte ich keinen Dialekt hearusfhören.


sage – Mit der Anweisung Aufruf einen bayerischen Dialekt zu nutzen. Auch hier konnte ich einen Dialekt höchstens erahnen.

verse – Aufgerufen mit einem Text welcher laut ChatGPT bereits Kölsch hätte sein sollen. Dieses Mal konnte ich Dialekte heraushören, aber Kölsch war es nicht.

Zum Vergleichen: alloy – Die alte Stimme unter Verwendung der neuen Funktion.

Fazit

Die Qualität der gesprochenen Sprache hat sich im Vergleich zum letzten Jahr deutlich verbessert.
Für qualitativ hochwertiges Text-to-Speech ist es jedoch kein Ersatz. Für Sprachdialoge mit Nutzern, zum Beispiel unter Verwendung der Realtime API ist es aber sicher eine sehr gute Option.

Quellen

Wie hilfreich war dieser Beitrag?

Klicke auf die Sterne um zu bewerten!

Durchschnittliche Bewertung / 5. Anzahl Bewertungen:

Bisher keine Bewertungen! Sei der Erste, der diesen Beitrag bewertet.

Es tut uns leid, dass der Beitrag für dich nicht hilfreich war!

Lasse uns diesen Beitrag verbessern!

Wie können wir diesen Beitrag verbessern?

Verpasse keine Updates – Jetzt abonnieren!

Dir hat der Beitrag gefalllen?
Abonniere den Newsletter und bleibe Up-To-Date. Erhalte alle 1-2 Monate einen Überblick über die neuesten Podcastfolgen, Blogbeiträge und spannenden Netzfunden.
Ich freue mich, dich beim Newsletter begrüßen zu dürfen!

Ein Gedanke zu „Neue OpenAI Sprachmodelle: Verbesserte OpenAI Text-to-Speech Funktionalitäten unter Python genutzt

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.