gemini-2.5-flash-native-audio vs gemini-3.1-flash-live
gemini-2.5-flash-native-audio gibt es nur auf Einladung. Die Werte unten sind die aktuellen Live-Preise, für Aufrufe muss Ihr Arbeitsbereich aber erst freigeschaltet werden. Fragen Sie den Zugang bei uns an, bevor Sie auf diesen Vergleich bauen.
gemini-3.1-flash-live gibt es nur auf Einladung. Die Werte unten sind die aktuellen Live-Preise, für Aufrufe muss Ihr Arbeitsbereich aber erst freigeschaltet werden. Fragen Sie den Zugang bei uns an, bevor Sie auf diesen Vergleich bauen.
Welches Modell wofür
Die Audiopreise sind identisch ($3 Eingabe, $12 Ausgabe pro Million) und die Sitzungsmechanik ebenso - PCM mit 16 kHz Eingang und 24 kHz Ausgang, 128k Kontext, 15 Minuten Deckel bei reinem Audio - wobei das ältere gemini-2.5-flash-native-audio beim Text etwas günstiger ist, $0.5 und $2 pro Million gegenüber $0.75 und $4.5. Der funktionale Unterschied ist das Werkzeugverhalten: gemini-2.5-flash-native-audio unterstützt NON_BLOCKING-Funktionsdeklarationen, sodass das Modell weiterspricht, während ein Werkzeug läuft, wo gemini-3.1-flash-live sequenziell ist und erst nach dem Werkzeugergebnis antwortet - dafür nimmt es Bildeingaben neben Text, Audio und Video. Nehmen Sie 2.5 für werkzeuglastige Gespräche, 3.1 für Bildeingabe.
Benchmarks
gemini-3.1-flash-live: Der Anbieter hat keine Benchmark-Werte veröffentlicht.
gemini-2.5-flash-native-audio: 8 veröffentlicht, aber kein Benchmark, den genug andere Modelle teilen.
Preise
| gemini-2.5-flash-native-audio | gemini-3.1-flash-live | Δ | |
|---|---|---|---|
| Audio-Eingabe / 1M Tokens | $3 | $3 | = |
| Audio-Ausgabe / 1M Tokens | $12 | $12 | = |
| Text-Eingabe / 1M Tokens | $0.5 | $0.75 | 0.67× |
| Text-Ausgabe / 1M Tokens | $2 | $4.5 | 0.44× |
Preise aus dem Live-Katalog, Stand des letzten Builds. Die aktuellen Preise stehen auf der jeweiligen Modellseite.
Einordnung: Preis pro 1M Audio-Tokens aller 6 Echtzeit-Speech-to-Speech-Modelle mit dieser Abrechnungseinheit (logarithmische Skala)
Fähigkeiten
| gemini-2.5-flash-native-audio | gemini-3.1-flash-live | |
|---|---|---|
| Thinking-Steuerung | konfigurierbar | immer aktiv |
| Prompt-Caching | implizit + explizit | implizit + explizit |
| Cache-Lebensdauer | nicht veröffentlicht | nicht veröffentlicht |
| Mindestlänge des gecachten Präfixes | 4096 Tokens | 4096 Tokens |
Spezifikationen
| gemini-2.5-flash-native-audio | gemini-3.1-flash-live | |
|---|---|---|
| Eingabemodalitäten | Text Audio Video | Text Bild Audio Video |
| Ausgabemodalitäten | Text Audio | Text Audio |
| Veröffentlicht | - | 2026-03-26 |
| Knowledge-Cutoff | 2025-01 | - |
| Stimmen | Any voice from the Gemini text-to-speech voice set native-audio output models switch languages naturally during a conversation. | Any voice from the Gemini text-to-speech voice set native-audio output models switch languages naturally during a conversation. |
| Sitzungsfunktionen |
|
|
| Kontextfenster | 131K | 131K |
Die Spezifikationen stammen aus der Dokumentation des jeweiligen Anbieters. Veröffentlicht ein Anbieter eine Angabe nicht, lassen wir die Zeile weg, statt sie zu schätzen. Vollständige Quellen: gemini-2.5-flash-native-audio · gemini-3.1-flash-live
Eine Zeile genügt für den Wechsel
Beide IDs stehen in jedem Tab unten. Die beiden hervorgehobenen Zeilen sind die einzige Änderung. Gleicher Endpunkt, gleicher Schlüssel, gleiches Anfrageformat.
import asyncio, base64, json, websockets
URL = "wss://synthorai.io/v1/realtime?model=gemini-2.5-flash-native-audio"
# URL = "wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live" # diese Zeile einkommentieren, die darüberliegende auskommentieren
# 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-2.5-flash-native-audio", {
// const ws = new WebSocket("wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live", { // diese Zeile einkommentieren, die darüberliegende auskommentieren
// 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-2.5-flash-native-audio' <<'EOF'
# 'wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live' <<'EOF' # diese Zeile einkommentieren, die darüberliegende auskommentieren
{"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-2.5-flash-native-audio", h)
// c, _, err := websocket.DefaultDialer.Dial("wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live", h) // diese Zeile einkommentieren, die darüberliegende auskommentieren
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-2.5-flash-native-audio"), new WebSocket.Listener() {
// .buildAsync(URI.create("wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live"), new WebSocket.Listener() { // diese Zeile einkommentieren, die darüberliegende auskommentieren
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
Welches Modell ist günstiger: gemini-2.5-flash-native-audio oder gemini-3.1-flash-live?
Bei Audio-Eingabe / 1M Tokens kosten beide gleich viel ($3). Der Preis entscheidet hier also nichts; ausschlaggebend sind die Spezifikationen und Fähigkeiten weiter unten.
Kann ich gemini-2.5-flash-native-audio gegen gemini-3.1-flash-live A/B-testen, ohne zweimal zu integrieren?
Ja. Beide laufen über denselben OpenAI-kompatiblen Endpunkt mit einem API-Schlüssel. Für den Wechsel ändern Sie nur eine Zeile, den Modellnamen. So können Sie einen Teil des Traffics an jedes Modell schicken und die Kosten direkt vergleichen.
Unterstützen gemini-2.5-flash-native-audio und gemini-3.1-flash-live Prompt-Caching?
In unserem Feed ist nur für eines der beiden Modelle ein Preis für Cache-Lesezugriffe hinterlegt. Fehlt ein Preis, berechnet der Anbieter Cache-Lesezugriffe nicht gesondert.