Get started with Live API

رابط برنامه‌نویسی کاربردی زنده (Live API) امکان تعاملات صوتی و تصویری با تأخیر کم و به‌صورت بلادرنگ را با Gemini فراهم می‌کند. این رابط، جریان‌های مداوم صدا، تصویر یا متن را پردازش می‌کند تا پاسخ‌های گفتاری فوری و شبیه به انسان ارائه دهد و یک تجربه مکالمه طبیعی را برای کاربران شما ایجاد کند.

بررسی اجمالی API زنده

API زنده مجموعه‌ای جامع از ویژگی‌ها مانند تشخیص فعالیت صوتی ، استفاده از ابزار و فراخوانی توابع ، مدیریت جلسه (برای مدیریت مکالمات طولانی مدت) و توکن‌های موقت (برای احراز هویت امن سمت کلاینت) را ارائه می‌دهد.

این صفحه با مثال‌ها و نمونه‌های کد اولیه، شما را برای شروع کار آماده می‌کند.

API زنده را در Google AI Studio امتحان کنید

مثال‌های کاربردی

به مثال‌های زیر که نحوه استفاده از Live API را برای موارد استفاده سرتاسری نشان می‌دهند، نگاهی بیندازید:

  • اپلیکیشن شروع پخش زنده صدا در AI Studio، با استفاده از کتابخانه‌های جاوا اسکریپت برای اتصال به Live API و پخش صدای دو طرفه از طریق میکروفون و بلندگوهای شما.
  • کتاب آشپزی پایتون با رابط برنامه‌نویسی زنده (Live API) با استفاده از Pyaudio که به رابط برنامه‌نویسی زنده (Live API) متصل می‌شود.

ادغام شرکا

اگر فرآیند توسعه ساده‌تری را ترجیح می‌دهید، می‌توانید از Daily ، LiveKit یا Voximplant استفاده کنید. این‌ها پلتفرم‌های همکار شخص ثالث هستند که قبلاً Gemini Live API را بر روی پروتکل WebRTC ادغام کرده‌اند تا توسعه برنامه‌های صوتی و تصویری بلادرنگ را ساده‌تر کنند.

قبل از شروع ساخت

قبل از شروع به ساخت API زنده، دو تصمیم مهم وجود دارد: انتخاب یک مدل و انتخاب یک رویکرد پیاده‌سازی.

یک معماری تولید صدا انتخاب کنید

اگر در حال ساخت یک مورد استفاده مبتنی بر صدا هستید، انتخاب مدل شما، معماری تولید صدای مورد استفاده برای ایجاد پاسخ صوتی را تعیین می‌کند:

  • صدای بومی : این گزینه طبیعی‌ترین و واقعی‌ترین صدا و عملکرد چندزبانه بهتری را ارائه می‌دهد. همچنین ویژگی‌های پیشرفته‌ای مانند گفتگوی عاطفی (آگاه از احساسات) ، صدای پیشگیرانه (که در آن مدل می‌تواند تصمیم بگیرد ورودی‌های خاصی را نادیده بگیرد یا به آنها پاسخ دهد) و «تفکر» را فعال می‌کند. صدای بومی توسط مدل‌های صوتی بومی زیر پشتیبانی می‌شود:
    • gemini-2.5-flash-native-audio-preview-09-2025
  • صدای نیمه آبشاری : این گزینه از معماری مدل آبشاری (ورودی صدای بومی و خروجی تبدیل متن به گفتار) استفاده می‌کند. این گزینه عملکرد و قابلیت اطمینان بهتری را در محیط‌های تولید، به ویژه با استفاده از ابزار ، ارائه می‌دهد. صدای نیمه آبشاری توسط مدل‌های زیر پشتیبانی می‌شود:
    • gemini-live-2.5-flash-preview
    • gemini-2.0-flash-live-001

انتخاب رویکرد پیاده‌سازی

هنگام ادغام با Live API، باید یکی از رویکردهای پیاده‌سازی زیر را انتخاب کنید:

  • سرور به سرور : بک‌اند شما با استفاده از WebSockets به Live API متصل می‌شود. معمولاً کلاینت شما داده‌های استریم (صوت، تصویر، متن) را به سرور شما ارسال می‌کند، که سپس آن را به Live API ارسال می‌کند.
  • کلاینت به سرور : کد فرانت‌اند شما مستقیماً با استفاده از WebSockets به Live API متصل می‌شود تا داده‌ها را پخش کند و بک‌اند شما را دور بزند.

شروع کنید

این مثال یک فایل WAV را می‌خواند ، آن را با فرمت صحیح ارسال می‌کند و داده‌های دریافتی را به عنوان فایل WAV ذخیره می‌کند.

شما می‌توانید صدا را با تبدیل آن به PCM 16 بیتی، 16 کیلوهرتز، فرمت مونو ارسال کنید و با تنظیم AUDIO به عنوان روش پاسخ، صدا را دریافت کنید. خروجی از نرخ نمونه‌برداری 24 کیلوهرتز استفاده می‌کند.

پایتون

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

# New native audio model:
model = "gemini-2.5-flash-native-audio-preview-09-2025"

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

جاوا اسکریپت

// 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

// New native audio model:
const model = "gemini-2.5-flash-native-audio-preview-09-2025"

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

قدم بعدی چیست؟

  • برای آشنایی با قابلیت‌ها و پیکربندی‌های کلیدی، راهنمای کامل قابلیت‌های Live API را مطالعه کنید؛ از جمله تشخیص فعالیت صوتی و ویژگی‌های صوتی بومی.
  • برای یادگیری نحوه ادغام Live API با ابزارها و فراخوانی توابع، راهنمای استفاده از ابزار را مطالعه کنید.
  • برای مدیریت مکالمات طولانی مدت، راهنمای مدیریت جلسه را مطالعه کنید.
  • برای احراز هویت امن در برنامه‌های کلاینت به سرور ، راهنمای توکن‌های زودگذر را مطالعه کنید.
  • برای اطلاعات بیشتر در مورد API مربوط به WebSockets، به مرجع API مربوط به WebSockets مراجعه کنید.