gemini-3.1-flash-live vs GPT Realtime 2.1
O gemini-3.1-flash-live é oferecido por convite. Os valores abaixo são as tarifas em tempo real, mas as chamadas só funcionam depois que o seu espaço de trabalho recebe a permissão; peça acesso antes de desenvolver com base nesta comparação.
O GPT Realtime 2.1 é oferecido por convite. Os valores abaixo são as tarifas em tempo real, mas as chamadas só funcionam depois que o seu espaço de trabalho recebe a permissão; peça acesso antes de desenvolver com base nesta comparação.
Qual usar e quando
Ambos são modelos de áudio em tempo real cobrados por milhão de tokens, mas o gemini-3.1-flash-live é a opção mais barata: $3 para entrada de áudio contra $32 (cerca de 10.7x menos) e $12 para saída de áudio contra $64, com texto a $0.75/$4.5 contra $4/$24 (aproximadamente 5.3x menos). Ele também aceita entrada de imagem e vídeo junto com áudio e texto, possui um contexto de 131072 tokens com até 65536 tokens de saída, e suas sessões na Live API têm um limite de 15 minutos apenas com áudio (2 minutos com vídeo), a menos que sejam estendidas. Escolha o gpt-realtime-2.1 se quiser a stack de áudio/texto da OpenAI com leituras de cache a $0.4, seu contexto de 128000 tokens e máximo de 32000 de saída.
Preços
| gemini-3.1-flash-live | GPT Realtime 2.1 | Δ | |
|---|---|---|---|
| Entrada de áudio / 1M tokens | $3 | $32 | 0.094× |
| Saída de áudio / 1M tokens | $12 | $64 | 0.19× |
| Leitura de cache de áudio / 1M tokens | - | $0.4 | - |
| Entrada de texto / 1M tokens | $0.75 | $4 | 0.19× |
| Saída de texto / 1M tokens | $4.5 | $24 | 0.19× |
| Escrita de cache | - | sem cobrança separada | - |
Tarifas do catálogo em tempo real, lidas no momento do build; a página de cada modelo traz a tabela de preços atual.
Onde cada um fica: preço por 1M tokens de áudio entre os 6 modelos de voz para voz em tempo real com esta unidade de cobrança (escala logarítmica)
Capacidades
| gemini-3.1-flash-live | GPT Realtime 2.1 | |
|---|---|---|
| Controle de raciocínio | sempre ativo | - |
| Cache de prompts | implícito + explícito | implícito (automático) |
| Tempo de vida do cache | não publicado | 5-10m, up to 1h |
| Prefixo mínimo em cache | 4096 tokens | 1024 tokens |
Especificações
| gemini-3.1-flash-live | GPT Realtime 2.1 | |
|---|---|---|
| Modalidades de entrada | texto imagem áudio vídeo | texto áudio |
| Modalidades de saída | texto áudio | texto áudio |
| Lançamento | 2026-03-26 | 2026-07-06 |
| Corte de conhecimento | - | 2024-09 |
| Vozes | Any voice from the Gemini text-to-speech voice set native-audio output models switch languages naturally during a conversation. | - |
| Capacidades da sessão |
|
|
| Janela de contexto | 131K | 128K |
As especificações são transcritas da documentação de cada provedor; quando um provedor não publica um dado, a linha é omitida, e não inferida. Fontes completas: gemini-3.1-flash-live · GPT Realtime 2.1
Troque de um para o outro mudando uma linha
Os dois ids estão em todas as abas abaixo; o par de linhas destacado é a única alteração. O endpoint, a chave e o formato da requisição são os mesmos.
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" # descomente esta linha, comente a linha acima
# 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", { // descomente esta linha, comente a linha acima
// 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' # descomente esta linha, comente a linha acima
{"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) // descomente esta linha, comente a linha acima
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() { // descomente esta linha, comente a linha acima
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);Perguntas frequentes
Qual é mais barato, gemini-3.1-flash-live ou GPT Realtime 2.1?
gemini-3.1-flash-live sai mais barato na linha “Entrada de áudio / 1M tokens” ($3 contra $32, 11× de diferença). Outras linhas podem pender para o outro lado: a tabela acima mostra todos os preços, e o custo real depende do seu mix de uso.
Posso fazer um teste A/B de gemini-3.1-flash-live contra GPT Realtime 2.1 sem duas integrações?
Sim. Os dois são servidos pelo mesmo endpoint compatível com OpenAI, com uma única chave de API. Para trocar, basta mudar uma linha, a string do modelo; assim você pode direcionar uma parte do tráfego para cada um e comparar as contas diretamente.
gemini-3.1-flash-live e GPT Realtime 2.1 suportam cache de prompts?
No nosso feed, só um dos dois tem preço de leitura de cache; quando a tarifa não aparece, é porque o provedor não tem preço separado para as leituras de cache.