Get started with Live API

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

Ringkasan Live API

Live API menawarkan serangkaian fitur komprehensif seperti Voice Activity Detection, 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 dan menjalankan contoh serta contoh kode dasar.

Contoh aplikasi

Lihat contoh aplikasi berikut yang mengilustrasikan cara menggunakan Live API untuk kasus penggunaan menyeluruh:

  • Aplikasi awal audio live di AI Studio, menggunakan library JavaScript untuk terhubung ke Live API dan melakukan streaming audio dua arah melalui mikrofon dan speaker Anda.
  • Cookbook Python Live API menggunakan Pyaudio yang terhubung ke Live API.

Integrasi partner

Jika lebih memilih proses pengembangan yang lebih sederhana, Anda dapat menggunakan Daily atau LiveKit. Ini adalah platform partner pihak ketiga yang telah mengintegrasikan Gemini Live API melalui protokol WebRTC untuk menyederhanakan pengembangan aplikasi audio dan video secara real-time.

Sebelum Anda mulai mem-build

Ada dua keputusan penting yang harus dibuat sebelum Anda mulai mem-build dengan Live API: memilih model dan memilih pendekatan implementasi.

Memilih arsitektur pembuatan audio

Jika Anda membuat kasus penggunaan berbasis audio, pilihan model Anda akan menentukan arsitektur pembuatan audio yang digunakan untuk membuat respons audio:

  • Audio native: Opsi ini memberikan ucapan yang terdengar paling alami dan realistis serta performa multibahasa yang lebih baik. Model ini juga memungkinkan fitur lanjutan seperti dialog afektif (yang memahami emosi), audio proaktif (saat model dapat memutuskan untuk mengabaikan atau merespons input tertentu), dan "berpikir". Audio native didukung oleh model audio native berikut:
    • gemini-2.5-flash-preview-native-audio-dialog
    • gemini-2.5-flash-exp-native-audio-thinking-dialog
  • Audio setengah kaskade: Opsi ini menggunakan arsitektur model kaskade (input audio native dan output text-to-speech). Solusi ini menawarkan performa dan keandalan yang lebih baik di lingkungan produksi, terutama dengan penggunaan alat. Audio setengah kaskade didukung oleh model berikut:
    • gemini-live-2.5-flash-preview
    • gemini-2.0-flash-live-001

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 mengirim data streaming (audio, video, teks) ke server, yang kemudian meneruskannya ke Live API.
  • Klien ke server: Kode frontend Anda terhubung langsung ke Live API menggunakan WebSockets untuk melakukan streaming data, sehingga mengabaikan backend Anda.

Mulai

Contoh ini membaca file WAV, mengirimkannya dalam format yang benar, dan menyimpan data yang diterima sebagai file WAV.

Anda dapat mengirim audio dengan mengonversinya ke format PCM 16-bit, 16 kHz, mono, dan Anda dapat menerima audio dengan menetapkan AUDIO sebagai modalitas respons. Output menggunakan frekuensi sampel 24 kHz.

Python

# Test file: https://storage.googleapis.com/generativeai-downloads/data/16000.wav
# Install helpers for converting files: pip install librosa soundfile
import asyncio
import io
from pathlib import Path
import wave
from google import genai
from google.genai import types
import soundfile as sf
import librosa

client = genai.Client(api_key="GEMINI_API_KEY")

# Half cascade model:
# model = "gemini-live-2.5-flash-preview"

# Native audio output model:
model = "gemini-2.5-flash-preview-native-audio-dialog"

config = {
  "response_modalities": ["AUDIO"],
  "system_instruction": "You are a helpful assistant and answer in a friendly tone.",
}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:

        buffer = io.BytesIO()
        y, sr = librosa.load("sample.wav", sr=16000)
        sf.write(buffer, y, sr, format='RAW', subtype='PCM_16')
        buffer.seek(0)
        audio_bytes = buffer.read()

        # If already in correct format, you can use this:
        # audio_bytes = Path("sample.pcm").read_bytes()

        await session.send_realtime_input(
            audio=types.Blob(data=audio_bytes, mime_type="audio/pcm;rate=16000")
        )

        wf = wave.open("audio.wav", "wb")
        wf.setnchannels(1)
        wf.setsampwidth(2)
        wf.setframerate(24000)  # Output is 24kHz

        async for response in session.receive():
            if response.data is not None:
                wf.writeframes(response.data)

            # Un-comment this code to print audio data info
            # if response.server_content.model_turn is not None:
            #      print(response.server_content.model_turn.parts[0].inline_data.mime_type)

        wf.close()

if __name__ == "__main__":
    asyncio.run(main())

JavaScript

// Test file: https://storage.googleapis.com/generativeai-downloads/data/16000.wav
import { GoogleGenAI, Modality } from '@google/genai';
import * as fs from "node:fs";
import pkg from 'wavefile';  // npm install wavefile
const { WaveFile } = pkg;

const ai = new GoogleGenAI({ apiKey: "GEMINI_API_KEY" });
// 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

// Half cascade model:
// const model = "gemini-live-2.5-flash-preview"

// Native audio output model:
const model = "gemini-2.5-flash-preview-native-audio-dialog"

const config = {
  responseModalities: [Modality.AUDIO], 
  systemInstruction: "You are a helpful assistant and answer in a friendly tone."
};

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

    async function waitMessage() {
        let done = false;
        let message = undefined;
        while (!done) {
            message = responseQueue.shift();
            if (message) {
                done = true;
            } else {
                await new Promise((resolve) => setTimeout(resolve, 100));
            }
        }
        return message;
    }

    async function handleTurn() {
        const turns = [];
        let done = false;
        while (!done) {
            const message = await waitMessage();
            turns.push(message);
            if (message.serverContent && message.serverContent.turnComplete) {
                done = true;
            }
        }
        return turns;
    }

    const session = await ai.live.connect({
        model: model,
        callbacks: {
            onopen: function () {
                console.debug('Opened');
            },
            onmessage: function (message) {
                responseQueue.push(message);
            },
            onerror: function (e) {
                console.debug('Error:', e.message);
            },
            onclose: function (e) {
                console.debug('Close:', e.reason);
            },
        },
        config: config,
    });

    // Send Audio Chunk
    const fileBuffer = fs.readFileSync("sample.wav");

    // Ensure audio conforms to API requirements (16-bit PCM, 16kHz, mono)
    const wav = new WaveFile();
    wav.fromBuffer(fileBuffer);
    wav.toSampleRate(16000);
    wav.toBitDepth("16");
    const base64Audio = wav.toBase64();

    // If already in correct format, you can use this:
    // const fileBuffer = fs.readFileSync("sample.pcm");
    // const base64Audio = Buffer.from(fileBuffer).toString('base64');

    session.sendRealtimeInput(
        {
            audio: {
                data: base64Audio,
                mimeType: "audio/pcm;rate=16000"
            }
        }

    );

    const turns = await handleTurn();

    // Combine audio data strings and save as wave file
    const combinedAudio = turns.reduce((acc, turn) => {
        if (turn.data) {
            const buffer = Buffer.from(turn.data, 'base64');
            const intArray = new Int16Array(buffer.buffer, buffer.byteOffset, buffer.byteLength / Int16Array.BYTES_PER_ELEMENT);
            return acc.concat(Array.from(intArray));
        }
        return acc;
    }, []);

    const audioBuffer = new Int16Array(combinedAudio);

    const wf = new WaveFile();
    wf.fromScratch(1, 24000, '16', audioBuffer);  // output is 24kHz
    fs.writeFileSync('audio.wav', wf.toBuffer());

    session.close();
}

async function main() {
    await live().catch((e) => console.error('got error', e));
}

main();

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 aman di aplikasi klien ke server.
  • Untuk informasi selengkapnya tentang WebSockets API yang mendasarinya, lihat Referensi WebSockets API.