Перевод в реальном времени с помощью Gemini Live API

API Gemini Live поддерживает перевод речи в реальном времени с низкой задержкой между более чем 70 языками, используя модель gemini-3.5-live-translate-preview . Настроив API Live с параметрами перевода, вы можете передавать аудиопоток на одном языке и получать переведенный аудиовыход на другом языке, обеспечивая бесшовный перевод голоса в реальном времени.

Оператор в режиме реального времени против перевода в режиме реального времени

Хотя оба метода используют Live API, ментальная модель для Live Translation отличается от модели взаимодействия с агентом в режиме реального времени.

Живой агент Перевод в реальном времени
Модель выступает в роли помощника. Она слушает, рассуждает и предпринимает действия от вашего имени. Модель выступает в роли интерпретатора. Она функционирует как конвейер трансляции в реальном времени.
Использует пошаговое взаимодействие. Основывается на паузах, распознавании намерений и обработке прерываний. Использует непрерывную потоковую обработку. Переводит речь по мере того, как говорит говорящий, не дожидаясь реплик.
Поддерживает инструменты и агенты. Встроенная поддержка вызова функций, поиска Google и инструкций. Поддерживается только перевод. Перевод с низкой задержкой; инструменты и инструкции не поддерживаются.
Полностью мультимодальный. Поддерживает ввод текста, аудио, видео и изображений. Аудиосигнал ограничен. Ввод ограничен только аудиосигналом для обеспечения строгих пороговых значений задержки в реальном времени.
Детальная конфигурация. Использует генерацию, речь, инструменты и системные инструкции. Упрощенная конфигурация. Установите target_language_code и переключатели, как echo_target_language .

Начать

Следующие примеры демонстрируют, как инициализировать клиент и подключиться к Live API с конфигурацией перевода.

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();

Веб-сокеты

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)`);
        }
      }
    }
  }
};

Отправка аудио

Для потоковой передачи голосовых данных для перевода вы отправляете необработанный 16-битный PCM-аудиофайл в формате little-endian.

  • Входной аудиоформат : необработанный 16-битный PCM с частотой 16 кГц (моно, little-endian).
  • Выходной аудиоформат : необработанный 16-битный PCM с частотой 24 кГц (моно, little-endian).
  • Размер фрагмента и задержка : Отправляйте аудиофрагменты по 100 мс.

Следующие примеры показывают, как отправлять аудиофрагменты в сессию.

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'
  }
});

Веб-сокеты

// 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));
  }
}

Конфигурация

Для включения перевода необходимо указать translationConfig в параметре generationConfig во время настройки сессии.

Настройка конфигурации сообщений

Параметр generationConfig поддерживает следующие поля для включения транскриптов:

  • inputAudioTranscription : Объект, который, если он присутствует, позволяет модели отправлять текстовые расшифровки входного аудио.
  • outputAudioTranscription : Объект, который, если он присутствует, позволяет модели отправлять текстовые расшифровки выходного (переведенного) аудиофайла.

translationConfig поддерживает следующие поля:

  • targetLanguageCode : Код языка BCP-47 , на который вы хотите перевести модель (например, "pl" для польского, "es" для испанского). По умолчанию используется "en" .
  • echoTargetLanguage : Логическое значение, указывающее, как следует обрабатывать входной аудиосигнал, уже находящийся на целевом языке. Если установлено значение true , модель будет повторять (имитировать) входной аудиосигнал, уже находящийся на целевом языке. Если установлено значение false , модель будет молчать, если входная речь уже на целевом языке. По умолчанию — false .

Вот пример структуры сообщения настройки:

"setup": {
    "model": "models/gemini-3.5-live-translate-preview",
    "generationConfig": {
      "responseModalities": [
        "AUDIO"
      ],
      "inputAudioTranscription": {},
      "outputAudioTranscription": {},
      "translationConfig": {
        "targetLanguageCode": "pl",
        "echoTargetLanguage": true
      }
    }
}

Временные токены для клиентских приложений

Для приложений, работающих по принципу «клиент-сервер», можно использовать временные токены (в настоящее время в v1alpha ), чтобы избежать раскрытия вашего API-ключа.

При использовании временных токенов с функцией «Живой перевод»:

  1. Необходимо использовать конечную точку v1alpha .
  2. Блокировка конфигурации: По умолчанию параметр translationConfig следует указывать в ограничениях создания токена на вашем сервере. Это гарантирует блокировку конфигурации перевода и невозможность ее изменения клиентом.
  3. Разблокировка конфигурации: Если вы хотите иметь возможность устанавливать translationConfig на стороне клиента (например, чтобы пользователь мог выбрать свой целевой язык), необходимо опустить его в запросе на создание токена и установить вместо него "lock_additional_fields": [] . Это разблокирует возможность установки translationConfig на стороне клиента.

Создание ограниченного временного токена

Следующие примеры демонстрируют, как создать временный токен с ограничениями на перевод.

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'
        }
    },
});

Ограничения

  • Способы ввода : Для перевода поддерживается только ввод аудио. Ввод текста не поддерживается.
  • Воспроизведение голоса : Воспроизведение голоса может быть непоследовательным. Голоса могут меняться после длительных пауз, может происходить неправильное определение пола в зависимости от начала речи или голос может застревать на одном и том же во время быстрых разговоров с участием нескольких собеседников.
  • Определение языка : При определении языка возникают проблемы с распознаванием сильных акцентов, похожих языков (например, испанский против португальского) или резких переключений между языками. Примечание: Это должно повлиять только на входную расшифровку. Языковые коды и окончательный перевод должны оставаться точными.
  • Фоновый звук : Модель предназначена для фильтрации шума и музыки, чтобы обеспечить чистое звучание речи, но не весь фоновый звук может быть проигнорирован.
  • Отображение целевого языка : Если echoTargetLanguage: true , фоновый шум или музыка могут вносить искажения в переведенный звук, если входной аудиофайл уже записан на целевом языке.

Поддерживаемые языки

Для перевода в реальном времени поддерживаются следующие языки.

Язык Код BCP-47 Язык Код BCP-47
африкаанс аф казахский кк
Акан ак кхмерский км
албанский кв. Киньяруанда рв
амхарский являюсь корейский ко
арабский ар Лао ло
армянский хай латышский lv
азербайджанский аз литовский лт
Баскский Евросоюз македонский мк
белорусский быть малайский РС
бенгальский бн Малаялам мл
болгарский бг маратхи Мистер
Бирманский (Мьянма) мой монгольский мн
каталанский ка непальский не
Китайский (упрощенный) ж-Ганс норвежский нет, нб
Китайский (традиционный) ж-Хант персидский фа
хорватский ч польский пл
чешский кс Португальский (Бразилия) пт-БР
датский да Португальский (Португалия) пт-ПТ
Голландский нл Пенджаби па
Английский эн румынский ро
эстонский и Русский ру
филиппинский фил сербский ст.
финский фи Синдхи sd
Французский фр сингальский си
галисийский гл словацкий ск
грузинский ка словенский сл
немецкий де испанский эс
греческий эль сунданский су
гуджарати гу суахили sw
Хауса ха шведский св
иврит он тамильский та
хинди привет телугу те
венгерский ху Тайский т
исландский является турецкий тр
индонезийский идентификатор украинский Великобритания
итальянского это урду ур
японский джа узбекский уз
яванский джв вьетнамский ви
Каннада кн зулу зу

Что дальше?