Get started with Live API

Live API memungkinkan interaksi suara dan video real-time dengan latensi rendah bersama Gemini. API ini memproses aliran audio, video, atau teks yang berkelanjutan untuk memberikan respons lisan yang langsung dan terdengar seperti 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.

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.
  • Panduan Python Live API menggunakan Pyaudio yang terhubung ke Live API.

Integrasi partner

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

Sebelum Anda mulai membangun

Ada dua keputusan penting yang harus dibuat sebelum Anda mulai membangun dengan Live API: memilih model dan memilih pendekatan penerapan.

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. Fitur ini juga mengaktifkan fitur lanjutan seperti dialog afektif (sadar emosi), audio proaktif (di mana 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 bertingkat: Opsi ini menggunakan arsitektur model bertingkat (input audio native dan output text-to-speech). Metode ini menawarkan performa dan keandalan yang lebih baik di lingkungan produksi, terutama dengan penggunaan alat. Audio setengah bertingkat 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 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.

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 mono 16 kHz PCM 16-bit, dan Anda dapat menerima audio dengan menetapkan AUDIO sebagai modalitas respons. Output menggunakan frekuensi sampling 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()

# 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({});
// 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 yang aman di aplikasi klien ke server.
  • Untuk mengetahui informasi selengkapnya tentang WebSockets API yang mendasarinya, lihat Referensi WebSockets API.