راهنمای قابلیت‌های API زنده

این یک راهنمای جامع است که قابلیت‌ها و پیکربندی‌های موجود با Live API را پوشش می‌دهد. برای مرور کلی و نمونه کد برای موارد استفاده رایج، به صفحه شروع به کار با Live API مراجعه کنید.

قبل از اینکه شروع کنی

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

مقایسه مدل

جدول زیر تفاوت‌های کلیدی بین مدل‌های Gemini 3.1 Flash Live Preview و Gemini 2.5 Flash Live Preview را خلاصه می‌کند:

ویژگی پیش‌نمایش زنده‌ی Gemini 3.1 Flash پیش‌نمایش زنده Gemini 2.5 Flash
تفکر thinkingLevel برای کنترل عمق تفکر با تنظیماتی مانند minimal ، low ، medium و high استفاده می‌کند. برای بهینه‌سازی با کمترین تأخیر، پیش‌فرض روی minimal است. به Thinking levels and budgets مراجعه کنید. thinkingBudget برای تنظیم تعداد توکن‌های تفکر استفاده می‌کند. تفکر پویا به طور پیش‌فرض فعال است. برای غیرفعال کردن، thinkingBudget را روی 0 تنظیم کنید. به سطوح و بودجه‌های تفکر مراجعه کنید.
دریافت پاسخ یک رویداد سرور می‌تواند همزمان شامل چندین بخش محتوا باشد (برای مثال، inlineData و transcript). مطمئن شوید که کد شما تمام بخش‌ها را در هر رویداد پردازش می‌کند تا از گم شدن محتوا جلوگیری شود. هر رویداد سرور فقط شامل یک بخش محتوا است. بخش‌ها در رویدادهای جداگانه ارائه می‌شوند.
محتوای مشتری send_client_content فقط برای ثبت تاریخچه متن اولیه پشتیبانی می‌شود (نیاز به تنظیم initial_history_in_client_content در پیکربندی جلسه دارد). برای ارسال به‌روزرسانی‌های متنی در طول مکالمه، به جای آن send_realtime_input استفاده کنید. send_client_content در طول مکالمه برای ارسال به‌روزرسانی‌های تدریجی محتوا و ایجاد زمینه پشتیبانی می‌شود.
پوشش نوبت مقدار پیش‌فرض TURN_INCLUDES_AUDIO_ACTIVITY_AND_ALL_VIDEO است. نوبت مدل شامل فعالیت صوتی شناسایی‌شده و تمام فریم‌های ویدیویی می‌شود. مقدار پیش‌فرض TURN_INCLUDES_ONLY_ACTIVITY است. نوبت مدل فقط شامل فعالیت شناسایی‌شده می‌شود.
VAD سفارشی ( activity_start / activity_end ) پشتیبانی می‌شود . VAD خودکار را غیرفعال کنید و پیام‌های activityStart و activityEnd را به صورت دستی ارسال کنید تا مرزهای نوبت را کنترل کنید. پشتیبانی می‌شود . VAD خودکار را غیرفعال کنید و پیام‌های activityStart و activityEnd را به صورت دستی ارسال کنید تا مرزهای نوبت را کنترل کنید.
پیکربندی خودکار VAD پارامترهایی مانند start_of_speech_sensitivity ، end_of_speech_sensitivity ، prefix_padding_ms و silence_duration_ms پیکربندی کنید . پارامترهایی مانند start_of_speech_sensitivity ، end_of_speech_sensitivity ، prefix_padding_ms و silence_duration_ms پیکربندی کنید .
فراخوانی ناهمزمان تابع ( behavior: NON_BLOCKING ) پشتیبانی نمی‌شود . فراخوانی تابع فقط به صورت ترتیبی است. مدل تا زمانی که پاسخ ابزار را ارسال نکرده باشید، شروع به پاسخگویی نمی‌کند. پشتیبانی می‌شود . behavior در اعلان تابع روی NON_BLOCKING تنظیم کنید تا مدل در حین اجرای تابع به تعامل ادامه دهد. نحوه مدیریت پاسخ‌ها توسط مدل را با پارامتر scheduling ( INTERRUPT ، WHEN_IDLE یا SILENT ) کنترل کنید.
صدای پیشگیرانه پشتیبانی نمی‌شود پشتیبانی می‌شود . وقتی فعال باشد، مدل می‌تواند به صورت پیشگیرانه تصمیم بگیرد که اگر محتوای ورودی مرتبط نباشد، پاسخ ندهد. در پیکربندی proactivity ، proactive_audio را روی true تنظیم کنید (نیازمند v1beta ).
گفتگوی عاطفی پشتیبانی نمی‌شود پشتیبانی می‌شود . مدل، سبک پاسخ خود را برای مطابقت با بیان و لحن ورودی تطبیق می‌دهد. enable_affective_dialog را در پیکربندی جلسه روی true تنظیم کنید (به v1beta نیاز دارد).

برای مهاجرت از Gemini 2.5 Flash Live به Gemini 3.1 Flash Live، به راهنمای مهاجرت مراجعه کنید.

ایجاد ارتباط

مثال زیر نحوه ایجاد اتصال با کلید API را نشان می‌دهد:

پایتون

import asyncio
from google import genai

client = genai.Client()

model = "gemini-3.1-flash-live-preview"
config = {"response_modalities": ["AUDIO"]}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        print("Session started")
        # Send content...

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

جاوا اسکریپت

import { GoogleGenAI, Modality } from '@google/genai';

const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';
const config = { responseModalities: [Modality.AUDIO] };

async function main() {

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

  console.debug("Session started");
  // Send content...

  session.close();
}

main();

روش‌های تعامل

بخش‌های زیر مثال‌ها و زمینه‌های پشتیبانی برای روش‌های مختلف ورودی و خروجی موجود در Live API را ارائه می‌دهند.

ارسال صدا

صدا باید به صورت داده‌های خام PCM (صدای خام PCM شانزده بیتی، ۱۶ کیلوهرتز، little-endian) ارسال شود.

پایتون

# Assuming 'chunk' is your raw PCM audio bytes
await session.send_realtime_input(
    audio=types.Blob(
        data=chunk,
        mime_type="audio/pcm;rate=16000"
    )
)

جاوا اسکریپت

// Assuming 'chunk' is a Buffer of raw PCM audio
session.sendRealtimeInput({
  audio: {
    data: chunk.toString('base64'),
    mimeType: 'audio/pcm;rate=16000'
  }
});

فرمت‌های صوتی

داده‌های صوتی در Live API همیشه خام، little-endian و PCM 16 بیتی هستند. خروجی صدا همیشه از نرخ نمونه‌برداری 24 کیلوهرتز استفاده می‌کند. صدای ورودی به طور طبیعی 16 کیلوهرتز است، اما Live API در صورت نیاز نمونه‌برداری مجدد می‌کند تا هر نرخ نمونه‌برداری بتواند ارسال شود. برای انتقال نرخ نمونه‌برداری صدای ورودی، نوع MIME هر Blob حاوی صدا را روی مقداری مانند audio/pcm;rate=16000 تنظیم کنید.

دریافت صدا

پاسخ‌های صوتی مدل به صورت تکه‌هایی از داده دریافت می‌شوند.

پایتون

async for response in session.receive():
    if response.server_content and response.server_content.model_turn:
        for part in response.server_content.model_turn.parts:
            if part.inline_data:
                audio_data = part.inline_data.data
                # Process or play the audio data

جاوا اسکریپت

// Inside the onmessage callback
const content = response.serverContent;
if (content?.modelTurn?.parts) {
  for (const part of content.modelTurn.parts) {
    if (part.inlineData) {
      const audioData = part.inlineData.data;
      // Process or play audioData (base64 encoded string)
    }
  }
}

ارسال متن

متن را می‌توان با استفاده از send_realtime_input (پایتون) یا sendRealtimeInput (جاوااسکریپت) ارسال کرد.

پایتون

await session.send_realtime_input(text="Hello, how are you?")

جاوا اسکریپت

session.sendRealtimeInput({
  text: 'Hello, how are you?'
});

ارسال ویدیو

فریم‌های ویدیویی به صورت تصاویر مجزا (مثلاً JPEG یا PNG) با نرخ فریم مشخص (حداکثر ۱ فریم در ثانیه) ارسال می‌شوند.

پایتون

# Assuming 'frame' is your JPEG-encoded image bytes
await session.send_realtime_input(
    video=types.Blob(
        data=frame,
        mime_type="image/jpeg"
    )
)

جاوا اسکریپت

// Assuming 'frame' is a Buffer of JPEG-encoded image data
session.sendRealtimeInput({
  video: {
    data: frame.toString('base64'),
    mimeType: 'image/jpeg'
  }
});

به‌روزرسانی‌های تدریجی محتوا

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

پایتون

turns = [
    {"role": "user", "parts": [{"text": "What is the capital of France?"}]},
    {"role": "model", "parts": [{"text": "Paris"}]},
]

await session.send_client_content(turns=turns, turn_complete=False)

turns = [{"role": "user", "parts": [{"text": "What is the capital of Germany?"}]}]

await session.send_client_content(turns=turns, turn_complete=True)

جاوا اسکریپت

let inputTurns = [
  { "role": "user", "parts": [{ "text": "What is the capital of France?" }] },
  { "role": "model", "parts": [{ "text": "Paris" }] },
]

session.sendClientContent({ turns: inputTurns, turnComplete: false })

inputTurns = [{ "role": "user", "parts": [{ "text": "What is the capital of Germany?" }] }]

session.sendClientContent({ turns: inputTurns, turnComplete: true })

برای متن‌های طولانی‌تر، توصیه می‌شود یک خلاصه پیام واحد ارائه دهید تا پنجره متن برای تعاملات بعدی آزاد شود. برای روش دیگری برای بارگیری متن جلسه، به «از سرگیری جلسه» مراجعه کنید.

رونوشت‌های صوتی

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

برای فعال کردن رونویسی خروجی صدای مدل، output_audio_transcription را در پیکربندی تنظیمات ارسال کنید. زبان رونویسی از پاسخ مدل استنباط می‌شود.

پایتون

import asyncio
from google import genai
from google.genai import types

client = genai.Client()
model = "gemini-3.1-flash-live-preview"

config = {
    "response_modalities": ["AUDIO"],
    "output_audio_transcription": {}
}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        message = "Hello? Gemini are you there?"

        await session.send_client_content(
            turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
        )

        async for response in session.receive():
            if response.server_content.model_turn:
                print("Model turn:", response.server_content.model_turn)
            if response.server_content.output_transcription:
                print("Transcript:", response.server_content.output_transcription.text)

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

جاوا اسکریپت

import { GoogleGenAI, Modality } from '@google/genai';

const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';

const config = {
  responseModalities: [Modality.AUDIO],
  outputAudioTranscription: {}
};

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,
  });

  const inputTurns = 'Hello how are you?';
  session.sendClientContent({ turns: inputTurns });

  const turns = await handleTurn();

  for (const turn of turns) {
    if (turn.serverContent && turn.serverContent.outputTranscription) {
      console.debug('Received output transcription: %s\n', turn.serverContent.outputTranscription.text);
    }
  }

  session.close();
}

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

main();

برای فعال کردن رونویسی ورودی صدای مدل، input_audio_transcription را در تنظیمات پیکربندی ارسال کنید.

پایتون

import asyncio
from pathlib import Path
from google import genai
from google.genai import types

client = genai.Client()
model = "gemini-3.1-flash-live-preview"

config = {
    "response_modalities": ["AUDIO"],
    "input_audio_transcription": {},
}

async def main():
    async with client.aio.live.connect(model=model, config=config) as session:
        audio_data = Path("16000.pcm").read_bytes()

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

        async for msg in session.receive():
            if msg.server_content.input_transcription:
                print('Transcript:', msg.server_content.input_transcription.text)

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

جاوا اسکریپت

import { GoogleGenAI, Modality } from '@google/genai';
import * as fs from "node:fs";
import pkg from 'wavefile';
const { WaveFile } = pkg;

const ai = new GoogleGenAI({});
const model = 'gemini-3.1-flash-live-preview';

const config = {
  responseModalities: [Modality.AUDIO],
  inputAudioTranscription: {}
};

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("16000.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();
  for (const turn of turns) {
    if (turn.text) {
      console.debug('Received text: %s\n', turn.text);
    }
    else if (turn.data) {
      console.debug('Received inline data: %s\n', turn.data);
    }
    else if (turn.serverContent && turn.serverContent.inputTranscription) {
      console.debug('Received input transcription: %s\n', turn.serverContent.inputTranscription.text);
    }
  }

  session.close();
}

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

main();

تغییر صدا و زبان

مدل‌های خروجی صدای بومی از هر یک از صداهای موجود برای مدل‌های تبدیل متن به گفتار (TTS) ما پشتیبانی می‌کنند. می‌توانید به همه صداها در AI Studio گوش دهید.

برای مشخص کردن یک صدا، نام صدا را در شیء speechConfig به عنوان بخشی از پیکربندی جلسه تنظیم کنید:

پایتون

config = {
    "response_modalities": ["AUDIO"],
    "speech_config": {
        "voice_config": {"prebuilt_voice_config": {"voice_name": "Kore"}}
    },
}

جاوا اسکریپت

const config = {
  responseModalities: [Modality.AUDIO],
  speechConfig: { voiceConfig: { prebuiltVoiceConfig: { voiceName: "Kore" } } }
};

رابط برنامه‌نویسی زنده (Live API) از چندین زبان پشتیبانی می‌کند. مدل‌های خروجی صدای بومی به‌طور خودکار زبان مناسب را انتخاب می‌کنند و از تنظیم صریح کد زبان پشتیبانی نمی‌کنند.

قابلیت‌های صوتی بومی