การแปลสดด้วย Gemini Live API

Gemini Live API รองรับการแปลเสียงพูดแบบเรียลไทม์ที่มีเวลาในการตอบสนองต่ำระหว่างภาษาต่างๆ กว่า 70 ภาษาโดยใช้โมเดล gemini-3.5-live-translate-preview การกำหนดค่า Live API ด้วยการตั้งค่าการแปลจะช่วยให้คุณสตรีมเสียงในภาษาหนึ่งและรับเอาต์พุตเสียงที่แปลแล้วในอีกภาษาหนึ่งได้ ซึ่งจะช่วยให้การแปลเสียงเป็นเสียงแบบเรียลไทม์เป็นไปอย่างราบรื่น

เจ้าหน้าที่บริการลูกค้าเทียบกับการแปลสด

แม้ว่าทั้ง 2 อย่างจะใช้ Live API แต่โมเดลทางจิตวิทยาสำหรับการแปลสดนั้นแตกต่างจากการโต้ตอบกับตัวแทนแบบเรียลไทม์ผ่านการสนทนา

ตัวแทนแบบเรียลไทม์ การแปลสด
โมเดลจะทำหน้าที่เป็นผู้ช่วย โดยจะรับฟัง ให้เหตุผล และดำเนินการในนามของคุณ โมเดลทำหน้าที่เป็นล่าม โดยทำงานเป็นไปป์ไลน์การแปลแบบเรียลไทม์
ใช้การโต้ตอบแบบผลัดกัน ใช้การหยุดชั่วคราว การตรวจหาเจตนา และจัดการการหยุดชะงัก ใช้การประมวลผลสตรีมแบบต่อเนื่อง แปลขณะที่ผู้พูดพูดโดยไม่ต้องรอให้ถึงคิว
รองรับเครื่องมือและเอเจนต์ รองรับการเรียกใช้ฟังก์ชัน, Google Search และคำสั่งโดยเนทีฟ รองรับการแปลเท่านั้น การแปลที่มีเวลาในการตอบสนองต่ำอย่างแท้จริง โดยไม่มีการรองรับเครื่องมือหรือคำสั่ง
ประมวลผลข้อมูลได้หลายรูปแบบอย่างเต็มที่ รองรับอินพุตข้อความ เสียง วิดีโอ และรูปภาพ เสียงถูกจำกัด โดยจะจำกัดเฉพาะเสียงเพื่อรักษาระดับเวลาในการตอบสนองแบบเรียลไทม์ที่เข้มงวด
การกำหนดค่าแบบละเอียด ใช้คำสั่งการสร้าง คำสั่งเสียง เครื่องมือ และคำสั่งของระบบ การกำหนดค่าที่ง่ายขึ้น ตั้งค่า 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 แบบ 16 บิต, Little-Endian ที่ยังไม่ได้ประมวลผล

  • รูปแบบเสียงอินพุต: PCM แบบ 16 บิตดิบที่ 16 kHz (โมโน, Little-Endian)
  • รูปแบบเสียงเอาต์พุต: PCM แบบ 16 บิตดิบที่ 24 kHz (โมโน, 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
      }
    }
}

โทเค็นชั่วคราวสำหรับแอปพลิเคชันฝั่งไคลเอ็นต์

สำหรับแอปพลิเคชันไคลเอ็นต์ต่อเซิร์ฟเวอร์ คุณสามารถใช้โทเค็นชั่วคราว (ปัจจุบันอยู่ใน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
แอฟริคานส์ af คาซัค kk
อะคัน ak เขมร กม.
แอลเบเนีย sq คินยารวันดา rw
อัมฮาริก am เกาหลี ko
อาหรับ ar ภาษาลาว lo
อาร์เมเนีย hy ลัตเวีย lv
อาร์เซอร์ไบจัน az ลิทัวเนีย lt
บาสก์ eu มาซีโดเนีย mk
เบลารุส be มาเลย์ มิลลิวินาที
เบงกอล 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

ขั้นตอนถัดไป