تتيح Live API التفاعلات الصوتية والمرئية في الوقت الفعلي وبزمن انتقال منخفض مع Gemini. تعالج هذه النماذج تدفقات مستمرة من الصوت أو الفيديو أو النص لتقديم ردود فورية منطوقة تشبه ردود البشر، ما يتيح للمستخدمين تجربة محادثة طبيعية.
تقدّم Live API مجموعة شاملة من الميزات، مثل رصد النشاط الصوتي واستخدام الأدوات واستدعاء الدوال وإدارة الجلسات (لإدارة المحادثات الطويلة) والرموز المميزة المؤقتة (للمصادقة الآمنة من جهة العميل).
تساعدك هذه الصفحة في البدء باستخدام أمثلة ونماذج أساسية من الرموز البرمجية.
أمثلة على التطبيقات
اطّلِع على نماذج التطبيقات التالية التي توضّح كيفية استخدام Live API لحالات الاستخدام الشاملة:
- تطبيق Live Audio Starter على AI Studio، باستخدام مكتبات JavaScript للاتصال بواجهة Live API وبث الصوت ثنائي الاتجاه من خلال الميكروفون ومكبرات الصوت
- كتاب طبخ Python لواجهة Live API باستخدام Pyaudio الذي يتصل بواجهة Live API.
عمليات الدمج مع الشركاء
إذا كنت تفضّل عملية تطوير أبسط، يمكنك استخدام Daily أو LiveKit أو Voximplant. هذه المنصات تابعة لشركاء خارجيين وقد سبق لها دمج واجهة برمجة التطبيقات Gemini Live API عبر بروتوكول WebRTC لتسهيل تطوير تطبيقات الصوت والفيديو في الوقت الفعلي.
قبل البدء في إنشاء
هناك قراران مهمّان يجب اتّخاذهما قبل البدء في إنشاء تطبيق باستخدام Live API، وهما اختيار نموذج واختيار طريقة التنفيذ.
اختيار بنية إنشاء الصوت
إذا كنت بصدد إنشاء حالة استخدام مستندة إلى الصوت، سيحدّد اختيارك للنموذج بنية إنشاء الصوت المستخدَمة لإنشاء الرد الصوتي:
- الصوت الأصلي:
يوفّر هذا الخيار صوتًا طبيعيًا وواقعيًا أكثر،
ويحسّن الأداء عند استخدام لغات متعددة.
يتيح هذا النموذج أيضًا ميزات متقدّمة، مثل الحوار العاطفي (الذي يراعي المشاعر) والصوت الاستباقي (حيث يمكن للنموذج أن يقرّر تجاهل بعض المدخلات أو الردّ عليها) و"التفكير".
تتوفّر "الإعلانات الصوتية المدمجة مع المحتوى" في نماذج الإعلانات الصوتية المدمجة مع المحتوى التالية:
gemini-2.5-flash-preview-native-audio-dialog
gemini-2.5-flash-exp-native-audio-thinking-dialog
- الصوت شبه المتتالي:
يستخدم هذا الخيار بنية نموذج متتالي (إدخال الصوت الأصلي وإخراج تحويل النص إلى كلام).
ويوفّر أداءً وموثوقية أفضل في بيئات الإنتاج، خاصةً عند استخدام الأدوات. تتوافق الطُرز التالية مع ميزة الصوت نصف المتتالي:
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 كيلوهرتز وبدقة 16 بت، ويمكنك تلقّي الصوت من خلال ضبط AUDIO
كطريقة الرد. تستخدم النتيجة معدّل عيّنات يبلغ 24 كيلو هرتز.
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 الأساسية، يُرجى الاطّلاع على مرجع واجهة برمجة تطبيقات WebSockets.