gemini-3.1-flash-live vs GPT Realtime 2.1
Lequel, quand — verdict de synthèse, pas un tableau de benchmarks
Les deux sont des modèles audio en temps réel facturés par million de jetons, mais gemini-3.1-flash-live est l'option la moins chère : $3 pour l'audio en entrée contre $32 (environ 10.7x moins) et $12 pour l'audio en sortie contre $64, avec le texte à $0.75/$4.5 contre $4/$24 (environ 5.3x moins). Il accepte également les entrées image et vidéo en plus de l'audio et du texte, dispose d'un contexte de 131072 jetons avec jusqu'à 65536 jetons en sortie, et ses sessions Live API sont plafonnées à 15 minutes pour l'audio seul (2 minutes avec vidéo) à moins d'être prolongées. Choisissez gpt-realtime-2.1 si vous voulez la pile audio/texte d'OpenAI avec les lectures en cache à $0.4, son contexte de 128000 jetons et 32000 en sortie maximum.
Tarification
| gemini-3.1-flash-live | GPT Realtime 2.1 | Δ | |
|---|---|---|---|
| Entrée audio / 1M tokens | $3 | $32 | 0.094× |
| Sortie audio / 1M tokens | $12 | $64 | 0.19× |
| Lecture en cache audio / 1M tokens | — | $0.4 | — |
| Entrée texte / 1M tokens | $0.75 | $4 | 0.19× |
| Sortie texte / 1M tokens | $4.5 | $24 | 0.19× |
| Écriture cache | — | aucun frais supplémentaire | — |
Tarifs issus du catalogue en direct au moment de la compilation ; chaque page de modèle présente la fiche actuelle.
Où ils se situent — prix pour 1M de tokens audio sur l'ensemble des 6 modèles speech-to-speech en temps réel pour cette unité de facturation (échelle logarithmique)
Capacités
| gemini-3.1-flash-live | GPT Realtime 2.1 | |
|---|---|---|
| Contrôle de la réflexion | toujours activé | — |
| Mise en cache du prompt | implicite + explicite | implicite (automatique) |
| Durée de vie du cache | non publié | 5–10m, up to 1h |
| Préfixe minimum mis en cache | 4096 jetons | 1024 jetons |
Spécifications
| gemini-3.1-flash-live | GPT Realtime 2.1 | |
|---|---|---|
| Modalités d'entrée | texte image audio vidéo | texte audio |
| Modalités de sortie | texte audio | texte audio |
| Sortie | 2026-03-26 | 2026-07-06 |
| Limite de connaissances | — | 2024-09 |
| Voix | Any voice from the Gemini text-to-speech voice set native-audio output models switch languages naturally during a conversation. | — |
| Capacités de session |
|
|
| Fenêtre de contexte | 131K | 128K |
Les spécifications sont transcrites à partir de la documentation de chaque fournisseur ; une ligne qu'un fournisseur ne publie pas est omise plutôt que déduite. Sources complètes : gemini-3.1-flash-live · GPT Realtime 2.1
Basculez de l'un à l'autre avec une seule ligne
Les deux ids sont dans chaque onglet ci-dessous — la paire de lignes en surbrillance est la seule modification. Même endpoint, même clé, même structure de requête.
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" # décommentez cette ligne, commentez celle du dessus
# 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", { // décommentez cette ligne, commentez celle du dessus
// 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' # décommentez cette ligne, commentez celle du dessus
{"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) // décommentez cette ligne, commentez celle du dessus
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() { // décommentez cette ligne, commentez celle du dessus
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);FAQ
Lequel est le moins cher, gemini-3.1-flash-live ou GPT Realtime 2.1 ?
gemini-3.1-flash-live est moins cher sur entrée audio / 1m tokens ($3 contre $32, avec un écart de 11×). D'autres lignes peuvent indiquer l'inverse — le tableau ci-dessus contient la fiche complète, et le coût réel dépend de votre combinaison.
Puis-je faire un test A/B de gemini-3.1-flash-live par rapport à GPT Realtime 2.1 sans deux intégrations ?
Oui. Les deux sont servis via le même endpoint compatible OpenAI avec une seule clé API — le basculement est un changement de chaîne de modèle en une ligne, vous pouvez donc diriger une fraction du trafic vers chacun et comparer les factures directement.
Est-ce que gemini-3.1-flash-live et GPT Realtime 2.1 prennent en charge le prompt caching ?
La tarification de la lecture en cache n'est indiquée que pour l'un des deux dans notre flux ; lorsqu'un tarif est manquant, le fournisseur ne tarifie pas les lectures en cache séparément.