Weiter zum Inhalt

GPT-Realtime-2 API-Tutorial: Drei Tests, drei Urteile

Lerne, wie sich OpenAIs gpt-realtime-2, gpt-realtime-translate und gpt-realtime-whisper unterscheiden, und teste jedes Modell mit funktionierendem Python-WebSocket-Code.
Aktualisiert 12. Mai 2026  · 10 Min. lesen

Unser Überblicksartikel zu GPT-Realtime-2 behandelte den Launch, die Benchmark-Aussagen und warum OpenAI Echtzeit-Sprachfunktionen auf eine kleine Modellfamilie aufgeteilt hat. Dieses Tutorial setzt dort an, wo der Artikel aufgehört hat: Verbindung zur API, Audio senden und sehen, was sich im Code ändert.

Die Aufteilung ist in der Praxis wichtig. Test 1 nutzt gpt-realtime-whisper für Transkription, Test 2 nutzt gpt-realtime-translate für Live-Übersetzung, und Test 3 nutzt gpt-realtime-2 für einen Sprachassistenten. Das Hauptmodell kann auch einfachere Aufgaben wie Übersetzung oder Transkription übernehmen, aber du würdest für mehr Reasoning und Antwortmodi zahlen, die nicht nötig sind – also überdimensioniert.

Einrichtung der GPT-Realtime-2 API in Python

Vor den Tests hilft es, Transport, Authentifizierung und Audioformat zu trennen. Diese Details bleiben in den Beispielen weitgehend gleich. Die Modell-Endpunkte und Ereignisnamen sind das, was sich ändert, wenn der Artikel von Textausgabe zu übersetzter Sprache und dann zu einer vollständigen Sprachschleife wechselt.

Entscheidung zwischen WebRTC und WebSocket

Die OpenAI-Dokumentation gibt eine einfache Regel: Nutze WebRTC für Browser- und Mobile-Clients und WebSockets für serverseitige Anwendungen. WebRTC übernimmt Jitter-Pufferung und Audiotransport. WebSockets sind sinnvoll, wenn das Backend bereits Roh-Audio von einem Telefonieanbieter oder einer Mediapipeline empfängt.

Diagramm: Ein Browser-Client verbindet sich per WebRTC mit der OpenAI Realtime API, ein Python-Server per WebSocket; mit Hinweisen zu den Authentifizierungsanforderungen je Pfad.

Zwei Transportpfade für die Realtime API. Bild: Autor.

Aus diesem Grund verwenden alle drei Python-Tests WebSockets. Dieser Pfad zeigt die Ereignisnamen direkt, sodass die Modelldifferenzen im Code sichtbar sind. Für einen Browser-Build solltest du flüchtige Client-Secrets nutzen, damit dein API-Schlüssel niemals das Frontend erreicht.

Python-Umgebung und Pakete

Nutze Python 3.9 oder neuer. Der vollständige Code für alle vier Skripte ist unter github.com/KhalidAbdelaty/gpt-realtime-api verfügbar. Klone das Repo zuerst und installiere dann die Abhängigkeiten:

git clone https://github.com/KhalidAbdelaty/gpt-realtime-api.git
cd gpt-realtime-api
pip install websocket-client sounddevice numpy python-dotenv

websocket-client steuert den Socket, sounddevice zeichnet Mikrofon-Audio auf, numpy konvertiert den Puffer, und python-dotenv lädt den API-Schlüssel. Unter macOS brauchst du eventuell brew install portaudio, bevor sounddevice funktioniert. Unter Linux installiere portaudio19-dev.

Lege eine .env-Datei im Projektroot an:

OPENAI_API_KEY=sk-...

Dann lädst du sie in jedem Skript:

import os
from dotenv import load_dotenv

load_dotenv()
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")

Authentifizierung und die WebSocket-URL

Serverseitige Verbindungen nutzen einen Authorization: Bearer-Header beim WebSocket-Handshake. Füge OpenAI-Safety-Identifier hinzu, wenn die App einzelne Nutzer nachverfolgt. Diese Pfade werden in den Tests später verwendet:

# Voice-Agent
wss://api.openai.com/v1/realtime?model=gpt-realtime-2

# Translation
wss://api.openai.com/v1/realtime/translations?model=gpt-realtime-translate

# Transcription
wss://api.openai.com/v1/realtime?intent=transcription

Dieser Übersetzungspfad ist in Test 2 wichtig, weil es der eine Endpunkt ist, der nicht direkt /v1/realtime nutzt.

Test 1: Echtzeit-Audiotranskription mit GPT-Realtime-Whisper

Transkription ist ein typischer Ort für Overengineering. Wenn die Ausgabe nur Text ist, reicht das Transkriptionsmodell.

Was wir testen

gpt-realtime-whisper nimmt Audio entgegen und gibt Transkript-Deltas aus. Es führt kein Reasoning aus, ruft keine Tools auf und spricht nicht zurück. Dieser kleinere Umfang ist der Grund, warum es nach Audiodauer abgerechnet wird – anders als das Tokenmodell von gpt-realtime-2. Im Kostenabschnitt kommen wir darauf zurück.

Code-Walkthrough

Das Schlüsselfeld ist session.type: "transcription". Das weist die API an, Assistentenantworten zu überspringen und nur Transkript-Events zu senden. Das vollständige Skript behandelt außerdem Mikrofonaufnahme und Threads. Dieser Teil ändert das Realtime-Sitzungsverhalten:

session_config = {
    "type": "session.update",
    "session": {
        "type": "transcription",
        "audio": {
            "input": {
                "format": {"type": "audio/pcm", "rate": 24000},
                "transcription": {
                    "model": "gpt-realtime-whisper",
                    "language": "en"
                },
                "turn_detection": None
            }
        }
    }
}

ws.send(json.dumps(session_config))
ws.send(json.dumps({
    "type": "input_audio_buffer.append",
    "audio": audio_b64
}))
ws.send(json.dumps({"type": "input_audio_buffer.commit"}))

Nutze 24 kHz PCM16 Mono-Audio, base64-codiert. Anders als in der Voice-Agent-Sitzung commitet das Skript den Eingabepuffer manuell per Timer statt server_vad für Turn Detection zu verwenden. Leere Commits werfen input_audio_buffer_commit_empty, daher commitet das vollständige Skript erst nach echtem Audioeingang.

Transkript-Deltas treffen Wort für Wort in Echtzeit ein. Bild: Autor.

Beobachtetes Verhalten

In meinen lokalen Tests erschienen Transkriptergebnisse innerhalb des Commit-Fensters, etwa 3 bis 4 Sekunden nach Beginn der Sprache. Da dieses Setup auf manuelle Commits statt VAD setzt, hängt die Latenz am Commit-Intervall. 

Achte außerdem auf die Reihenfolge: Completion-Events aus überlappenden Turns können außer der Reihe eintreffen, deshalb solltest du bei einem UI um den Stream per item_id zusammenführen.

Ereignistimeline mit kontinuierlichem Audiobuffering, einem zeitgesteuerten Commit-Event, Transkriptionsverarbeitung und einem abgeschlossenen Transkript-Event.

Transkription wird durch periodische manuelle Commits ausgelöst, nicht durch Still-Erkennung. Bild: Autor.

Urteil: Bestanden. Für serverseitige Live-Transkription lieferte gpt-realtime-whisper das, was dieser Test brauchte. Ich würde dennoch mit echten Mikrofonen, Akzenten und Raumgeräuschen testen, bevor ich ein Latenzziel setze.

Test 2: Echtzeit-Übersetzung mit GPT-Realtime-Translate

Live-Sprachübersetzung ähnelt auf den ersten Blick der Transkription, aber der Sitzungszyklus unterscheidet sich. Der Übersetzungsendpunkt entfernt die Assistentenantwortschleife, was das Beispiel kürzer macht.

Was wir testen

Übersetzungssitzungen haben keine Assistenten-Turn-Schleife und kein response.create. Das Modell arbeitet wie ein Live-Dolmetscher, nicht wie ein Konversationsagent. Für Q&A, Tools oder Konversationszustand wechselt der Artikel in Test 3 zu gpt-realtime-2.

Gegenüberstellung: Voice-Agent-Sitzung mit /v1/realtime und Response-Lifecycle vs. Übersetzungssitzung mit /v1/realtime/translations mit kontinuierlichem Audiostreaming ohne response.create.

Übersetzungssitzungen nutzen einen eigenen, separaten Endpunkt. Bild: Autor.

Das Modell unterstützt über 70 Eingabesprachen und 13 Ausgabesprachen. Du setzt das Ziel mit session.audio.output.language; die Erkennung der Ausgangssprache erfolgt automatisch. Die Grenzen sind klar: kein Custom Prompting, keine Stimmwahl, keine Fachglossare.

Code-Walkthrough

Wie erwähnt, verwendet die Übersetzung die /translations-WebSocket-URL. Zwei weitere Details ändern sich ebenfalls: das Zielfeld session.audio.output.language und der Ereignisname session.input_audio_buffer.append. Beachte das Präfix session.. Übersetzungssitzungen nutzen es hier.

url = "wss://api.openai.com/v1/realtime/translations?model=gpt-realtime-translate"

session_config = {
    "type": "session.update",
    "session": {
        "audio": {
            "output": {"language": "es"},
            "input": {
                "transcription": {"model": "gpt-realtime-whisper"},
                "noise_reduction": {"type": "near_field"}
            }
        }
    }
}

ws.send(json.dumps(session_config))
ws.send(json.dumps({
    "type": "session.input_audio_buffer.append",
    "audio": audio_b64
}))

Übersetztes Audio kommt über session.output_audio.delta, und die Audio-Bytes stehen in event[\"delta\"], nicht in event[\"audio\"]. Quell- und Übersetzungs-Transkripte kommen getrennt an:

if event_type == "session.output_audio.delta":
    audio_out_queue.put(base64.b64decode(event["delta"]))
elif event_type == "session.input_transcript.delta":
    print("[EN]", event.get("delta", ""), end="")
elif event_type == "session.output_transcript.delta":
    print("[ES]", event.get("delta", ""), end="")

Ein Randfall: Wenn das Quellaudio bereits in der Zielsprache ist, kann das Modell Stille produzieren statt es durchzureichen.

Beobachtetes Verhalten

Bei kurzen Englisch-Spanisch-Phrasen begann das übersetzte Audio, bevor die Quelläußerung fertig war. Im Terminal waren verschachtelte [EN]- und [ES]-Zeilen zu sehen, während Deltas eintrafen. Entfernt liegende Sprachpaare warten ggf. länger auf Kontext. Ich konnte der übersetzten Stimme gut folgen, aber eigene Stimmwahl ist nicht verfügbar.

Urteil: Bestanden, mit Einschränkung. gpt-realtime-translate funktionierte für direkte Live-Übersetzung. Weniger geeignet ist es, wenn Terminologiekontrolle oder Stimmbranding wichtig sind.

Test 3: Aufbau eines Sprachassistenten mit Turn-Taking und Barge-In

Dies ist der gpt-realtime-2-Test: ein Sprachagent, der zuhört, spricht, Kontext hält und Tools aufrufen kann. Hier wird auch der Client-Code wichtiger, da Wiedergabe und Turn-Zustand aus dem Takt geraten können.

Was wir testen

gpt-realtime-2 ist ein Speech-to-Speech-Reasoning-Modell. Es vermeidet eine separate STT-zu-LLM-zu-TTS-Pipeline, und sein 128K-Kontextfenster gibt längeren Sitzungen mehr Spielraum. Reasoning steuerst du mit reasoning.effort; starte mit low, außer die Aufgabe braucht mehr Reasoning, denn höhere Stufen erhöhen die Latenz.

Code-Walkthrough

Das folgende Setup nutzt semantic_vad, das Sprachhinweise statt nur Stille betrachtet. eagerness steuert, wie schnell das Modell entscheidet, dass der Nutzer fertig ist. Beachte Modellname, Audioausgabesettings, manuelles response.create und den Audio-Ereignisnamen des Assistenten:

session_config = {
    "type": "session.update",
    "session": {
        "type": "realtime",
        "model": "gpt-realtime-2",
        "output_modalities": ["audio"],
        "audio": {
            "input": {
                "format": {"type": "audio/pcm", "rate": 24000},
                "transcription": {"model": "gpt-realtime-whisper", "language": "en"},
                "turn_detection": {
                    "type": "semantic_vad",
                    "eagerness": "medium",
                    "create_response": False,
                    "interrupt_response": True
                }
            },
            "output": {
                "format": {"type": "audio/pcm", "rate": 24000},
                "voice": "marin"
            }
        },
        "instructions": "You are a helpful voice assistant. Keep answers short.",
        "reasoning": {"effort": "low"}
    }
}

Wenn das Nutzertranskript abgeschlossen ist, erstellt der Client die Assistentenantwort. Assistenten-Audio kommt dann als response.output_audio.delta an, nicht als response.audio.delta.

if event_type == "conversation.item.input_audio_transcription.completed":
    ws.send(json.dumps({"type": "response.create"}))

elif event_type == "response.output_audio.delta":
    audio_out_queue.put(base64.b64decode(event["delta"]))

Barge-In handhaben

Die Unterbrechungssequenz lässt sich leicht falsch machen. Wenn der Nutzer dem Assistenten ins Wort fällt, sendet der Server input_audio_buffer.speech_started. Der Client stoppt die Wiedergabe, merkt sich, wie viel Audio bereits abgespielt wurde, und sendet conversation.item.truncate mit audio_end_ms, um den Cut-off zu markieren. Andernfalls transkribiert der Server weiter Text, den der Nutzer nie gehört hat, und die nächste Runde wirkt daneben.

if current_response_item_id and playback_position_ms > 0:
    ws.send(json.dumps({
        "type": "conversation.item.truncate",
        "item_id": current_response_item_id,
        "content_index": 0,
        "audio_end_ms": playback_position_ms
    }))

Ein praktisches Problem mit Laptop-Lautsprechern: Das Mikro kann die Assistentenausgabe aufnehmen und ans Modell zurücksenden. Das Beispielskript nutzt MUTE_MIC_DURING_ASSISTANT = True, um den Eingabestream stummzuschalten, während der Assistent spricht, plus kurze Abkühlzeit. Setze es nur auf False, wenn du Kopfhörer nutzt und Unterbrechungen möchtest.

Sequenzdiagramm: Nutzer unterbricht eine Assistentenantwort; der Client erhält response.output_audio.delta, stoppt Wiedergabe, sendet conversation.item.truncate; der Server entfernt nicht abgespieltes Audio und startet eine neue Antwort.

Trunkierung hält Server und Client synchron. Bild: Autor.

WebRTC und SIP übernehmen mehr von dieser Pufferung. Beim in diesem Tutorial genutzten WebSocket-Pfad liegt sie beim Client. Der Zähler im Beispielskript reicht für eine Demo; Produktionscode sollte Zeitstempel aus dem Audioausgabestream nachverfolgen.

Preambles für Reasoning-Latenz konfigurieren

Wenn reasoning.effort über low liegt, wird Stille hörbar. Kurze gesprochene Preambles lassen sich im Systemprompt ergänzen:

# Preambles
Use a short spoken update before longer tasks.
Keep preambles under five seconds.
Skip preambles for short factual questions.

Dieses Verhalten ist für gpt-realtime-2 dokumentiert.

Beobachtetes Verhalten

Turn-Taking funktionierte mit den Standardwerten in einem ruhigen Raum. Mit Laptop-Lautsprechern brauchte ich Mic-Muting; ohne hörte das Modell seine eigene Ausgabe und startete eine Echospirale. 

In lauteren Räumen waren VAD-Settings und Mikrofonplatzierung wichtiger. Konversationsgedächtnis blieb über einen Zehn-Minuten-Test konsistent, aber ich würde keine längere App ohne Reconnect-Plan ausliefern.

Urteil: Bestanden für die Kern-Sprachschleife. gpt-realtime-2 bewältigte in meinem Test einen Assistenten mit geringem Reasoning-Bedarf. Die Zusatzarbeit liegt beim Client: Wiedergabe, Unterbrechungshandling, Reconnects und Toolaufrufe, falls nötig.

Streamlit-Demo: Drei Modelle in einer Oberfläche

Die Streamlit-App packt die Tests hinter einen Tab-Umschalter. Du kannst Audio aufnehmen, eine Zielsprache wählen und Modellpfade vergleichen, ohne Skripte zu bearbeiten. Ich habe das als Demo-App belassen statt als Hauptlernweg, da die Terminalskripte die Events direkter zeigen.

Drei Modelle in einer Tab-Oberfläche. Bild: Autor.

Das Demovideo unten zeigt die Tabs mit einem Live-API-Schlüssel. Jeder Tab nutzt echte Realtime-WebSocket-Aufrufe.

Starte die App aus demselben Ordner wie die Skripte:

streamlit run demo_app.py

Dein API-Schlüssel kommt in die Seitenleiste und wird nirgends gespeichert. Für eine öffentliche App lege ihn stattdessen in den Streamlit Secrets ab.

GPT-Realtime-2: Kosten und Latenz in der Praxis

Wie in Test 1 erwähnt, teilt sich die Preisgestaltung in zwei Gruppen: gpt-realtime-2 wird nach Tokens abgerechnet, Übersetzung und Transkription nach Minuten.

Tabelle mit Abrechnungsmodellen und aktuellen Preisen für gpt-realtime-2, gpt-realtime-translate und gpt-realtime-whisper

Token- und Minutenabrechnung je Modell. Bild: Autor.

Bei Transkription und Übersetzung skaliert der Preis mit der Dauer. Zum Zeitpunkt des Schreibens kosten dreißig Minuten etwa 0,51 $ auf gpt-realtime-whisper und etwa 1,02 $ auf gpt-realtime-translate.

Sprachagenten sind schwerer zu schätzen, da auf beiden Seiten des Gesprächs Audiotokens anfallen. Sitzungsdauer, Sprechanteil, Reasoning-Einstellung und Kontextgröße spielen eine Rolle. Prompt-Caching kann Kosten senken, wenn frühere Gesprächsbeiträge stabil bleiben.

Ein REST-Transkriptionsaufruf plus TTS ist ein anderer Vergleich, sofern keine Live-Interaktion nötig ist. whisper-1 ist für Dateien günstiger, aber es ist nicht dieselbe Art von API.

GPT-Realtime-2 API: Limits, Audiovorgaben und Troubleshooting

Das sind die Limits, die meine ersten Testruns beeinflusst haben. Die meisten Fehler kamen von Audioformatierung oder Fehlern im Sitzungszyklus, nicht vom Modell selbst.

Transport- und Audiobeschränkungen

Wie im ersten Test notiert, sollte WebSocket-Audio PCM16 bei 24 kHz, mono und base64-codiert sein. Jedes input_audio_buffer.append-Event ist auf 15 MB begrenzt, daher bleiben 50-Millisekunden-Chunks klar unter dem Limit. G.711 wird für Telefonie ebenfalls unterstützt.

Realtime-Sitzungen enden nach 60 Minuten bei OpenAI und 30 Minuten bei Azure OpenAI. Längere Apps brauchen einen Reconnect-Plan und eine Möglichkeit, den Zustand wiederherzustellen. Die Stimme muss außerdem vor der ersten Audioausgabe gewählt werden; ein Wechsel während der Sitzung ist nicht möglich.

Ratenlimits und Quoten

Ratenlimits sind stufenbasiert und projektspezifisch. Tier 1 listet derzeit 200 Requests pro Minute und 40.000 Tokens pro Minute für gpt-realtime-2. Die Free-Stufe wird nicht unterstützt.

Häufige Fehler und Stolpersteine

Die häufigsten Fehler waren leere Buffer-Commits und falsche Audioformatierung. Bei Sprachagenten solltest du außerdem Rückkopplungsschleifen beobachten, wenn das Mikro die Lautsprecherausgabe des Assistenten aufnimmt. Nutze Kopfhörer, Echounterdrückung oder Mic-Muting.

Für lange Sitzungen solltest du rund bei Minute 55 reconnecten statt auf das Ablaufende zu warten. Eine kleine Doku-Unschärfe: Die Modellseite zu gpt-realtime-2 zeigt eine generische Zeile „Streaming: Not supported“, während die Realtime-Guides die Nutzung von /v1/realtime dokumentieren. Diese Zeile bezieht sich auf Chat-Completions-Streaming, nicht auf das Verhalten der Realtime API.

Abschließendes Urteil

Dasselbe Muster zeigt sich in allen drei Tests: Jede Aufgabe hat ihr eigenes Modell und ihren eigenen Endpunkt. Diese Aufteilung beeinflusst, was das Modell kann, wie abgerechnet wird und wie viel Client-Code du selbst verantwortest.

Wie gezeigt, deckt gpt-realtime-whisper Live-Text ab, gpt-realtime-translate direkte Sprachübersetzung und gpt-realtime-2 das Assistentenverhalten mit Sprache, Reasoning und Kontext.

Der Code zeigt nicht, dass ein Modell die anderen ersetzt. Er zeigt, dass Realtime-Sprachapps von der Sitzungsarchitektur abhängen. Mein Startpunkt wäre das kleinste Modell, das zur Aufgabe passt – den restlichen Entwicklungsaufwand würde ich in Audioqualität, Turn-Taking, Reconnects und Clientzustand stecken.

Mehr Hintergrund liefern unsere Tutorials zu verwandten Audio- und Realtime-API-Themen:


Khalid Abdelaty's photo
Author
Khalid Abdelaty
LinkedIn

Ich bin Dateningenieur und Community-Builder und arbeite mit Datenpipelines, Cloud- und KI-Tools. Außerdem schreibe ich praktische, super nützliche Tutorials für DataCamp und angehende Entwickler.

Themen

Lerne KI mit DataCamp!

Kurs

Entwicklung von KI-Systemen mit der OpenAI-API

3 Std.
20.8K
Nutze die OpenAI API, um deine KI-Anwendungen produktionsreif zu machen.
Details anzeigenRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Blog

Die 36 wichtigsten Fragen und Antworten zum Thema generative KI für 2026

Dieser Blog hat eine ganze Reihe von Fragen und Antworten zu generativer KI, von den Grundlagen bis hin zu fortgeschrittenen Themen.
Hesam Sheikh Hassani's photo

Hesam Sheikh Hassani

15 Min.

Blog

Arten von KI-Agenten: Ihre Rollen, Strukturen und Anwendungen verstehen

Lerne die wichtigsten Arten von KI-Agenten kennen, wie sie mit ihrer Umgebung interagieren und wie sie in verschiedenen Branchen eingesetzt werden. Verstehe einfache reflexive, modellbasierte, zielbasierte, nutzenbasierte, lernende Agenten und mehr.

Tutorial

So kürzt man eine Zeichenfolge in Python: Drei verschiedene Methoden

Lerne die Grundlagen zum Entfernen von führenden und nachfolgenden Zeichen aus einer Zeichenfolge in Python.
Adel Nehme's photo

Adel Nehme

Tutorial

Python JSON-Daten: Ein Leitfaden mit Beispielen

Lerne, wie man mit JSON in Python arbeitet, einschließlich Serialisierung, Deserialisierung, Formatierung, Leistungsoptimierung, Umgang mit APIs und Verständnis der Einschränkungen und Alternativen von JSON.
Moez Ali's photo

Moez Ali

Tutorial

Python-Tutorial zum Verknüpfen von Zeichenfolgen

Lerne verschiedene Methoden zum Verknüpfen von Zeichenfolgen in Python kennen, mit Beispielen, die jede Technik zeigen.
DataCamp Team's photo

DataCamp Team

Mehr anzeigenMehr anzeigen