Live API מאפשר אינטראקציות בזמן אמת עם Gemini באמצעות קול ווידאו עם זמן אחזור נמוך. המערכת מעבדת שידורים רציפים של אודיו, וידאו או טקסט כדי לספק תשובות מידיות בעלות אופי אנושי, וכך יוצרת חוויית שיחה טבעית למשתמשים.
ממשק Live API מציע קבוצה מקיפה של תכונות, כמו זיהוי פעילות קול, שימוש בכלים והפעלת פונקציות, ניהול סשנים (לניהול שיחות ממושכות) ואסימונים זמניים (לאימות מאובטח בצד הלקוח).
בדף הזה תלמדו איך להתחיל לעבוד עם דוגמאות ודוגמאות קוד בסיסיות.
דוגמאות לאפליקציות
כדאי לעיין בדוגמאות הבאות לאפליקציות שממחישות איך משתמשים ב-Live API בתרחישים לדוגמה מקצה לקצה:
- אפליקציית התחלה לשימוש באודיו בשידור חי ב-AI Studio, שמשתמשת בספריות JavaScript כדי להתחבר ל-Live API ולהעביר אודיו דו-כיווני דרך המיקרופון והרמקולים.
- ספר בישול ב-Python ל-Live API באמצעות Pyaudio שמתחבר ל-Live API.
שילובים עם שותפים
אם אתם מעדיפים תהליך פיתוח פשוט יותר, תוכלו להשתמש ב-Daily או ב-LiveKit. אלה פלטפורמות שותפות של צד שלישי שכבר שילבו את Gemini Live API באמצעות פרוטוקול WebRTC כדי לייעל את הפיתוח של אפליקציות אודיו ווידאו בזמן אמת.
לפני שמתחילים לבנות
לפני שמתחילים לפתח באמצעות Live API, צריך לקבל שתי החלטות חשובות: בחירת מודל ובחירת גישה להטמעה.
בחירת ארכיטקטורה ליצירת אודיו
אם אתם מפתחים תרחיש לדוגמה שמבוסס על אודיו, בחירת המודל קובעת את הארכיטקטורה ליצירת אודיו שתשמש ליצירת התשובה האודיו:
- אודיו מקורי: אפשרות זו מספקת את הדיבור הטבעי והריאליסטי ביותר, וביצועים טובים יותר בכמה שפות.
הוא גם מאפשר תכונות מתקדמות כמו דיאלוג רגשי (שמודע לרגשות), אודיו יזום (שבו המודל יכול להחליט להתעלם ממידע מסוים או להגיב לו) ו'חשיבה'.
המודלים הבאים של אודיו מותאם תומכים באודיו מותאם:
gemini-2.5-flash-preview-native-audio-dialog
gemini-2.5-flash-exp-native-audio-thinking-dialog
- אודיו ב-Half-cascade: באפשרות הזו נעשה שימוש בארכיטקטורת מודל מדורגת (קלט אודיו מקורי ופלט של המרת טקסט לדיבור).
היא מספקת ביצועים ואמינות טובים יותר בסביבות ייצור, במיוחד בשימוש בכלים. האודיו עם קטעי אודיו חופפים בחלקו נתמך במודלים הבאים:
gemini-live-2.5-flash-preview
gemini-2.0-flash-live-001
בחירת גישה להטמעה
כשמשלבים עם Live API, צריך לבחור באחת משיטות ההטמעה הבאות:
- שרת לשרת: הקצה העורפי מתחבר ל-Live API באמצעות WebSockets. בדרך כלל, הלקוח שולח נתוני סטרימינג (אודיו, וידאו וטקסט) לשרת, והשרת מעביר אותם ל-Live API.
- מלקוח לשרת: קוד הקצה הקדמי מתחבר ישירות ל-Live API באמצעות WebSockets כדי להעביר נתונים בסטרימינג, ועוקף את הקצה העורפי.
שנתחיל?
בדוגמה הזו קוראים קובץ WAV, שולחים אותו בפורמט הנכון ושומרים את הנתונים שהתקבלו כקובץ WAV.
כדי לשלוח אודיו, צריך להמיר אותו לפורמט PCM 16 ביט, 16kHz, מונו. כדי לקבל אודיו, צריך להגדיר את AUDIO
כמודל התגובה. תדירות הדגימה של הפלט היא 24kHz.
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();
המאמרים הבאים
- כדאי לקרוא את המדריך המלא בנושא יכולות של Live API כדי לקבל מידע על יכולות והגדרות מרכזיות, כולל זיהוי פעילות קול ותכונות אודיו מקוריות.
- במדריך שימוש בכלים מוסבר איך לשלב את Live API עם כלים וקריאות לפונקציות.
- במדריך ניהול סשנים מוסבר איך לנהל שיחות ארוכות.
- במדריך על אסימונים זמניים מוסבר איך לבצע אימות מאובטח באפליקציות מלקוח לשרת.
- מידע נוסף על WebSockets API הבסיסי זמין בחומר העזרה של WebSockets API.