Get started with Live API

Live API memungkinkan interaksi suara dan video real-time latensi rendah dengan Gemini. API ini memproses aliran audio, video, atau teks yang berkelanjutan untuk memberikan respons lisan yang langsung dan mirip manusia, sehingga menciptakan pengalaman percakapan yang alami bagi pengguna Anda.

Ringkasan Live API

Live API menawarkan serangkaian fitur komprehensif seperti Deteksi Aktivitas Suara, penggunaan alat dan panggilan fungsi, pengelolaan sesi (untuk mengelola percakapan yang berjalan lama), dan token sementara (untuk autentikasi sisi klien yang aman).

Halaman ini akan membantu Anda memulai dengan contoh dan contoh kode dasar.

Coba Live API di Google AI Studio

Memilih pendekatan penerapan

Saat berintegrasi dengan Live API, Anda harus memilih salah satu pendekatan penerapan berikut:

  • Server-ke-server: Backend Anda terhubung ke Live API menggunakan WebSockets. Biasanya, klien Anda mengirimkan data streaming (audio, video, teks) ke server Anda, yang kemudian meneruskannya ke Live API.
  • Klien ke server: Kode frontend Anda terhubung langsung ke Live API menggunakan WebSockets untuk melakukan streaming data, dengan melewati backend Anda.

Integrasi partner

Untuk menyederhanakan pengembangan aplikasi audio dan video real-time, Anda dapat menggunakan integrasi pihak ketiga yang mendukung Gemini Live API melalui WebRTC atau WebSockets.

Mulai

Contoh sisi server ini men-streaming audio dari mikrofon dan memutar audio yang ditampilkan. Untuk contoh end-to-end lengkap termasuk aplikasi klien, lihat Aplikasi contoh.

Format audio input harus dalam format PCM 16-bit, 16 kHz, mono, dan audio yang diterima menggunakan frekuensi sampling 24 kHz.

Python

Instal helper untuk streaming audio. Dependensi tingkat sistem tambahan (misalnya, portaudio) mungkin diperlukan. Lihat dokumen PyAudio untuk mengetahui langkah-langkah penginstalan yang mendetail.

pip install pyaudio
import asyncio
from google import genai
import pyaudio

client = genai.Client()

# --- pyaudio config ---
FORMAT = pyaudio.paInt16
CHANNELS = 1
SEND_SAMPLE_RATE = 16000
RECEIVE_SAMPLE_RATE = 24000
CHUNK_SIZE = 1024

pya = pyaudio.PyAudio()

# --- Live API config ---
MODEL = "gemini-2.5-flash-native-audio-preview-09-2025"
CONFIG = {
    "response_modalities": ["AUDIO"],
    "system_instruction": "You are a helpful and friendly AI assistant.",
}

audio_queue_output = asyncio.Queue()
audio_queue_mic = asyncio.Queue(maxsize=5)
audio_stream = None

async def listen_audio():
    """Listens for audio and puts it into the mic audio queue."""
    global audio_stream
    mic_info = pya.get_default_input_device_info()
    audio_stream = await asyncio.to_thread(
        pya.open,
        format=FORMAT,
        channels=CHANNELS,
        rate=SEND_SAMPLE_RATE,
        input=True,
        input_device_index=mic_info["index"],
        frames_per_buffer=CHUNK_SIZE,
    )
    kwargs = {"exception_on_overflow": False} if __debug__ else {}
    while True:
        data = await asyncio.to_thread(audio_stream.read, CHUNK_SIZE, **kwargs)
        await audio_queue_mic.put({"data": data, "mime_type": "audio/pcm"})

async def send_realtime(session):
    """Sends audio from the mic audio queue to the GenAI session."""
    while True:
        msg = await audio_queue_mic.get()
        await session.send_realtime_input(audio=msg)

async def receive_audio(session):
    """Receives responses from GenAI and puts audio data into the speaker audio queue."""
    while True:
        turn = session.receive()
        async for response in turn:
            if (response.server_content and response.server_content.model_turn):
                for part in response.server_content.model_turn.parts:
                    if part.inline_data and isinstance(part.inline_data.data, bytes):
                        audio_queue_output.put_nowait(part.inline_data.data)

        # Empty the queue on interruption to stop playback
        while not audio_queue_output.empty():
            audio_queue_output.get_nowait()

async def play_audio():
    """Plays audio from the speaker audio queue."""
    stream = await asyncio.to_thread(
        pya.open,
        format=FORMAT,
        channels=CHANNELS,
        rate=RECEIVE_SAMPLE_RATE,
        output=True,
    )
    while True:
        bytestream = await audio_queue_output.get()
        await asyncio.to_thread(stream.write, bytestream)

async def run():
    """Main function to run the audio loop."""
    try:
        async with client.aio.live.connect(
            model=MODEL, config=CONFIG
        ) as live_session:
            print("Connected to Gemini. Start speaking!")
            async with asyncio.TaskGroup() as tg:
                tg.create_task(send_realtime(live_session))
                tg.create_task(listen_audio())
                tg.create_task(receive_audio(live_session))
                tg.create_task(play_audio())
    except asyncio.CancelledError:
        pass
    finally:
        if audio_stream:
            audio_stream.close()
        pya.terminate()
        print("\nConnection closed.")

if __name__ == "__main__":
    try:
        asyncio.run(run())
    except KeyboardInterrupt:
        print("Interrupted by user.")

JavaScript

Instal helper untuk streaming audio. Dependensi tingkat sistem tambahan mungkin diperlukan (sox untuk Mac/Windows atau ALSA untuk Linux). Lihat dokumen speaker dan mikrofon untuk mengetahui langkah-langkah penginstalan yang mendetail.

npm install mic speaker
import { GoogleGenAI, Modality } from '@google/genai';
import mic from 'mic';
import Speaker from 'speaker';

const ai = new GoogleGenAI({});
// WARNING: Do not use API keys in client-side (browser based) applications
// Consider using Ephemeral Tokens instead
// More information at: https://ai.google.dev/gemini-api/docs/ephemeral-tokens

// --- Live API config ---
const model = 'gemini-2.5-flash-native-audio-preview-09-2025';
const config = {
  responseModalities: [Modality.AUDIO],
  systemInstruction: "You are a helpful and friendly AI assistant.",
};

async function live() {
  const responseQueue = [];
  const audioQueue = [];
  let speaker;

  async function waitMessage() {
    while (responseQueue.length === 0) {
      await new Promise((resolve) => setImmediate(resolve));
    }
    return responseQueue.shift();
  }

  function createSpeaker() {
    if (speaker) {
      process.stdin.unpipe(speaker);
      speaker.end();
    }
    speaker = new Speaker({
      channels: 1,
      bitDepth: 16,
      sampleRate: 24000,
    });
    speaker.on('error', (err) => console.error('Speaker error:', err));
    process.stdin.pipe(speaker);
  }

  async function messageLoop() {
    // Puts incoming messages in the audio queue.
    while (true) {
      const message = await waitMessage();
      if (message.serverContent && message.serverContent.interrupted) {
        // Empty the queue on interruption to stop playback
        audioQueue.length = 0;
        continue;
      }
      if (message.serverContent && message.serverContent.modelTurn && message.serverContent.modelTurn.parts) {
        for (const part of message.serverContent.modelTurn.parts) {
          if (part.inlineData && part.inlineData.data) {
            audioQueue.push(Buffer.from(part.inlineData.data, 'base64'));
          }
        }
      }
    }
  }

  async function playbackLoop() {
    // Plays audio from the audio queue.
    while (true) {
      if (audioQueue.length === 0) {
        if (speaker) {
          // Destroy speaker if no more audio to avoid warnings from speaker library
          process.stdin.unpipe(speaker);
          speaker.end();
          speaker = null;
        }
        await new Promise((resolve) => setImmediate(resolve));
      } else {
        if (!speaker) createSpeaker();
        const chunk = audioQueue.shift();
        await new Promise((resolve) => {
          speaker.write(chunk, () => resolve());
        });
      }
    }
  }

  // Start loops
  messageLoop();
  playbackLoop();

  // Connect to Gemini Live API
  const session = await ai.live.connect({
    model: model,
    config: config,
    callbacks: {
      onopen: () => console.log('Connected to Gemini Live API'),
      onmessage: (message) => responseQueue.push(message),
      onerror: (e) => console.error('Error:', e.message),
      onclose: (e) => console.log('Closed:', e.reason),
    },
  });

  // Setup Microphone for input
  const micInstance = mic({
    rate: '16000',
    bitwidth: '16',
    channels: '1',
  });
  const micInputStream = micInstance.getAudioStream();

  micInputStream.on('data', (data) => {
    // API expects base64 encoded PCM data
    session.sendRealtimeInput({
      audio: {
        data: data.toString('base64'),
        mimeType: "audio/pcm;rate=16000"
      }
    });
  });

  micInputStream.on('error', (err) => {
    console.error('Microphone error:', err);
  });

  micInstance.start();
  console.log('Microphone started. Speak now...');
}

live().catch(console.error);

Contoh aplikasi

Lihat contoh aplikasi berikut yang mengilustrasikan cara menggunakan Live API untuk kasus penggunaan end-to-end:

  • Aplikasi starter audio live di AI Studio, menggunakan library JavaScript untuk terhubung ke Live API dan melakukan streaming audio dua arah melalui mikrofon dan speaker Anda.
  • Lihat Integrasi partner untuk contoh tambahan dan panduan memulai.

Langkah berikutnya

  • Baca panduan Kemampuan Live API lengkap untuk mengetahui kemampuan dan konfigurasi utama, termasuk Deteksi Aktivitas Suara dan fitur audio native.
  • Baca panduan Penggunaan alat untuk mempelajari cara mengintegrasikan Live API dengan alat dan panggilan fungsi.
  • Baca panduan Pengelolaan sesi untuk mengelola percakapan yang berjalan lama.
  • Baca panduan Token sementara untuk autentikasi yang aman di aplikasi klien ke server.
  • Untuk mengetahui informasi selengkapnya tentang WebSockets API yang mendasarinya, lihat Referensi WebSockets API.