Get started with Live API

Live API, Gemini ile düşük gecikmeli ve gerçek zamanlı sesli ve görüntülü etkileşimler sağlar. Anında, insan benzeri sözlü yanıtlar vermek için sürekli ses, video veya metin akışlarını işler ve kullanıcılarınız için doğal bir sohbet deneyimi oluşturur.

Live API'ye Genel Bakış

Live API; ses etkinliği algılama, araç kullanımı ve işlev çağırma, oturum yönetimi (uzun süren sohbetleri yönetmek için) ve kısa ömürlü jetonlar (güvenli istemci taraflı kimlik doğrulama için) gibi kapsamlı bir özellik seti sunar.

Bu sayfada, örnekler ve temel kod örnekleriyle çalışmaya başlayabilirsiniz.

Örnek uygulamalar

Uçtan uca kullanım alanlarında Live API'nin nasıl kullanılacağını gösteren aşağıdaki örnek uygulamalara göz atın:

  • AI Studio'da canlı ses başlangıç uygulaması. Bu uygulama, Live API'ye bağlanmak ve mikrofonunuz ile hoparlörleriniz aracılığıyla çift yönlü ses akışı sağlamak için JavaScript kitaplıklarını kullanır.
  • Live API'ye bağlanan Pyaudio'yu kullanan Live API Python cookbook.

İş ortağı entegrasyonları

Daha basit bir geliştirme süreci tercih ederseniz Daily, LiveKit veya Voximplant'ı kullanabilirsiniz. Bunlar, gerçek zamanlı ses ve video uygulamalarının geliştirilmesini kolaylaştırmak için Gemini Live API'yi WebRTC protokolü üzerinden entegre etmiş üçüncü taraf iş ortağı platformlarıdır.

Oluşturmaya başlamadan önce

Live API ile geliştirmeye başlamadan önce vermeniz gereken iki önemli karar vardır: model seçimi ve uygulama yaklaşımı seçimi.

Ses üretimi mimarisi seçme

Sese dayalı bir kullanım alanı oluşturuyorsanız model seçiminiz, ses yanıtı oluşturmak için kullanılan ses üretimi mimarisini belirler:

  • Doğal ses: Bu seçenek, en doğal ve gerçekçi sesli okumayı sağlar ve çok dilli performansı iyileştirir. Ayrıca duygusal (duygulara duyarlı) diyalog, proaktif ses (modelin belirli girişleri yoksaymaya veya yanıtlamaya karar verebileceği yer) ve "düşünme" gibi gelişmiş özellikleri de etkinleştirir. Doğal ses, aşağıdaki doğal ses modelleri tarafından desteklenir:
    • gemini-2.5-flash-preview-native-audio-dialog
    • gemini-2.5-flash-exp-native-audio-thinking-dialog
  • Yarı kademeli ses: Bu seçenekte kademeli model mimarisi (doğal ses girişi ve metin okuma çıkışı) kullanılır. Üretim ortamlarında, özellikle araç kullanımı açısından daha iyi performans ve güvenilirlik sunar. Yarı kademeli ses, aşağıdaki modellerde desteklenir:
    • gemini-live-2.5-flash-preview
    • gemini-2.0-flash-live-001

Bir uygulama yaklaşımı seçin

Live API ile entegrasyon yaparken aşağıdaki uygulama yaklaşımlarından birini seçmeniz gerekir:

  • Sunucudan sunucuya: Arka ucunuz, WebSockets kullanarak Live API'ye bağlanır. Genellikle istemciniz, akış verilerini (ses, video, metin) sunucunuza gönderir. Sunucunuz da bu verileri Live API'ye iletir.
  • İstemciden sunucuya: Ön uç kodunuz, verileri yayınlamak için WebSockets kullanarak doğrudan Live API'ye bağlanır ve arka ucunuzu atlar.

Başlayın

Bu örnek bir WAV dosyasını okur, doğru biçimde gönderir ve alınan verileri WAV dosyası olarak kaydeder.

Sesi 16 bit PCM, 16 kHz, mono biçimine dönüştürerek gönderebilir ve yanıt biçimi olarak AUDIO'yı ayarlayarak ses alabilirsiniz. Çıkışta 24 kHz örnekleme hızı kullanılır.

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

Sırada ne var?

  • Konuşma Etkinliği Algılama ve yerel ses özellikleri de dahil olmak üzere temel özellikler ve yapılandırmalar için Live API Özellikleri kılavuzunun tamamını okuyun.
  • Live API'yi araçlarla ve işlev çağrısıyla nasıl entegre edeceğinizi öğrenmek için Araç kullanımı kılavuzunu okuyun.
  • Uzun süren sohbetleri yönetmek için Oturum yönetimi kılavuzunu okuyun.
  • İstemciden sunucuya uygulamalarda güvenli kimlik doğrulama için Geçici jetonlar kılavuzunu okuyun.
  • Temel alınan WebSocket API'si hakkında daha fazla bilgi için WebSocket API referansı başlıklı makaleyi inceleyin.