Interfejs Gemini Live API obsługuje tłumaczenie mowy na mowę w czasie rzeczywistym z krótkim czasem oczekiwania w ponad 70 językach za pomocą modelu gemini-3.5-live-translate-preview. Konfigurując interfejs Live API z ustawieniami tłumaczenia, możesz przesyłać strumieniowo dźwięk w jednym języku i otrzymywać przetłumaczony dźwięk w innym języku, co umożliwia płynne tłumaczenie głosu na głos w czasie rzeczywistym.
Czat na żywo z pracownikiem obsługi klienta a tłumaczenie na żywo
Obie funkcje korzystają z interfejsu Live API, ale model mentalny tłumaczenia na żywo różni się od interakcji z agentem w czasie rzeczywistym.
| Czat z pracownikiem | Tłumaczenie na żywo |
|---|---|
| Model działa jako asystent – słucha, analizuje i podejmuje działania w Twoim imieniu. | Model działa jak tłumacz. Działa jak potok tłumaczenia w czasie rzeczywistym. |
| Wykorzystuje interakcje oparte na turach. Opiera się na przerwach, wykrywaniu intencji i obsłudze przerw. | Wykorzystuje ciągłe przetwarzanie strumieniowe – tłumaczy wypowiedzi mówcy na bieżąco, bez czekania na swoją kolej. |
| Obsługuje narzędzia i agenty. Natywna obsługa wywoływania funkcji, wyszukiwarki Google i instrukcji. | Obsługuje tylko tłumaczenie. Tłumaczenie z niskim opóźnieniem bez obsługi narzędzi ani instrukcji. |
| W pełni multimodalny – obsługuje dane wejściowe w postaci tekstu, dźwięku, wideo i obrazów. | Dźwięk ograniczony. Dane wejściowe są ograniczone do dźwięku, aby zapewnić ścisłe progi opóźnienia w czasie rzeczywistym. |
| Szczegółowa konfiguracja Korzysta z generowania, mowy, narzędzi i instrukcji systemowych. | Uproszczona konfiguracja. Ustaw target_language_code i przełączniki, takie jak echo_target_language. |
Rozpocznij
Poniższe przykłady pokazują, jak zainicjować klienta i połączyć się z interfejsem Live API za pomocą konfiguracji tłumaczenia.
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)`);
}
}
}
}
};
Wysyłanie dźwięku
Aby przesyłać strumieniowo dane wejściowe głosowe do tłumaczenia, wysyłaj surowe, 16-bitowe dane audio PCM w formacie little-endian.
- Format dźwięku wejściowego: surowy 16-bitowy PCM przy 16 kHz (mono, little-endian).
- Format dźwięku wyjściowego: surowy 16-bitowy PCM przy 24 kHz (mono, little-endian).
- Rozmiar fragmentu i czas oczekiwania: wysyłaj dźwięk w fragmentach o długości 100 ms.
Poniższe przykłady pokazują, jak wysyłać do sesji fragmenty dźwięku.
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));
}
}
Konfiguracja
Aby włączyć tłumaczenie, musisz określić translationConfig w ramach generationConfig podczas konfigurowania sesji.
Konfigurowanie wiadomości dotyczących konfiguracji
generationConfig obsługuje te pola, aby włączyć transkrypcje:
inputAudioTranscription: obiekt, który po wystąpieniu umożliwia modelowi wysyłanie transkrypcji tekstowych wejściowego dźwięku.outputAudioTranscription: obiekt, który po wystąpieniu umożliwia modelowi wysyłanie transkrypcji tekstowych wyjściowego (przetłumaczonego) dźwięku.
translationConfig obsługuje te pola:
targetLanguageCode: kod języka BCP-47, na który ma tłumaczyć model (np."pl"w przypadku języka polskiego,"es"w przypadku języka hiszpańskiego). Domyślnie"en".echoTargetLanguage: wartość logiczna wskazująca, jak należy obsługiwać dźwięk wejściowy, który jest już w języku docelowym. Jeśli ustawisz wartośćtrue, model będzie powtarzać dźwięk wejściowy, który jest już w języku docelowym. Jeśli ustawisz wartośćfalse, model będzie milczeć, gdy mowa wejściowa jest już w języku docelowym. Domyślnie ustawiona jest wartośćfalse.
Oto przykład struktury wiadomości konfiguracyjnej:
"setup": {
"model": "models/gemini-3.5-live-translate-preview",
"generationConfig": {
"responseModalities": [
"AUDIO"
],
"inputAudioTranscription": {},
"outputAudioTranscription": {},
"translationConfig": {
"targetLanguageCode": "pl",
"echoTargetLanguage": true
}
}
}
Tokeny tymczasowe dla aplikacji po stronie klienta
W przypadku aplikacji działających w modelu klient-serwer możesz używać tokenów tymczasowych (obecnie w v1alpha), aby uniknąć ujawnienia klucza interfejsu API.
Podczas korzystania z tokenów tymczasowych z tłumaczeniem na żywo:
- Musisz użyć punktu końcowego
v1alpha. - Konfiguracja blokowania: domyślnie w ograniczeniach tworzenia tokena na serwerze należy określić
translationConfig. Dzięki temu konfiguracja tłumaczenia jest zablokowana i klient nie może w nią ingerować. - Odblokowywanie konfiguracji: jeśli chcesz mieć możliwość ustawienia parametru
translationConfigpo stronie klienta (np. aby umożliwić użytkownikowi wybór języka docelowego), musisz pominąć go w żądaniu utworzenia tokena i zamiast niego ustawić parametr"lock_additional_fields": []. Umożliwi to ustawienie wartościtranslationConfigpo stronie klienta.
Tworzenie ograniczonego tokena efemerycznego
Poniższe przykłady pokazują, jak utworzyć token tymczasowy z ograniczeniami dotyczącymi tłumaczenia.
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'
}
},
});
Ograniczenia
- Rodzaje danych wejściowych: w przypadku tłumaczenia obsługiwane są tylko dane audio. Wpisywanie tekstu nie jest obsługiwane.
- Replikacja głosu: replikacja głosu może być niespójna. Głosy mogą się zmieniać po długich przerwach, przypisywać niewłaściwą płeć na podstawie tego, jak zaczyna się mowa, lub utknąć na jednym głosie podczas szybkich rozmów z wieloma mówcami.
- Wykrywanie języka: wykrywanie języka może być utrudnione w przypadku silnego akcentu, podobnych języków (np. hiszpańskiego i portugalskiego) lub szybkiego przełączania się między językami. Uwaga: powinno to mieć wpływ tylko na transkrypcję danych wejściowych. Kody języków i ostateczne tłumaczenie powinny być nadal prawidłowe.
- Dźwięk w tle: model został zaprojektowany tak, aby odfiltrowywać szumy i muzykę w celu uzyskania czystej mowy, ale nie wszystkie dźwięki w tle mogą być ignorowane.
- Echo Target Language (Powtórz język docelowy): gdy
echoTargetLanguage: true, szumy w tle lub muzyka mogą wprowadzać artefakty w przetłumaczonym dźwięku, jeśli dźwięk wejściowy jest już w języku docelowym.
Obsługiwane języki
Tłumaczenie na żywo jest dostępne w tych językach.
| Język | Kod BCP-47 | Język | Kod BCP-47 |
|---|---|---|---|
| afrikaans | af | kazachski | kk |
| akan | ak | khmerski | km |
| albański | sq | ruanda-rundi | rw |
| amharski | am | koreański | ko |
| arabski | ar | laotański | lo |
| ormiański | hy | łotewski | lv |
| azerski | az | litewski | lt |
| baskijski | eu | macedoński | mk |
| białoruski | be | malajski | ms |
| bengalski | bn | malajalam | ml |
| bułgarski | bg | marathi | mr |
| birmański (Mjanma) | my | mongolski | mn |
| kataloński | ca | nepalski | ne |
| Chiński (uproszczony) | zh-Hans | norweski | no, nb |
| chiński (tradycyjny) | zh-Hant | perski | fa |
| chorwacki | h | polski | pl |
| czeski | cs | portugalski (Brazylia) | pt-BR |
| duński | da | portugalski (Portugalia) | pt-PT |
| niderlandzki | nl | pendżabski | pa |
| angielski | en | rumuński | ro |
| estoński | et | rosyjski | ru |
| filipiński | fil | serbski | sr |
| fiński | fi | sindhi | sd |
| francuski | fr | syngaleski | si |
| galicyjski | gl | słowacki | sk |
| gruziński | ka | słoweński | sl |
| niemiecki | de | hiszpański | es |
| Kuchnia grecka | el | sundajski | su |
| gudżarati | gu | suahili | sw |
| hausa | ha | szwedzki | sv |
| hebrajski | on | tamilski | ta |
| hindi | hi | telugu | te |
| węgierski | hu | tajski | th |
| islandzki | jest | turecki | tr |
| indonezyjski | id | ukraiński | uk |
| włoski | it | urdu | ur |
| japoński | ja | uzbecki | uz |
| jawajski | jv | wietnamski | vi |
| kannada | kn | zulu | zu |
Co dalej?
- Przeczytaj pełny przewodnik po możliwościach interfejsu Live API.
- Zapoznaj się z przewodnikiem Pierwsze kroki z pakietem SDK.
- Przeczytaj przewodnik Pierwsze kroki z WebSockets.
- Przeczytaj przewodnik Tokeny tymczasowe, aby dowiedzieć się, jak bezpiecznie uwierzytelniać aplikacje działające w modelu klient-serwer.
- Sklonuj przykłady Live API z GitHuba.