L'API Live consente interazioni vocali e video in tempo reale e a bassa latenza con Gemini. Elabora stream continui di audio, video o testo per fornire risposte vocali immediate e simili a quelle umane, creando un'esperienza di conversazione naturale per gli utenti.
L'API Live offre un insieme completo di funzionalità, come il rilevamento dell'attività vocale, l'utilizzo di strumenti e chiamate di funzioni, la gestione delle sessioni (per la gestione di conversazioni di lunga durata) e i token effimeri (per l'autenticazione sicura lato client).
Questa pagina ti consente di iniziare a utilizzare esempi ed esempi di codice di base.
Applicazioni di esempio
Consulta le seguenti applicazioni di esempio che illustrano come utilizzare l'API Live per casi d'uso end-to-end:
- App di avvio per l'audio dal vivo su AI Studio, che utilizza librerie JavaScript per connettersi all'API Live e trasmettere in streaming audio bidirezionale tramite microfono e altoparlanti.
- Cookbook di Python per l'API Live che utilizza Pyaudio per connettersi all'API Live.
Integrazioni con i partner
Se preferisci una procedura di sviluppo più semplice, puoi utilizzare Daily o LiveKit. Si tratta di piattaforme partner di terze parti che hanno già integrato l'API Gemini Live tramite il protocollo WebRTC per semplificare lo sviluppo di applicazioni audio e video in tempo reale.
Prima di iniziare a creare
Prima di iniziare a creare con l'API Live, devi prendere due decisioni importanti: scegliere un modello e un approccio di implementazione.
Scegli un'architettura di generazione audio
Se stai creando un caso d'uso basato sull'audio, la scelta del modello determina l'architettura di generazione audio utilizzata per creare la risposta audio:
- Audio nativo:
questa opzione offre un'esperienza di sintesi vocale estremamente realistica e un migliore rendimento multilingue.
Inoltre, consente funzionalità avanzate come il dialogo emotivo (consapevole delle emozioni), l'audio proattivo (in cui il modello può decidere di ignorarne alcuni o rispondere a determinati input) e il "pensiero".
L'audio nativo è supportato dai seguenti modelli di audio nativo:
gemini-2.5-flash-preview-native-audio-dialog
gemini-2.5-flash-exp-native-audio-thinking-dialog
- Audio a cascata parziale:
questa opzione utilizza un'architettura del modello a cascata (input audio nativo e output di sintesi vocale).
Offre prestazioni e affidabilità migliori negli ambienti di produzione, soprattutto con l'utilizzo degli strumenti. L'audio a cascata parziale è supportato dai seguenti modelli:
gemini-live-2.5-flash-preview
gemini-2.0-flash-live-001
Scegli un approccio di implementazione
Quando esegui l'integrazione con l'API Live, devi scegliere uno dei seguenti approcci di implementazione:
- Server-to-server: il backend si connette all'API Live utilizzando WebSockets. In genere, il client invia i dati dello stream (audio, video, testo) al server, che li inoltra all'API Live.
- Client-to-server: il codice frontend si connette direttamente all'API Live utilizzando WebSockets per trasmettere i dati, bypassando il backend.
Inizia
Questo esempio legge un file WAV, lo invia nel formato corretto e salva i dati ricevuti come file WAV.
Puoi inviare l'audio convertendolo in formato PCM a 16 bit, 16 kHz, mono e puoi ricevere l'audio impostando AUDIO
come modalità di risposta. L'output utilizza una frequenza di campionamento di 24 kHz.
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(api_key="GEMINI_API_KEY")
# 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({ apiKey: "GEMINI_API_KEY" });
// 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();
Passaggi successivi
- Leggi la guida completa sulle funzionalità dell'API Live per scoprire le funzionalità e le configurazioni principali, tra cui il rilevamento dell'attività vocale e le funzionalità audio native.
- Leggi la guida all'utilizzo dello strumento per scoprire come integrare l'API Live con gli strumenti e le chiamate di funzione.
- Leggi la guida alla gestione delle sessioni per gestire le conversazioni lunghe.
- Leggi la guida sui token effimeri per l'autenticazione sicura nelle applicazioni client-to-server.
- Per ulteriori informazioni sull'API WebSockets sottostante, consulta la pagina di riferimento dell'API WebSockets.