gemini-2.5-flash-native-audio vs gemini-3.1-flash-live
gemini-2.5-flash-native-audio est accessible sur invitation. Les chiffres ci-dessous sont bien ses tarifs en vigueur, mais votre espace de travail doit d'abord y être autorisé : demandez-nous l'accès avant de bâtir quoi que ce soit sur ce comparatif.
gemini-3.1-flash-live est accessible sur invitation. Les chiffres ci-dessous sont bien ses tarifs en vigueur, mais votre espace de travail doit d'abord y être autorisé : demandez-nous l'accès avant de bâtir quoi que ce soit sur ce comparatif.
Lequel choisir, et quand
Les tarifs audio sont identiques ($3 en entrée, $12 en sortie par million) et la mécanique de session aussi - PCM 16 kHz en entrée, 24 kHz en sortie, contexte 128k, plafond de 15 minutes en audio seul - le plus ancien gemini-2.5-flash-native-audio étant légèrement moins cher sur le texte, $0.5 et $2 par million contre $0.75 et $4.5. L'écart fonctionnel porte sur le comportement des outils : gemini-2.5-flash-native-audio accepte les déclarations de fonction NON_BLOCKING, si bien que le modèle continue de parler pendant l'exécution d'un outil, tandis que gemini-3.1-flash-live est séquentiel et ne répond pas avant le retour de l'outil - mais il ajoute l'entrée image à côté du texte, de l'audio et de la vidéo. Prenez le 2.5 pour des conversations riches en outils, le 3.1 pour l'entrée image.
Benchmarks
gemini-3.1-flash-live : le fournisseur n'a publié aucun résultat de benchmark.
gemini-2.5-flash-native-audio : 8 résultats publiés, mais aucun benchmark en commun avec assez d'autres modèles pour comparer.
Tarifs
| gemini-2.5-flash-native-audio | gemini-3.1-flash-live | Δ | |
|---|---|---|---|
| Entrée audio / 1M de tokens | $3 | $3 | = |
| Sortie audio / 1M de tokens | $12 | $12 | = |
| Entrée texte / 1M de tokens | $0.5 | $0.75 | 0.67× |
| Sortie texte / 1M de tokens | $2 | $4.5 | 0.44× |
Tarifs relevés dans le catalogue en direct à la génération du site ; la page de chaque modèle affiche la grille tarifaire à jour.
Leur position : prix pour 1M de tokens audio, parmi les 6 modèles de speech-to-speech en temps réel facturés dans cette unité (échelle logarithmique)
Capacités
| gemini-2.5-flash-native-audio | gemini-3.1-flash-live | |
|---|---|---|
| Contrôle de la réflexion | configurable | toujours activé |
| Mise en cache des prompts | implicite + explicite | implicite + explicite |
| Durée de vie du cache | non publié | non publié |
| Préfixe minimal mis en cache | 4096 tokens | 4096 tokens |
Spécifications
| gemini-2.5-flash-native-audio | gemini-3.1-flash-live | |
|---|---|---|
| Modalités d'entrée | texte audio vidéo | texte image audio vidéo |
| Modalités de sortie | texte audio | texte audio |
| Date de sortie | - | 2026-03-26 |
| Coupure des connaissances | 2025-01 | - |
| Voix | 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. |
| Capacités de session |
|
|
| Fenêtre de contexte | 131K | 131K |
Les spécifications sont reprises de la documentation de chaque fournisseur ; quand un fournisseur ne publie pas une valeur, la ligne est omise et non déduite. Sources complètes : gemini-2.5-flash-native-audio · gemini-3.1-flash-live
Passez de l'un à l'autre en changeant une seule ligne
Les deux identifiants figurent dans chaque onglet ci-dessous : les deux lignes surlignées sont le seul changement. Même endpoint, même clé, même format de requête.
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" # 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-2.5-flash-native-audio", {
// const ws = new WebSocket("wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live", { // 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-2.5-flash-native-audio' <<'EOF'
# 'wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live' <<'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-2.5-flash-native-audio", h)
// c, _, err := websocket.DefaultDialer.Dial("wss://synthorai.io/v1/realtime?model=gemini-3.1-flash-live", 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-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() { // 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-2.5-flash-native-audio ou gemini-3.1-flash-live ?
Les deux affichent le même prix sur la ligne « Entrée audio / 1M de tokens » ($3) : ce n'est donc pas le prix qui les départage ici. Voyez les spécifications et les capacités ci-dessous.
Puis-je faire un test A/B entre gemini-2.5-flash-native-audio et gemini-3.1-flash-live sans deux intégrations ?
Oui. Les deux passent par le même endpoint compatible OpenAI, avec une seule clé API. Pour passer de l'un à l'autre, il suffit de changer l'identifiant du modèle, soit une ligne : vous pouvez donc envoyer une part du trafic à chacun et comparer directement les factures.
gemini-2.5-flash-native-audio et gemini-3.1-flash-live prennent-ils en charge la mise en cache des prompts ?
Notre flux de prix n'indique un tarif de lecture de cache que pour l'un des deux. Quand ce tarif est absent, c'est que le fournisseur ne facture pas les lectures de cache à part.