Traduction instantanée avec l'API Gemini Live

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 sur true, 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 sur false, le modèle restera silencieux lorsque la langue de la parole saisie est déjà la langue cible. La valeur par défaut est false.

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 :

  1. Vous devez utiliser le point de terminaison v1alpha.
  2. Configuration du verrouillage : par défaut, vous devez spécifier translationConfig dans 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.
  3. Déverrouiller la configuration : si vous souhaitez pouvoir définir translationConfig cô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éfinir translationConfig cô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