Gemini Live API mendukung terjemahan ucapan ke ucapan secara real-time dan berlatensi rendah antara lebih dari 70 bahasa menggunakan model gemini-3.5-live-translate-preview. Dengan mengonfigurasi Live API menggunakan setelan terjemahan, Anda dapat melakukan streaming audio dalam satu bahasa dan menerima output audio terjemahan dalam bahasa lain, sehingga memungkinkan terjemahan suara ke suara secara real-time yang lancar.
Agen Langsung vs. Terjemahan Langsung
Meskipun keduanya menggunakan Live API, model mental untuk Terjemahan Langsung berbeda dengan interaksi agen real-time percakapan.
| Agen Langsung | Terjemahan Langsung |
|---|---|
| Model ini bertindak sebagai asisten. Model ini mendengarkan, memproses, dan melakukan tindakan atas nama Anda. | Model ini berfungsi sebagai penerjemah. Model ini berperilaku sebagai pipeline penerjemah real-time. |
| Menggunakan interaksi berbasis giliran. Mengandalkan jeda, deteksi maksud, dan menangani gangguan. | Menggunakan pemrosesan stream berkelanjutan. Menerjemahkan saat pembicara berbicara tanpa menunggu giliran. |
| Mendukung alat dan agen. Dukungan native untuk pemanggilan fungsi, Google Penelusuran, dan petunjuk. | Hanya mendukung terjemahan. Terjemahan latensi rendah murni; tidak ada dukungan untuk alat atau petunjuk. |
| Multimodal sepenuhnya. Mendukung input teks, audio, video, dan gambar. | Audio dibatasi. Input terbatas pada audio untuk memastikan nilai minimum latensi real-time yang ketat. |
| Konfigurasi terperinci. Menggunakan pembuatan, ucapan, alat, dan petunjuk sistem. | Konfigurasi yang disederhanakan. Tetapkan target_language_code dan tombol seperti echo_target_language. |
Mulai
Contoh berikut menunjukkan cara melakukan inisialisasi klien dan terhubung ke Live API dengan konfigurasi terjemahan.
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)`);
}
}
}
}
};
Mengirim audio
Untuk melakukan streaming input suara untuk terjemahan, Anda mengirimkan audio PCM 16-bit mentah, little-endian.
- Format audio input: PCM 16-bit mentah pada 16 kHz (mono, little-endian).
- Format audio output: PCM 16-bit mentah pada 24 kHz (mono, little-endian).
- Ukuran Chunk dan Latensi: Kirim audio dalam chunk 100 md.
Contoh berikut menunjukkan cara mengirimkan potongan audio ke sesi.
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));
}
}
Konfigurasi
Untuk mengaktifkan terjemahan, Anda harus menentukan translationConfig dalam generationConfig selama penyiapan sesi.
Konfigurasi pesan penyiapan
generationConfig mendukung kolom berikut untuk mengaktifkan transkrip:
inputAudioTranscription: Objek yang, jika ada, memungkinkan model mengirimkan transkrip teks dari audio input.outputAudioTranscription: Objek yang, jika ada, memungkinkan model mengirimkan transkrip teks dari audio output (yang diterjemahkan).
translationConfig mendukung kolom berikut:
targetLanguageCode: Kode bahasa BCP-47 dari bahasa yang Anda inginkan untuk terjemahan model (misalnya,"pl"untuk Polandia,"es"untuk Spanyol). Nilai defaultnya adalah"en".echoTargetLanguage: Boolean yang menunjukkan cara menangani audio input yang sudah dalam bahasa target. Jika disetel ketrue, model akan mengulangi (menirukan) audio input yang sudah dalam bahasa target. Jika disetel kefalse, model akan tetap diam saat ucapan input sudah dalam bahasa target. Nilai defaultnya adalahfalse.
Berikut adalah contoh struktur pesan penyiapan:
"setup": {
"model": "models/gemini-3.5-live-translate-preview",
"generationConfig": {
"responseModalities": [
"AUDIO"
],
"inputAudioTranscription": {},
"outputAudioTranscription": {},
"translationConfig": {
"targetLanguageCode": "pl",
"echoTargetLanguage": true
}
}
}
Token sementara untuk aplikasi sisi klien
Untuk aplikasi klien-ke-server, Anda dapat menggunakan token sementara (saat ini dalam v1alpha) untuk menghindari pemaparan kunci API Anda.
Saat menggunakan token sementara dengan Terjemahan Langsung:
- Anda harus menggunakan endpoint
v1alpha. - Mengunci konfigurasi: Secara default, Anda harus menentukan
translationConfigdalam batasan pembuatan token di server Anda. Hal ini memastikan konfigurasi terjemahan dikunci dan tidak dapat dirusak oleh klien. - Membuka kunci konfigurasi: Jika Anda ingin dapat menyetel
translationConfigdi sisi klien (misalnya, untuk mengizinkan pengguna memilih bahasa targetnya sendiri), Anda harus menghapusnya dari permintaan pembuatan token dan menyetel"lock_additional_fields": []sebagai gantinya. Tindakan ini akan membuka kuncitranslationConfiguntuk ditetapkan di sisi klien.
Membuat token ephemeral yang dibatasi
Contoh berikut menunjukkan cara membuat token sementara dengan batasan terjemahan.
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'
}
},
});
Batasan
- Modalitas Input: Hanya input audio yang didukung untuk terjemahan. Input teks tidak didukung.
- Replikasi Suara: Replikasi suara dapat tidak konsisten. Suara dapat berubah setelah jeda yang panjang, menetapkan gender yang salah berdasarkan cara ucapan dimulai, atau macet pada satu suara selama percakapan multi-pembicara yang cepat.
- Deteksi Bahasa: Deteksi bahasa mengalami kesulitan dengan aksen berat, bahasa yang serupa (misalnya, Spanyol vs. Portugis), atau peralihan bahasa yang cepat. Catatan: Hal ini hanya akan memengaruhi transkrip input. Kode bahasa dan terjemahan akhir harus tetap akurat.
- Audio Latar Belakang: Model ini dirancang untuk memfilter derau dan musik guna menghasilkan ucapan yang jelas, tetapi tidak semua audio latar belakang dapat diabaikan.
- Bahasa Target Gema (Echo): Jika
echoTargetLanguage: true, suara bising di latar belakang atau musik dapat menimbulkan artefak dalam audio yang diterjemahkan jika audio input sudah dalam bahasa target.
Bahasa yang didukung
Bahasa berikut didukung untuk Terjemahan Langsung.
| Language | Kode BCP-47 | Language | Kode BCP-47 |
|---|---|---|---|
| Afrika | af | Kazak | kk |
| Akan | ak | Khmer | km |
| Albania | sq | Kinyarwanda | rw |
| Amharik | am | Korea | ko |
| Arab | ar | Laos | lo |
| Armenia | hy | Latvia | lv |
| Azerbaijan | az | Lituania | lt |
| Basque | eu | Makedonia | mk |
| Belarusia | be | Melayu | md |
| Bengali | bn | Malayalam | ml |
| Bulgaria | bg | Marathi | mr |
| Burma (Myanmar) | my | Mongolia | mn |
| Katalan | ca | Nepal | ne |
| China (Aksara Sederhana) | zh-Hans | Norwegia | no, nb |
| China (Aksara Tradisional) | zh-Hant | Persia | fa |
| Kroasia | jam | Polandia | pl |
| Ceko | cs | Portugis (Brasil) | pt-BR |
| Denmark | da | Portugis (Portugal) | pt-PT |
| Belanda | nl | Punjabi | pa |
| Inggris | en | Rumania | ro |
| Estonia | et | Rusia | ru |
| Filipino | fil | Serbia | sr |
| Finlandia | fi | Sindhi | sd |
| Prancis | fr | Sinhala | si |
| Galisia | gl | Slovakia | sk |
| Georgia | ka | Slovenia | sl |
| Jerman | de | Spanyol | es |
| Yunani | el | Sunda | su |
| Gujarat | gu | Swahili | sw |
| Hausa | ha | Swedia | sv |
| Ibrani | he | Tamil | ta |
| Hindi | hi | Telugu | te |
| Hungaria | hu | Thai | th |
| Islandia | is | Turki | tr |
| Indonesia | id | Ukraina | uk |
| Italia | it | Urdu | ur |
| Jepang | ja | Uzbek | uz |
| Jawa | jv | Vietnam | vi |
| Kannada | kn | Zulu | zu |
Langkah berikutnya
- Baca panduan Kemampuan Live API selengkapnya.
- Baca panduan Mulai menggunakan SDK.
- Baca panduan Mulai menggunakan WebSockets.
- Baca panduan Token sementara untuk autentikasi yang aman di aplikasi klien ke server.
- Clone Contoh API aktif dari GitHub.