L'API Gemini Live permet la traduction vocale en temps réel à faible latence entre plus de 70 langues à l'aide du modèle gemini-3.5-live-translate-preview. En configurant l'API Live avec des paramètres de traduction, vous pouvez diffuser de l'audio dans une langue et recevoir une sortie audio traduite dans une autre langue, ce qui permet une traduction vocale en temps réel fluide.
Agent réel ou traduction instantanée
Bien que les deux utilisent l'API Live, le modèle mental de la traduction instantanée est différent de celui des interactions conversationnelles en temps réel avec un agent.
| Agent en direct | Traduction instantanée |
|---|---|
| Le modèle agit comme un assistant : il écoute, raisonne et effectue des actions pour vous. | Le modèle agit comme un interprète et se comporte comme un pipeline de traduction en temps réel. |
| Utilise des interactions au tour par tour. S'appuie sur les pauses et la détection de l'intention, et gère les interruptions. | Utilise le traitement par flux continu. La traduction se fait en même temps que la personne parle, sans attendre son tour. |
| Compatible avec les outils et les agents : compatibilité native avec l'appel de fonction, la recherche Google et les instructions. | Traduction uniquement. Traduction pure à faible latence, sans prise en charge des outils ni des instructions. |
| Entièrement multimodal : prend en charge les entrées de texte, audio, vidéo et image. | L'entrée audio est limitée pour respecter des seuils de latence stricts en temps réel. |
| Configuration précise : utilise les instructions de génération, vocales, d'outils et système. | Configuration simplifiée : Définissez target_language_code et les boutons à bascule comme echo_target_language. |
Premiers pas
Les exemples suivants montrent comment initialiser un client et se connecter à l'API Live avec une configuration de traduction.
Python
import asyncio
from google import genai
from google.genai import types
client = genai.Client()
model = "gemini-3.5-live-translate-preview"
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
input_audio_transcription=types.AudioTranscriptionConfig(),
output_audio_transcription=types.AudioTranscriptionConfig(),
translation_config=types.TranslationConfig(
target_language_code="pl",
echo_target_language=True
)
)
async def main():
async with client.aio.live.connect(model=model, config=config) as session:
print("Session started with translation")
# Start receiving the translated audio stream
async for response in session.receive():
if response.server_content:
if response.server_content.input_transcription:
print(f"Input transcript: {response.server_content.input_transcription.text}")
if response.server_content.output_transcription:
print(f"Output transcript: {response.server_content.output_transcription.text}")
if response.server_content.model_turn:
for part in response.server_content.model_turn.parts:
if part.inline_data:
audio_data = part.inline_data.data
# Play or process the translated audio chunk
print(f"Received audio chunk ({len(audio_data)} bytes)")
if __name__ == "__main__":
asyncio.run(main())
JavaScript
import { GoogleGenAI, Modality } from '@google/genai';
const ai = new GoogleGenAI({});
const model = 'gemini-3.5-live-translate-preview';
const config = {
responseModalities: [Modality.AUDIO],
inputAudioTranscription: {},
outputAudioTranscription: {},
translationConfig: {
targetLanguageCode: 'pl',
echoTargetLanguage: true
}
};
async function main() {
const session = await ai.live.connect({
model: model,
config: config,
callbacks: {
onopen: () => console.debug('Opened'),
onmessage: (message) => {
const content = message.serverContent;
if (content?.inputTranscription) {
console.log('Input transcript:', content.inputTranscription.text);
}
if (content?.outputTranscription) {
console.log('Output transcript:', content.outputTranscription.text);
}
if (content?.modelTurn?.parts) {
for (const part of content.modelTurn.parts) {
if (part.inlineData) {
const audioData = part.inlineData.data;
// Play or process the translated audio chunk (base64 encoded)
console.debug(`Received audio chunk (${audioData.length} bytes)`);
}
}
}
},
onerror: (e) => console.debug('Error:', e.message),
onclose: (e) => console.debug('Close:', e.reason),
},
});
console.debug("Session started with translation");
}
main();
WebSockets
const API_KEY = "YOUR_API_KEY";
const MODEL_NAME = "gemini-3.5-live-translate-preview";
const WS_URL = `wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent?key=${API_KEY}`;
const websocket = new WebSocket(WS_URL);
websocket.onopen = () => {
console.log('WebSocket Connected');
const setupMessage = {
setup: {
model: `models/${MODEL_NAME}`,
generationConfig: {
responseModalities: ['AUDIO'],
inputAudioTranscription: {},
outputAudioTranscription: {},
translationConfig: {
targetLanguageCode: 'pl',
echoTargetLanguage: true
}
}
}
};
websocket.send(JSON.stringify(setupMessage));
};
websocket.onmessage = (event) => {
const response = JSON.parse(event.data);
if (response.serverContent) {
const content = response.serverContent;
if (content.inputTranscription) {
console.log('Input transcript:', content.inputTranscription.text, `(${content.inputTranscription.languageCode})`);
}
if (content.outputTranscription) {
console.log('Output transcript:', content.outputTranscription.text, `(${content.outputTranscription.languageCode})`);
}
if (content.modelTurn?.parts) {
for (const part of content.modelTurn.parts) {
if (part.inlineData) {
const audioData = part.inlineData.data;
// Play or process the translated audio chunk (base64 encoded)
console.debug(`Received audio chunk (${audioData.length} bytes)`);
}
}
}
}
};
Envoi de l'audio
Pour diffuser des entrées vocales à traduire, vous devez envoyer de l'audio PCM brut 16 bits little-endian.
- Format audio d'entrée : PCM 16 bits brut à 16 kHz (mono, little-endian).
- Format audio de sortie : PCM 16 bits brut à 24 kHz (mono, little-endian).
- Taille des fragments et latence : envoyez l'audio par fragments de 100 ms.
Les exemples suivants montrent comment envoyer des blocs audio à la session.
Python
# Assuming 'chunk' is your raw PCM audio bytes
await session.send_realtime_input(
audio=types.Blob(
data=chunk,
mime_type="audio/pcm;rate=16000"
)
)
JavaScript
// Assuming 'chunk' is a Buffer of raw PCM audio
session.sendRealtimeInput({
audio: {
data: chunk.toString('base64'),
mimeType: 'audio/pcm;rate=16000'
}
});
WebSockets
// Assuming 'chunk' is a Buffer of raw PCM audio
function sendAudioChunk(chunk) {
if (websocket.readyState === WebSocket.OPEN) {
const audioMessage = {
realtimeInput: {
audio: {
data: chunk.toString('base64'),
mimeType: 'audio/pcm;rate=16000'
}
}
};
websocket.send(JSON.stringify(audioMessage));
}
}
Configuration
Pour activer la traduction, vous devez spécifier translationConfig dans generationConfig lors de la configuration de la session.
Configurer les messages de configuration
generationConfig accepte les champs suivants pour activer les transcriptions :
inputAudioTranscription: objet qui, lorsqu'il est présent, permet au modèle d'envoyer des transcriptions textuelles de l'audio d'entrée.outputAudioTranscription: objet qui, lorsqu'il est présent, permet au modèle d'envoyer des transcriptions textuelles du contenu audio de sortie (traduit).
translationConfig accepte les champs suivants :
targetLanguageCode: code de langue BCP-47 de la langue dans laquelle vous souhaitez que le modèle traduise le texte (par exemple,"pl"pour le polonais ou"es"pour l'espagnol). La valeur par défaut est"en".echoTargetLanguage: valeur booléenne indiquant comment gérer l'entrée audio déjà dans la langue cible. Si la valeur est définie surtrue, le modèle répète l'audio d'entrée qui est déjà dans la langue cible. Si la valeur est définie surfalse, le modèle restera silencieux lorsque la langue de la parole saisie est déjà la langue cible. La valeur par défaut estfalse.
Voici un exemple de structure de message de configuration :
"setup": {
"model": "models/gemini-3.5-live-translate-preview",
"generationConfig": {
"responseModalities": [
"AUDIO"
],
"inputAudioTranscription": {},
"outputAudioTranscription": {},
"translationConfig": {
"targetLanguageCode": "pl",
"echoTargetLanguage": true
}
}
}
Jetons éphémères pour les applications côté client
Pour les applications client-serveur, vous pouvez utiliser des jetons éphémères (actuellement en v1alpha) pour éviter d'exposer votre clé API.
Lorsque vous utilisez des jetons éphémères avec la traduction instantanée :
- Vous devez utiliser le point de terminaison
v1alpha. - Configuration du verrouillage : par défaut, vous devez spécifier
translationConfigdans les contraintes de création de jeton sur votre serveur. Cela garantit que la configuration de la traduction est verrouillée et ne peut pas être altérée par le client. - Déverrouiller la configuration : si vous souhaitez pouvoir définir
translationConfigcôté client (par exemple, pour permettre à un utilisateur de choisir sa propre langue cible), vous devez l'omettre de la requête de création de jeton et définir"lock_additional_fields": []à la place. Cela permettra de définirtranslationConfigcôté client.
Créer un jeton éphémère contraint
Les exemples suivants montrent comment créer un jeton éphémère avec des contraintes de traduction.
Python
import datetime
from google import genai
now = datetime.datetime.now(tz=datetime.timezone.utc)
client = genai.Client(
http_options={'api_version': 'v1alpha'}
)
token = client.auth_tokens.create(
config = {
'uses': 1,
'expire_time': now + datetime.timedelta(minutes=30),
'live_connect_constraints': {
'model': 'gemini-3.5-live-translate-preview',
'config': {
'translation_config': {
'target_language_code': 'pl',
'echo_target_language': True
}
}
},
'http_options': {'api_version': 'v1alpha'},
}
)
JavaScript
import { GoogleGenAI } from "@google/genai";
const client = new GoogleGenAI({});
const expireTime = new Date(Date.now() + 30 * 60 * 1000).toISOString();
const token = await client.authTokens.create({
config: {
uses: 1,
expireTime: expireTime,
liveConnectConstraints: {
model: 'gemini-3.5-live-translate-preview',
config: {
responseModalities: ['AUDIO'],
inputAudioTranscription: {},
outputAudioTranscription: {},
translationConfig: {
targetLanguageCode: 'pl',
echoTargetLanguage: true
}
}
},
httpOptions: {
apiVersion: 'v1alpha'
}
},
});
Limites
- Modalités d'entrée : seule l'entrée audio est acceptée pour la traduction. La saisie de texte n'est pas acceptée.
- Réplication de la voix : la réplication de la voix peut être incohérente. Les voix peuvent changer après de longues pauses, attribuer le mauvais genre en fonction de la façon dont la parole commence ou rester bloquées sur une seule voix lors de conversations rapides à plusieurs interlocuteurs.
- Détection de la langue : la détection de la langue est difficile en cas d'accent prononcé, de langues similaires (par exemple, l'espagnol et le portugais) ou de changements de langue rapides. Remarque : Cela ne devrait avoir d'incidence que sur la transcription de l'entrée. Les codes de langue et la traduction finale devraient toujours être exacts.
- Audio de fond : le modèle est conçu pour filtrer le bruit et la musique afin de produire une parole claire, mais il est possible que l'audio de fond ne soit pas entièrement ignoré.
- Écho de la langue cible : lorsque
echoTargetLanguage: true, le bruit de fond ou la musique peuvent introduire des artefacts dans l'audio traduit si l'audio d'entrée est déjà dans la langue cible.
Langues disponibles
Les langues suivantes sont disponibles pour la traduction instantanée.
| Langue | Code BCP-47 | Langue | Code BCP-47 |
|---|---|---|---|
| Afrikaans | af | Kazakh | kk |
| Akan | ak | Khmer | km |
| Albanais | sq | Kinyarwanda | rw |
| Amharique | am | Coréen | ko |
| Arabe | ar | Laotien | lo |
| Arménien | hy | Letton | lv |
| Azéri | az | Lituanien | lt |
| Basque | eu | Macédonien | mk |
| Biélorusse | be | Malaisien | ms |
| Bengali | bn | Malayalam | ml |
| Bulgare | bg | Marathi | mr |
| Birman (Myanmar) | my | Mongol | mn |
| Catalan | ca | Népalais | ne |
| Chinois (simplifié) | zh-Hans | Norvégien | non, nb |
| Chinois (traditionnel) | zh-Hant | Persan | fa |
| Croate | h | Polonais | pl |
| Tchèque | cs | Portugais (Brésil) | pt-BR |
| Danois | da | Portugais (Portugal) | pt-PT |
| Néerlandais | nl | Panjabi | pa |
| Anglais | en | Roumain | ro |
| Estonien | et | Russe | ru |
| Tagalog | fil | Serbe | sr |
| Finnois | fi | Sindhî | sd |
| Français | fr | Cingalais | si |
| Galicien | gl | Slovaque | sk |
| Géorgien | ka | Slovène | sl |
| Allemand | de | Espagnol | es |
| Grec | el | Soundanais | su |
| Gujarati | gu | Swahili | sw |
| Haoussa | ha | Suédois | sv |
| Hébreu | il | Tamoul | ta |
| Hindi | hi | Télougou | te |
| Hongrois | hu | Thaï | th |
| Islandais | est | Turc | tr |
| Indonésien | id | Ukrainien | uk |
| Italien | it | Urdu | ur |
| Japonais | ja | Ouzbek | uz |
| Javanais | jv | Vietnamien | vi |
| Kannada | kn | Zoulou | zu |
Étape suivante
- Consultez le guide complet des fonctionnalités de l'API Live.
- Consultez le guide Premiers pas avec le SDK.
- Consultez le guide Premiers pas avec WebSockets.
- Consultez le guide sur les jetons éphémères pour une authentification sécurisée dans les applications client-serveur.
- Clonez les exemples d'API en direct depuis GitHub.