ממשק Gemini Live API תומך בתרגום דיבור לדיבור בזמן אמת עם זמן טעינה נמוך, בין יותר מ-70 שפות, באמצעות מודל gemini-3.5-live-translate-preview. אם מגדירים את Live API עם הגדרות תרגום, אפשר להזרים אודיו בשפה אחת ולקבל פלט אודיו מתורגם בשפה אחרת, וכך ליהנות מתרגום קולי בזמן אמת.
נציג תמיכה לעומת תרגום בזמן אמת
שני הממשקים משתמשים ב-Live API, אבל המודל המנטלי של תרגום בזמן אמת שונה מזה של אינטראקציות עם סוכנים בזמן אמת.
| נציג תמיכה | תרגום בזמן אמת |
|---|---|
| המודל פועל כעוזר. הוא מקשיב, מסיק מסקנות ומבצע פעולות בשמכם. | המודל פועל כמתורגמן. הוא פועל כצינור לעיבוד נתונים של תרגום בזמן אמת. |
| משתמש באינטראקציות מבוססות-תור. הוא מסתמך על הפסקות בדיבור, זיהוי כוונות ומטפל בהפרעות. | נעשה שימוש בעיבוד זרמי נתונים. התרגום מתבצע בזמן שהדובר מדבר, בלי לחכות לתורו. |
| תומך בכלים ובסוכנים. תמיכה מובנית בשימוש בפונקציות, בחיפוש 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();
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)`);
}
}
}
}
};
שליחת אודיו
כדי להזרים קלט קולי לתרגום, שולחים אודיו PCM גולמי, little-endian, 16 ביט.
- פורמט אודיו של הקלט: PCM גולמי של 16 ביט ב-16kHz (מונו, little-endian).
- פורמט אודיו של הפלט: Raw 16-bit PCM at 24kHz (מונו, 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'
}
});
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));
}
}
הגדרות אישיות
כדי להפעיל את התרגום, צריך לציין את 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
}
}
}
שימוש בטוקנים זמניים באפליקציות בצד הלקוח
באפליקציות מסוג לקוח-שרת, אפשר להשתמש באסימונים זמניים (שנמצאים כרגע בv1beta) כדי להימנע מחשיפת מפתח ה-API.
כשמשתמשים בטוקנים זמניים עם תרגום בזמן אמת:
- חובה להשתמש בנקודת הקצה
v1beta. - נעילת ההגדרה: כברירת מחדל, צריך לציין את
translationConfigבאילוצי יצירת האסימון בשרת. כך מבטיחים שתצורת התרגום נעולה ושהלקוח לא יכול לשנות אותה. - ביטול הנעילה של ההגדרה: אם רוצים להגדיר את
translationConfigבצד הלקוח (לדוגמה, כדי לאפשר למשתמש לבחור את שפת היעד שלו), צריך להשמיט את ההגדרה הזו מבקשת יצירת הטוקן ולהגדיר במקומה את"lock_additional_fields": []. כך אפשר יהיה לבטל את הנעילה שלtranslationConfigכדי להגדיר אותו בצד הלקוח.
יצירת טוקן זמני מוגבל
בדוגמאות הבאות מוסבר איך ליצור אסימון זמני עם הגבלות תרגום.
Python
import datetime
from google import genai
now = datetime.datetime.now(tz=datetime.timezone.utc)
client = genai.Client()
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
}
}
},
}
)
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
}
}
},
},
});
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/auth_tokens" \
-H "x-goog-api-key: ${GEMINI_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"uses": 1,
"expireTime": "YYYY-MM-DDTHH:MM:SSZ",
"liveConnectConstraints": {
"model": "models/gemini-3.5-live-translate-preview",
"config": {
"responseModalities": ["AUDIO"],
"inputAudioTranscription": {},
"outputAudioTranscription": {},
"translationConfig": {
"targetLanguageCode": "pl",
"echoTargetLanguage": true
}
}
}
}'
מגבלות
- אמצעי קלט: יש תמיכה רק בקלט אודיו לתרגום. אין תמיכה בהזנת טקסט.
- רפליקציה של קולות: רפליקציה של קולות יכולה להיות לא עקבית. יכול להיות שהקולות ישתנו אחרי הפסקות ארוכות, שהמגדר ישתנה בהתאם לאופן שבו מתחילה השיחה או שהקול יישאר קבוע במהלך שיחות מהירות עם כמה משתתפים.
- זיהוי שפה: זיהוי שפה מתקשה בזיהוי מבטאים כבדים, שפות דומות (למשל ספרדית לעומת פורטוגזית) או מעברים מהירים בין שפות. הערה: השינוי הזה אמור להשפיע רק על התמליל של הקלט. קודי השפה והתרגום הסופי עדיין צריכים להיות מדויקים.
- אודיו ברקע: המודל נועד לסנן רעשים ומוזיקה כדי ליצור דיבור נקי, אבל יכול להיות שלא כל האודיו ברקע יסונן.
- הד של שפת היעד: כשמשתמשים ב-
echoTargetLanguage: true, רעשי רקע או מוזיקה יכולים לגרום לארטיפקטים באודיו המתורגם, אם האודיו המקורי כבר בשפת היעד.
שפות נתמכות
השפות הבאות נתמכות בתרגום בזמן אמת.
| שפה | קוד BCP-47 | שפה | קוד BCP-47 |
|---|---|---|---|
| אפריקאנס | af | קזחית | kk |
| אקאן | ak | חמרית | ק"מ |
| אלבנית | sq | קינירואנדה | rw |
| אמהרית | am | קוריאנית | ko |
| ערבית | ar | לאו | lo |
| ארמנית | hy | לטבית | lv |
| אזרית | az | ליטאית | lt |
| בסקית | eu | מקדונית | mk |
| בלארוסית | be | מלאית | ms |
| בנגלית | bn | מליאלאם | ml |
| בולגרית | bg | מראטהית | mr |
| בורמזית (מיאנמר) | my | מונגולית | mn |
| קטלאנית | ca | נפאלית | ne |
| סינית (פשוטה) | zh-Hans | נורווגית | no, nb |
| סינית (מסורתית) | zh-Hant | פרסית | fa |
| קרואטית | שעה | פולנית | pl |
| צ'כית | cs | פורטוגזית (ברזיל) | pt-BR |
| דנית | da | פורטוגזית (פורטוגל) | pt-PT |
| הולנדית | nl | פנג'אבי | pa |
| אנגלית | en | רומנית | ro |
| אסטונית | et | רוסית | ru |
| פיליפינית | fil | סרבית | sr |
| פינית | fi | סינדהית | SD |
| צרפתית | fr | סינהאלה | si |
| גליציאנית | gl | סלובקית | sk |
| גאורגית | ka | סלובנית | sl |
| גרמנית | de | ספרדית | es |
| יוונית | el | סונדנזית | su |
| גוג'ראטי | gu | סווהילי | sw |
| האוסה | ha | שוודית | sv |
| עברית | הוא | טמילית | ta |
| הינדי | hi | טלוגו | te |
| הונגרית | hu | תאית | th |
| איסלנדית | is | טורקית | tr |
| אינדונזית | id [מזהה] | אוקראינית | uk |
| איטלקית | it | אורדו | ur |
| יפנית | ja | אוזבקית | uz |
| ג'אווה | jv | וייטנאמית | vi |
| קנאדה | kn | זולו | zu |
המאמרים הבאים
- אפשר לקרוא את המדריך המלא בנושא יכולות של Live API.
- קוראים את המדריך איך מתחילים לעבוד עם ה-SDK.
- מומלץ לקרוא את המדריך איך מתחילים לעבוד עם WebSockets.
- במדריך טוקנים זמניים מוסבר איך לבצע אימות מאובטח באפליקציות מסוג לקוח-שרת.
- משכפלים את הדוגמאות ל-Live API מ-GitHub.