ترجمه زنده با Gemini Live API

رابط برنامه‌نویسی نرم‌افزار Gemini Live از ترجمه گفتار به گفتار با تأخیر کم و به‌صورت بلادرنگ بین بیش از ۷۰ زبان با استفاده از مدل gemini-3.5-live-translate-preview پشتیبانی می‌کند. با پیکربندی رابط برنامه‌نویسی نرم‌افزار زنده با تنظیمات ترجمه، می‌توانید صدا را به یک زبان پخش کنید و خروجی صدای ترجمه‌شده را به زبان دیگر دریافت کنید و ترجمه صدا به صدای بلادرنگ و یکپارچه را امکان‌پذیر سازید.

نماینده زنده در مقابل ترجمه زنده

اگرچه هر دو از Live API استفاده می‌کنند، اما مدل ذهنی برای ترجمه زنده با تعاملات مکالمه‌ای بلادرنگ اپراتور متفاوت است.

عامل زنده ترجمه زنده
این مدل مانند یک دستیار عمل می‌کند. به حرف‌های شما گوش می‌دهد، استدلال می‌کند و از طرف شما اقدام می‌کند. این مدل به عنوان یک مفسر عمل می‌کند. این مدل مانند یک خط لوله مترجم بلادرنگ عمل می‌کند.
از تعاملات نوبتی استفاده می‌کند. بر مکث‌ها، تشخیص قصد و مدیریت وقفه‌ها تکیه دارد. از پردازش جریان پیوسته استفاده می‌کند. همزمان با صحبت گوینده، بدون انتظار برای نوبت، ترجمه را انجام می‌دهد.
پشتیبانی از ابزارها و عامل‌ها. پشتیبانی بومی برای فراخوانی تابع، جستجوی گوگل و دستورالعمل‌ها. فقط از ترجمه پشتیبانی می‌کند. ترجمه کاملاً کم‌تاخیر؛ هیچ پشتیبانی از ابزارها یا دستورالعمل‌ها ندارد.
کاملاً چندوجهی. از ورودی‌های متن، صدا، ویدئو و تصویر پشتیبانی می‌کند. صدا محدود شده است. ورودی به صدا محدود شده است تا آستانه‌های تأخیر دقیق در زمان واقعی تضمین شود.
پیکربندی جزئی. از تولید، گفتار، ابزارها و دستورالعمل‌های سیستمی استفاده می‌کند. پیکربندی ساده‌شده. تنظیم target_language_code و گزینه‌هایی مانند echo_target_language .

شروع کنید

مثال‌های زیر نحوه‌ی مقداردهی اولیه‌ی یک کلاینت و اتصال به Live API با پیکربندی ترجمه را نشان می‌دهند.

پایتون

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

جاوا اسکریپت

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

ارسال صدا

برای پخش ورودی‌های صوتی برای ترجمه، شما صدای خام PCM شانزده بیتی با فرمت little-endian ارسال می‌کنید.

  • فرمت صدای ورودی : PCM خام ۱۶ بیتی با فرکانس ۱۶ کیلوهرتز (مونو، لیتل اندیان).
  • فرمت صدای خروجی : PCM خام ۱۶ بیتی با فرکانس ۲۴ کیلوهرتز (مونو، لیتل اندیان).
  • اندازه قطعه و تأخیر : صدا را در قطعات ۱۰۰ میلی‌ثانیه‌ای ارسال کنید.

مثال‌های زیر نحوه ارسال تکه‌های صوتی به جلسه را نشان می‌دهند.

پایتون

# Assuming 'chunk' is your raw PCM audio bytes
await session.send_realtime_input(
    audio=types.Blob(
        data=chunk,
        mime_type="audio/pcm;rate=16000"
    )
)

جاوا اسکریپت

// 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 برای تنظیم در سمت کلاینت باز می‌کند.

ایجاد یک توکن موقت محدود

مثال‌های زیر نحوه ایجاد یک توکن موقت با محدودیت‌های ترجمه را نشان می‌دهند.

پایتون

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

جاوا اسکریپت

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
آذربایجانی آز لیتوانیایی آن
باسک اتحادیه اروپا مقدونی مک
بلاروسی باش مالایی ام‌اس
بنگالی بی ان مالایالامی میلی‌لیتر
بلغاری بی جی مراتی آقای
برمه‌ای (میانمار) من مغولی من
کاتالان حدود نپالی نه
چینی (ساده‌شده) ژ-هانس نروژی نه، توجه داشته باشید
چینی (سنتی) ژ-هانت فارسی فا
کرواتی ساعت لهستانی پل
چک سی اس پرتغالی (برزیل) پی تی-بی آر
دانمارکی دا پرتغالی (پرتغال) پی تی-پی تی
هلندی ان ال پنجابی پا
انگلیسی انگلیسی رومانیایی رو
استونیایی و روسی انگشت های دست فاصله
فیلیپینی فیل صربی اس آر
فنلاندی فی سندی اس دی
فرانسوی فر سینهالی سی
گالیسیایی گل اسلواکی اسک
گرجی کا اسلوونیایی اس ال
آلمانی د اسپانیایی ها
یونانی ال سوندایی سو
گجراتی گو سواحیلی جنوب غربی
هوسا هکتار سوئدی اس وی
عبری او تامیل تا
هندی سلام تلوگو ته
مجارستانی هو تایلندی هفتم
ایسلندی است ترکی تر
اندونزیایی شناسه اوکراینی انگلستان
ایتالیایی آن اردو تو
ژاپنی جا ازبکی یو پی اس
جاوه ای جی وی ویتنامی وی
کانارا کن زولو زو

قدم بعدی چیست؟