gemini-3.1-flash-live vs GPT Realtime 2.1
gemini-3.1-flash-live solo está disponible por invitación. Las cifras de abajo son las tarifas en vivo, pero para llamarlo tu espacio de trabajo necesita antes un permiso: pídenos acceso antes de construir nada a partir de esta comparativa.
GPT Realtime 2.1 solo está disponible por invitación. Las cifras de abajo son las tarifas en vivo, pero para llamarlo tu espacio de trabajo necesita antes un permiso: pídenos acceso antes de construir nada a partir de esta comparativa.
Cuál usar y cuándo
Ambos son modelos de audio en tiempo real facturados por millón de tokens, pero gemini-3.1-flash-live es la opción más económica: $3 de entrada de audio frente a $32 (aproximadamente 10.7x menos) y $12 de salida de audio frente a $64, con el texto a $0.75/$4.5 frente a $4/$24 (aproximadamente 5.3x menos). También admite entrada de imágenes y video junto con audio y texto, tiene un contexto de 131072 tokens con hasta 65536 tokens de salida, y sus sesiones de Live API tienen un límite de 15 minutos solo con audio (2 minutos con video) a menos que se extiendan. Elige gpt-realtime-2.1 si deseas el stack de audio/texto de OpenAI con lecturas en caché a $0.4, su contexto de 128000 tokens y 32000 de salida máxima.
Precios
| gemini-3.1-flash-live | GPT Realtime 2.1 | Δ | |
|---|---|---|---|
| Entrada de audio / 1M tokens | $3 | $32 | 0.094× |
| Salida de audio / 1M tokens | $12 | $64 | 0.19× |
| Lectura de caché de audio / 1M tokens | - | $0.4 | - |
| Entrada de texto / 1M tokens | $0.75 | $4 | 0.19× |
| Salida de texto / 1M tokens | $4.5 | $24 | 0.19× |
| Escritura en caché | - | sin cargo aparte | - |
Tarifas tomadas del catálogo en vivo al generar el sitio; la página de cada modelo tiene la ficha de precios actualizada.
Dónde queda cada uno: precio por 1M de tokens de audio entre los 6 modelos de voz a voz en tiempo real que se facturan en esta unidad (escala logarítmica)
Capacidades
| gemini-3.1-flash-live | GPT Realtime 2.1 | |
|---|---|---|
| Control del razonamiento | siempre activo | - |
| Caché de prompts | implícito + explícito | implícito (automático) |
| Duración de la caché | no publicado | 5-10m, up to 1h |
| Prefijo mínimo en caché | 4096 tokens | 1024 tokens |
Especificaciones
| gemini-3.1-flash-live | GPT Realtime 2.1 | |
|---|---|---|
| Modalidades de entrada | texto imagen audio vídeo | texto audio |
| Modalidades de salida | texto audio | texto audio |
| Lanzamiento | 2026-03-26 | 2026-07-06 |
| Corte de conocimiento | - | 2024-09 |
| Voces | Any voice from the Gemini text-to-speech voice set native-audio output models switch languages naturally during a conversation. | - |
| Capacidades de sesión |
|
|
| Ventana de contexto | 131K | 128K |
Las especificaciones se transcriben de la documentación de cada proveedor; si un proveedor no publica un dato, la fila se omite en vez de deducirlo. Fuentes completas: gemini-3.1-flash-live · GPT Realtime 2.1
Cambia de uno a otro con una sola línea
Los dos ids aparecen en todas las pestañas de abajo; lo único que cambia es el par de líneas resaltadas. El endpoint, la clave y la estructura de la solicitud son los mismos.
import asyncio, base64, json, websockets
URL = "wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live"
# URL = "wss://synthorai.io/v1/realtime?model=gpt-realtime-2.1" # descomenta esta línea, comenta la de arriba
# Send ONLY the Authorization header - the beta protocol is retired.
HEADERS = {"Authorization": "Bearer sk-syn-..."}
async def main():
async with websockets.connect(URL, additional_headers=HEADERS) as ws:
# 1) configure the speech-to-speech session
await ws.send(json.dumps({
"type": "session.update",
"session": {
"type": "realtime",
"output_modalities": ["audio"],
"audio": {"output": {"voice": "alloy"}},
},
}))
# 2) send input audio (base64 PCM16), then request a spoken reply
await ws.send(json.dumps({"type": "input_audio_buffer.append", "audio": pcm16_b64}))
await ws.send(json.dumps({"type": "input_audio_buffer.commit"}))
await ws.send(json.dumps({"type": "response.create"}))
# 3) stream the model's audio (and text) back
async for raw in ws:
ev = json.loads(raw)
if ev["type"] == "response.audio.delta":
play(base64.b64decode(ev["delta"])) # audio out
elif ev["type"] == "response.done":
break
asyncio.run(main())import WebSocket from "ws";
const ws = new WebSocket("wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live", {
// const ws = new WebSocket("wss://synthorai.io/v1/realtime?model=gpt-realtime-2.1", { // descomenta esta línea, comenta la de arriba
// Send ONLY the Authorization header — the beta protocol is retired.
headers: { Authorization: "Bearer sk-syn-..." },
});
ws.on("open", () => {
// configure the speech-to-speech session
ws.send(JSON.stringify({ type: "session.update", session: {
type: "realtime", output_modalities: ["audio"], audio: { output: { voice: "alloy" } },
} }));
// send input audio (base64 PCM16), then request a spoken reply
ws.send(JSON.stringify({ type: "input_audio_buffer.append", audio: pcm16Base64 }));
ws.send(JSON.stringify({ type: "input_audio_buffer.commit" }));
ws.send(JSON.stringify({ type: "response.create" }));
});
ws.on("message", (raw) => {
const ev = JSON.parse(raw.toString());
if (ev.type === "response.audio.delta") playAudio(Buffer.from(ev.delta, "base64")); // audio out
else if (ev.type === "response.done") ws.close();
});# Realtime is a WebSocket protocol - use a WS client such as websocat.
# Each line below is one OpenAI Realtime event (JSON) sent to the session.
websocat -H 'Authorization: Bearer sk-syn-...' \
'wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live' <<'EOF'
# 'wss://synthorai.io/v1/realtime?model=gpt-realtime-2.1' <<'EOF' # descomenta esta línea, comenta la de arriba
{"type":"session.update","session":{"type":"realtime","output_modalities":["audio"],"audio":{"output":{"voice":"alloy"}}}}
{"type":"input_audio_buffer.append","audio":"<base64-pcm16>"}
{"type":"input_audio_buffer.commit"}
{"type":"response.create"}
EOF
# Responses stream back as response.audio.delta (base64 audio out) … response.donepackage main
import (
"net/http"
"github.com/gorilla/websocket"
)
func main() {
h := http.Header{}
h.Set("Authorization", "Bearer sk-syn-...")
// Send ONLY the Authorization header — the beta protocol is retired.
c, _, err := websocket.DefaultDialer.Dial("wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live", h)
// c, _, err := websocket.DefaultDialer.Dial("wss://synthorai.io/v1/realtime?model=gpt-realtime-2.1", h) // descomenta esta línea, comenta la de arriba
if err != nil {
panic(err)
}
defer c.Close()
// configure the speech-to-speech session, send audio, request a spoken reply
c.WriteJSON(map[string]any{"type": "session.update", "session": map[string]any{
"type": "realtime", "output_modalities": []string{"audio"},
"audio": map[string]any{"output": map[string]any{"voice": "alloy"}}}})
c.WriteJSON(map[string]any{"type": "input_audio_buffer.append", "audio": pcm16B64})
c.WriteJSON(map[string]any{"type": "input_audio_buffer.commit"})
c.WriteJSON(map[string]any{"type": "response.create"})
for {
var ev struct {
Type string `json:"type"`
Delta string `json:"delta"`
}
if err := c.ReadJSON(&ev); err != nil {
return
}
if ev.Type == "response.audio.delta" {
playAudio(ev.Delta) // base64 audio out
} else if ev.Type == "response.done" {
return
}
}
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.WebSocket;
import java.util.concurrent.CompletionStage;
// JDK built-in WebSocket — no extra dependency needed.
WebSocket ws = HttpClient.newHttpClient().newWebSocketBuilder()
.header("Authorization", "Bearer sk-syn-...")
// Send ONLY the Authorization header — the beta protocol is retired.
.buildAsync(URI.create("wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live"), new WebSocket.Listener() {
// .buildAsync(URI.create("wss://synthorai.io/v1/realtime?model=gpt-realtime-2.1"), new WebSocket.Listener() { // descomenta esta línea, comenta la de arriba
public CompletionStage<?> onText(WebSocket w, CharSequence data, boolean last) {
// handle response.audio.delta (base64 audio out) / response.done here
w.request(1);
return null;
}
}).join();
// configure the session, send input audio, then request a spoken reply
ws.sendText("{\"type\":\"session.update\",\"session\":{\"type\":\"realtime\",\"output_modalities\":[\"audio\"],\"audio\":{\"output\":{\"voice\":\"alloy\"}}}}", true);
ws.sendText("{\"type\":\"input_audio_buffer.append\",\"audio\":\"<base64-pcm16>\"}", true);
ws.sendText("{\"type\":\"input_audio_buffer.commit\"}", true);
ws.sendText("{\"type\":\"response.create\"}", true);Preguntas frecuentes
¿Cuál es más barato, gemini-3.1-flash-live o GPT Realtime 2.1?
gemini-3.1-flash-live es más barato en Entrada de audio / 1M tokens ($3 frente a $32, una diferencia de 11×). En otras filas puede ser al revés: la tabla de arriba recoge todas las tarifas, y el coste real depende de tu combinación de uso.
¿Puedo hacer pruebas A/B de gemini-3.1-flash-live frente a GPT Realtime 2.1 sin dos integraciones?
Sí. Los dos se sirven desde el mismo endpoint compatible con OpenAI y con una sola clave API. Para cambiar de uno a otro basta con tocar una línea, el nombre del modelo, así que puedes mandar una parte del tráfico a cada uno y comparar directamente las facturas.
¿Admiten gemini-3.1-flash-live y GPT Realtime 2.1 caché de prompts?
En nuestros datos solo figura precio de lectura de caché para uno de los dos; cuando falta la tarifa es porque el proveedor no fija un precio aparte para las lecturas de caché.