Ir al contenido principal

Tutorial de la API GPT-Realtime-2: tres pruebas, tres veredictos

Aprende en qué se diferencian gpt-realtime-2, gpt-realtime-translate y gpt-realtime-whisper de OpenAI, y pon a prueba cada uno con código WebSocket de Python totalmente funcional.
Actualizado 12 may 2026  · 10 min leer

Nuestro artículo de introducción a GPT-Realtime-2 repasó el lanzamiento, los benchmarks y por qué OpenAI dividió la voz en tiempo real en una familia de modelos más pequeños. Este tutorial empieza donde aquel terminaba: conectarte a la API, enviar audio y ver qué cambia en el código.

La división importa en la práctica. La Prueba 1 usa gpt-realtime-whisper para transcripción, la Prueba 2 usa gpt-realtime-translate para traducción en vivo y la Prueba 3 usa gpt-realtime-2 para un asistente por voz. El modelo principal también sirve para tareas sencillas como traducir o transcribir, pero pagarías por un nivel de razonamiento y modos de respuesta que no hacen falta: sería excesivo.

Configurar la API de GPT-Realtime-2 en Python

Antes de las pruebas, conviene separar transporte, autenticación y formato de audio. Esos detalles se mantienen casi iguales en los ejemplos. Lo que cambia a lo largo del artículo son los endpoints del modelo y los nombres de eventos, a medida que pasamos de salida de texto a voz traducida y luego a un bucle de voz completo.

Elegir entre WebRTC y WebSocket

La documentación de OpenAI da una regla sencilla: usa WebRTC para clientes en navegador y móvil, y usa WebSockets para aplicaciones del lado del servidor. WebRTC gestiona el jitter buffering y el transporte de audio. Los WebSockets tienen sentido cuando el backend ya recibe audio en crudo de un proveedor de telefonía o de una canalización de medios.

Diagrama que muestra un cliente en navegador conectando a la Realtime API de OpenAI vía WebRTC, y un servidor en Python conectando vía WebSocket, con anotaciones sobre los requisitos de autenticación en cada ruta.

Dos rutas de transporte para la Realtime API. Imagen del autor.

Por ese motivo, las tres pruebas en Python usan WebSockets. Esa ruta muestra los nombres de los eventos directamente, así que las diferencias entre modelos se ven en el código. Para una app de navegador, usa secretos efímeros en el cliente para que tu clave de API no llegue nunca al frontend.

Entorno y paquetes de Python

Usa Python 3.9 o superior. El código completo de los cuatro scripts está disponible en github.com/KhalidAbdelaty/gpt-realtime-api. Clónalo primero y luego instala las dependencias:

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

websocket-client gestiona el socket. sounddevice captura el audio del micrófono, numpy convierte el búfer y python-dotenv carga la clave de la API. En macOS, puede que tengas que ejecutar brew install portaudio antes de que sounddevice funcione. En Linux, instala portaudio19-dev.

Crea un archivo .env en la raíz de tu proyecto:

OPENAI_API_KEY=sk-...

Luego cárgalo en cada script:

import os
from dotenv import load_dotenv

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

Autenticación y URL del WebSocket

Las conexiones del lado del servidor usan una cabecera Authorization: Bearer en el handshake del WebSocket. Añade OpenAI-Safety-Identifier si tu app identifica a usuarios individuales. Estas son las rutas que se usan más adelante en las pruebas:

# Agente de voz
wss://api.openai.com/v1/realtime?model=gpt-realtime-2

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

# Transcripción
wss://api.openai.com/v1/realtime?intent=transcription

Esa ruta de traducción será importante en la Prueba 2, porque es el único endpoint que no usa directamente /v1/realtime.

Prueba 1: transcripción de audio en tiempo real con GPT-Realtime-Whisper

La transcripción es un área donde es fácil sobredimensionar. Si solo necesitas texto como salida, el modelo de transcripción es suficiente.

Qué probamos

gpt-realtime-whisper recibe audio y emite deltas de transcripción. No razona, no llama a herramientas ni contesta hablando. Ese trabajo más acotado es la razón por la que se factura por duración de audio en lugar del mismo modelo por tokens que usa gpt-realtime-2. Volvemos a las tarifas en la sección de costes.

Revisión del código

El campo clave es session.type: "transcription". Eso indica a la API que se salte las respuestas del asistente y emita solo eventos de transcripción. El script completo también gestiona la captura por micrófono y los hilos. Esta es la parte que cambia el comportamiento de la sesión Realtime:

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"}))

Usa audio PCM16 mono a 24 kHz, codificado en base64. A diferencia de la sesión del agente de voz, el script confirma el búfer de entrada manualmente con un temporizador, en lugar de usar la detección de turnos server_vad. Las confirmaciones vacías lanzan input_audio_buffer_commit_empty, por eso el script completo solo confirma después de enviar audio real.

Los deltas de transcripción llegan palabra a palabra en tiempo real. Imagen del autor.

Comportamiento observado

En mis pruebas locales, los resultados de transcripción aparecían dentro de la ventana de commit, aproximadamente 3 a 4 segundos después de empezar a hablar. Como esta configuración depende de commits manuales y no de VAD, la latencia está ligada al intervalo de commit. 

También, cuidado con el orden: los eventos de finalización de turnos solapados pueden llegar desordenados, así que si construyes una interfaz alrededor del stream, concilia por item_id.

Cronología de eventos con el audio almacenándose en búfer de forma continua, un commit manual enviado a intervalo fijo, el procesamiento de transcripción y un evento de transcripción completada devuelto.

La transcripción se activa con commits manuales periódicos, no con detección de silencios. Imagen del autor.

Veredicto: aprobado. Para transcripción en vivo del lado del servidor, gpt-realtime-whisper cumplió lo que requería esta prueba. Aun así, probaría con micrófonos reales, acentos y ruido ambiental antes de fijar un objetivo de latencia.

Prueba 2: traducción en tiempo real con GPT-Realtime-Translate

La traducción de voz en vivo se parece al principio a la transcripción, pero el ciclo de vida de la sesión es distinto. El endpoint de traducción elimina el bucle de respuesta del asistente, lo que hace el ejemplo más corto.

Qué probamos

Las sesiones de traducción no tienen bucle de turnos del asistente ni response.create. El modelo actúa como intérprete en vivo, no como agente conversacional. Para preguntas y respuestas, herramientas o estado conversacional, en la Prueba 3 cambiamos a gpt-realtime-2.

Comparativa lado a lado entre una sesión de agente de voz que conecta a /v1/realtime con ciclo de respuesta, y una sesión de traducción que conecta a /v1/realtime/translations con streaming de audio continuo y sin paso de response.create.

Las sesiones de traducción usan un endpoint dedicado y separado. Imagen del autor.

El modelo admite más de 70 idiomas de entrada y 13 de salida. Fijas el idioma de destino con session.audio.output.language; la detección del idioma de origen es automática. Las limitaciones son claras: no hay prompts personalizados, ni selección de voz, ni glosarios de dominio.

Revisión del código

Como se comentó, la traducción usa la URL de WebSocket /translations. También cambian otros dos detalles: el campo de destino session.audio.output.language y el nombre del evento session.input_audio_buffer.append. Fíjate en el prefijo session.. Las sesiones de traducción lo usan aquí.

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

El audio traducido llega por session.output_audio.delta, y los bytes de audio están en event["delta"], no en event["audio"]. Las transcripciones de origen y destino llegan por separado:

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="")

Un caso límite: si el audio de origen ya está en el idioma de destino, el modelo puede producir silencio en lugar de retransmitirlo.

Comportamiento observado

Para frases cortas de inglés a español, el audio traducido empezaba antes de que terminara el enunciado de origen. La terminal mostraba líneas entrelazadas [EN] y [ES] a medida que llegaban los deltas. En pares de idiomas más lejanos puede esperar más contexto. Pude seguir la voz traducida sin problema, pero no hay selección de voz personalizada.

Veredicto: aprobado, con matices. gpt-realtime-translate funcionó bien para traducción en vivo directa. Es menos útil cuando importan el control terminológico o la identidad sonora de marca.

Prueba 3: crear un asistente de voz con turnos e interrupciones

Esta es la prueba de gpt-realtime-2: un agente de voz que escucha, habla, mantiene el contexto y puede llamar a herramientas. También es el punto en el que el código del cliente cobra más importancia, porque la reproducción y el estado de turnos pueden desincronizarse.

Qué probamos

gpt-realtime-2 es un modelo de razonamiento voz a voz. Evita una canalización separada STT→LLM→TTS, y su ventana de contexto de 128K da margen a sesiones largas. El razonamiento se controla con reasoning.effort; empieza en low salvo que la tarea requiera más, porque ajustes más altos añaden latencia.

Revisión del código

La configuración siguiente usa semantic_vad, que se fija en señales del habla y no solo en el silencio. eagerness controla lo rápido que el modelo decide que has terminado. Fíjate en el nombre del modelo, los ajustes de salida de audio, el response.create manual y el nombre del evento de audio del asistente:

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"}
    }
}

Cuando se completa la transcripción del usuario, el cliente crea la respuesta del asistente. El audio del asistente llega como response.output_audio.delta, no como 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"]))

Gestionar las interrupciones (barge-in)

La secuencia de interrupción es fácil de hacer mal. Cuando el usuario habla sobre el asistente, el servidor envía input_audio_buffer.speech_started. El cliente detiene la reproducción, registra cuánto audio se reprodujo y envía conversation.item.truncate con audio_end_ms para indicar dónde se cortó. Si no, el servidor sigue transcribiendo texto que el usuario nunca oyó, y el siguiente turno puede descuadrarse.

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

Un problema práctico con altavoces de portátil: el micrófono puede captar la salida de audio del asistente y devolvérsela al modelo. El script de ejemplo usa MUTE_MIC_DURING_ASSISTANT = True para silenciar la entrada mientras el asistente habla y durante un breve periodo después. Ponlo en False solo si usas auriculares y quieres soportar interrupciones.

Diagrama de secuencia que muestra a un usuario interrumpiendo la respuesta del asistente, el cliente recibiendo fragmentos response.output_audio.delta, deteniendo la reproducción, enviando un evento conversation.item.truncate y el servidor eliminando el audio no reproducido antes de iniciar una nueva respuesta.

El truncado mantiene sincronizados servidor y cliente. Imagen del autor.

WebRTC y SIP gestionan más de este almacenamiento en búfer. Con la ruta WebSocket usada en este tutorial, recae en el cliente. El contador del script de ejemplo basta para una demo; en producción deberías seguir marcas de tiempo del stream de salida de audio.

Configurar preámbulos para la latencia de razonamiento

Cuando reasoning.effort está por encima de low, el silencio se vuelve notable. Puedes añadir preámbulos hablados cortos en el prompt del sistema:

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

Este comportamiento está documentado para gpt-realtime-2.

Comportamiento observado

El turno de palabra funcionó con la configuración por defecto en una sala silenciosa. Con altavoces de portátil, necesité silenciar el micro; sin ello, el modelo oía su propia salida y arrancaba un bucle de eco. 

En salas más ruidosas, los ajustes de VAD y la colocación del micrófono importaron más. La memoria de la conversación se mantuvo coherente durante una prueba de diez minutos, pero no lanzaría una app más larga sin un plan de reconexión.

Veredicto: aprobado para el bucle de voz principal. gpt-realtime-2 gestionó un asistente con bajo esfuerzo de razonamiento en mi prueba. El trabajo extra está en el cliente: reproducción, gestión de interrupciones, reconexiones y llamadas a herramientas si la app las necesita.

Demo en Streamlit: los tres modelos en una sola interfaz

La app de Streamlit sitúa las pruebas tras un selector de pestañas. Te permite grabar audio, elegir un idioma de destino y comparar rutas de modelo sin tocar los scripts. Lo he dejado como app de demostración y no como vía principal de aprendizaje, porque los scripts en terminal muestran los eventos de forma más directa.

Tres modelos en una interfaz con pestañas. Imagen del autor.

El vídeo de demostración de abajo muestra las pestañas con una clave de API real. Cada pestaña usa llamadas Realtime por WebSocket reales.

Ejecuta la app desde la misma carpeta que los scripts:

streamlit run demo_app.py

Tu clave de API va en la barra lateral y no se almacena en ningún sitio. Para una app pública, ponla en Streamlit Secrets.

Coste y latencia de GPT-Realtime-2 en la práctica

Como se mencionó en la Prueba 1, la tarificación se divide en dos grupos: gpt-realtime-2 se factura por tokens, mientras que traducción y transcripción se facturan por minuto.

Tabla que compara los modelos de facturación y precios actuales de gpt-realtime-2, gpt-realtime-translate y gpt-realtime-whisper

Facturación por tokens y por minutos según el modelo. Imagen del autor.

En transcripción y traducción, el coste escala con la duración. En el momento de escribir esto, treinta minutos cuestan unos $0.51 con gpt-realtime-whisper y unos $1.02 con gpt-realtime-translate.

Los agentes de voz son más difíciles de estimar porque los tokens de audio se acumulan en ambos lados de la conversación. La duración de la sesión, el reparto de habla, el esfuerzo de razonamiento y el tamaño del contexto influyen. El prompt caching puede reducir costes cuando los turnos anteriores se mantienen estables.

Una llamada REST de transcripción más TTS es una comparación distinta salvo que necesites interacción en vivo. whisper-1 es más barato para archivos, pero no es el mismo tipo de API.

Límites de la API GPT-Realtime-2, requisitos de audio y resolución de problemas

Estos son los límites que afectaron a mis primeras ejecuciones. La mayoría de fallos vinieron del formato de audio o de errores en el ciclo de vida de la sesión, no del modelo en sí.

Restricciones de transporte y audio

Como se indicó en la primera prueba, el audio por WebSocket debe ser PCM16 a 24 kHz, mono y codificado en base64. Cada evento input_audio_buffer.append está limitado a 15 MB, así que fragmentos de 50 milisegundos quedan muy por debajo del límite. También se admite G.711 para telefonía.

Las sesiones Realtime terminan a los 60 minutos en OpenAI y a los 30 minutos en Azure OpenAI. Las apps más largas necesitan un plan de reconexión y una forma de reconstruir el estado. La voz también debe elegirse antes de la primera salida de audio; no se puede cambiar a mitad de sesión.

Límites de velocidad y cuotas

Los límites de velocidad dependen del nivel y del proyecto. El nivel 1 actualmente indica 200 solicitudes por minuto y 40.000 tokens por minuto para gpt-realtime-2. La capa Free no es compatible.

Errores comunes y aristas

Los errores más frecuentes que encontré fueron commits de búfer vacíos y formato de audio incorrecto. En agentes de voz, también vigila los bucles de realimentación cuando el micrófono oye el audio del asistente. Usa auriculares, cancelación de eco o silenciamiento del micro.

Para sesiones largas, reconecta alrededor de los 55 minutos en lugar de esperar a que caduquen. Un detalle de la documentación: la página del modelo gpt-realtime-2 muestra una fila genérica de "Streaming: Not supported", mientras que las guías de Realtime documentan el uso de /v1/realtime. Esa fila se refiere al streaming en Chat Completions, no al comportamiento de la Realtime API.

Veredicto final

El mismo patrón se repite en las tres pruebas: cada tarea tiene su propio modelo y endpoint. Esa división afecta a lo que el modelo puede hacer, a cómo se factura y a cuánta lógica de cliente tienes que implementar.

Como has visto, gpt-realtime-whisper cubre texto en vivo, gpt-realtime-translate cubre traducción directa de voz y gpt-realtime-2 cubre el comportamiento de asistente con voz, razonamiento y contexto.

El código no muestra que un modelo sustituya a los otros. Muestra que las apps de voz en tiempo real dependen del diseño de la sesión. Mi punto de partida sería el modelo más pequeño que encaje con la tarea, y dedicar el tiempo de ingeniería restante a la calidad del audio, los turnos, las reconexiones y el estado del cliente.

Si quieres más contexto, nuestros tutoriales cubren temas relacionados con audio y la Realtime API:


Khalid Abdelaty's photo
Author
Khalid Abdelaty
LinkedIn

Soy ingeniero de datos y creador de comunidades. Trabajo con canalizaciones de datos, nube y herramientas de IA, al tiempo que escribo tutoriales prácticos y de gran impacto para DataCamp y programadores emergentes.

Temas

¡Aprende IA con DataCamp!

Curso

Desarrollar sistemas de IA con la API OpenAI

3 h
20.8K
Aprovecha la API OpenAI para preparar tus aplicaciones de IA para la producción.
Ver detallesRight Arrow
Iniciar curso
Ver másRight Arrow
Relacionado
An avian AI exits its cage

blog

12 alternativas de código abierto a GPT-4

Alternativas de código abierto a GPT-4 que pueden ofrecer un rendimiento similar y requieren menos recursos informáticos para funcionar. Estos proyectos vienen con instrucciones, fuentes de código, pesos del modelo, conjuntos de datos e IU de chatbot.
Abid Ali Awan's photo

Abid Ali Awan

9 min

blog

¿Qué es GPT-4 y por qué es importante?

OpenAI ha anunciado el lanzamiento de su último gran modelo lingüístico, GPT-4. Este modelo es un gran modelo multimodal que puede aceptar tanto entradas de imagen como de texto y generar salidas de texto.
Abid Ali Awan's photo

Abid Ali Awan

9 min

Tutorial

Ajuste fino de GPT-3 mediante la API OpenAI y Python

Libere todo el potencial de GPT-3 mediante el ajuste fino. Aprenda a utilizar la API de OpenAI y Python para mejorar este modelo de red neuronal avanzado para su caso de uso específico.
Zoumana Keita 's photo

Zoumana Keita

Tutorial

Uso de GPT-3.5 y GPT-4 mediante la API OpenAI en Python

En este tutorial, aprenderás a trabajar con el paquete OpenAI Python para mantener conversaciones programáticamente con ChatGPT.
Richie Cotton's photo

Richie Cotton

An AI transcribes audio to text

Tutorial

Convertir voz en texto con la API Whisper de OpenAI

Descubra las potentes funciones de la API Python de OpenAI Whisper para transcripción y traducción. Dispone de soporte multilingüe y mejora rápida para una transcripción precisa.
Abid Ali Awan's photo

Abid Ali Awan

Tutorial

Guía para principiantes sobre el uso de la API ChatGPT

Esta guía te acompanya a través de los fundamentos de la API ChatGPT, demostrando su potencial en el procesamiento del lenguaje natural y la comunicación impulsada por la IA.
Moez Ali's photo

Moez Ali

Ver másVer más