Build Real-Time Voice & Video Apps with Gemini Live API
A skill for the Gemini Live API - real-time WebSocket audio/video/text streaming with VAD and function calling.
Why it matters
Enable developers to build low-latency, bidirectional streaming applications with real-time voice, video, and text interactions using the Gemini Live API over WebSockets, including native audio processing, function calling, and session management.
Outcomes
What it gets done
Stream bidirectional audio for real-time mic-to-speaker conversations with automatic voice activity detection and interruption handling
Send camera or screen video frames alongside audio for multimodal real-time interactions
Implement function calling and Google Search grounding within live streaming sessions
Manage secure client-side authentication with ephemeral tokens and handle session resumption with context compression
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/ag-gemini-live-api-dev | bash Overview
Gemini Live API Development Skill
This skill covers the Gemini Live API for real-time WebSocket audio/video/text streaming: current models, exact PCM audio formats, session connection, and the send_realtime_input usage rules. Use it when building real-time voice or video interactions with Gemini over WebSockets. Not for simple request/response text generation.
What it does
A skill for building real-time, bidirectional streaming applications with the Gemini Live API - WebSocket-based audio, video, and text streaming, voice activity detection, native audio, function calling, session management, and ephemeral client-side tokens. Key capabilities: bidirectional mic-to-speaker audio streaming, video streaming (camera/screen frames alongside audio), text input/output within a live session, audio transcriptions of both input and output, voice activity detection with automatic interruption handling, native audio "thinking" via a configurable thinkingLevel, synchronous function calling, Google Search grounding, and session management (context compression, session resumption, GoAway signals). The Live API currently only supports WebSockets - WebRTC or simplified integration requires a partner (LiveKit, Pipecat, Fishjam, Vision Agents, Voximplant, or Firebase AI Logic). The recommended model is gemini-3.1-flash-live-preview (low-latency, native audio output, thinking support, 128k context); gemini-3.5-live-translate-preview handles real-time streaming translation; three older Live models (gemini-2.5-flash-native-audio-preview-12-2025, gemini-live-2.5-flash-preview, gemini-2.0-flash-live-001) are deprecated with a December 9, 2025 shutdown. SDKs are google-genai (Python) and @google/genai (JS/TS); the legacy google-generativeai/@google/generative-ai packages are deprecated. Audio format is fixed: input is raw PCM, little-endian, 16-bit, mono, 16kHz native (other rates get resampled, MIME audio/pcm;rate=16000); output is the same format at 24kHz. A critical usage rule: send_realtime_input/sendRealtimeInput handles all real-time user input (audio, video, and text) during a live conversation, while send_client_content/sendClientContent is only for seeding initial context history and must never be used to send new user messages mid-conversation; within sendRealtimeInput, the generic "media" key is disallowed in favor of specific "audio", "video", and "text" keys. The quick-start flow authenticates a client, opens a live.connect() session with a model and LiveConnectConfig (response modalities, system instruction), then sends text/audio/video via send_realtime_input and receives responses via an async iteration over session.receive() - a single server event can contain multiple content parts simultaneously (e.g. audio plus transcript), so every part in each event must be processed to avoid dropping content.
When to use - and when NOT to
Use it when building real-time voice or video interactions with Gemini over WebSockets - live conversational audio, video streaming, or real-time translation. Not for simple request/response text generation, which the standard Interactions API handles instead.
Inputs and outputs
Input is a live-connect config (model, response modalities, system instruction) plus a continuous stream of audio/video/text sent via send_realtime_input. Output is a stream of server events received via session.receive(), each potentially containing multiple simultaneous content parts (audio chunks, transcripts, function calls) that must all be processed.
Integrations
pip install google-genai
npm install @google/genai
WebSocket-only natively; WebRTC or simplified integration is available through partner platforms (LiveKit, Pipecat, Fishjam, Vision Agents, Voximplant, Firebase AI Logic).
Who it's for
Developers building real-time voice/video AI applications - live conversational assistants, streaming translation, or interruptible spoken interfaces - who need the correct current model, exact PCM audio format, and the send_realtime_input vs send_client_content distinction that's easy to get wrong.
Source README
Gemini Live API Development Skill
When to Use
Use this skill when building real-time, bidirectional streaming applications with the Gemini Live API. Covers WebSocket-based audio/video/text streaming, voice activity detection (VAD), native audio features, function calling, session management, ephemeral tokens for client-side auth,...
Overview
The Live API enables low-latency, real-time voice and video interactions with Gemini over WebSockets. It processes continuous streams of audio, video, or text to deliver immediate, human-like spoken responses.
Key capabilities:
- Bidirectional audio streaming - real-time mic-to-speaker conversations
- Video streaming - send camera/screen frames alongside audio
- Text input/output - send and receive text within a live session
- Audio transcriptions - get text transcripts of both input and output audio
- Voice Activity Detection (VAD) - automatic interruption handling
- Native audio - thinking (with configurable
thinkingLevel) - Function calling - synchronous tool use
- Google Search grounding - ground responses in real-time search results
- Session management - context compression, session resumption, GoAway signals
- Ephemeral tokens - secure client-side authentication
Models
gemini-3.1-flash-live-preview- Optimized for low-latency, real-time dialogue. Native audio output, thinking (viathinkingLevel). 128k context window. This is the recommended model for all Live API use cases.gemini-3.5-live-translate-preview- Real-time streaming translation model.
SDKs
- Python:
google-genai-pip install google-genai - JavaScript/TypeScript:
@google/genai-npm install @google/genai
Partner Integrations
To streamline real-time audio/video app development, use a third-party integration supporting the Gemini Live API over WebRTC or WebSockets:
- LiveKit - Use the Gemini Live API with LiveKit Agents.
- Pipecat by Daily - Create a real-time AI chatbot using Gemini Live and Pipecat.
- Fishjam by Software Mansion - Create live video and audio streaming applications with Fishjam.
- Vision Agents by Stream - Build real-time voice and video AI applications with Vision Agents.
- Voximplant - Connect inbound and outbound calls to Live API with Voximplant.
- Firebase AI SDK - Get started with the Gemini Live API using Firebase AI Logic.
Audio Formats
- Input: Raw PCM, little-endian, 16-bit, mono. 16kHz native (will resample others). MIME type:
audio/pcm;rate=16000 - Output: Raw PCM, little-endian, 16-bit, mono. 24kHz sample rate.
Quick Start
Authentication
Python
import os
from google import genai
client = genai.Client(api_key=os.environ["GEMINI_API_KEY"])
JavaScript
import { GoogleGenAI } from '@google/genai';
const ai = new GoogleGenAI({ apiKey: 'YOUR_API_KEY' });
Connecting to the Live API
Python
from google.genai import types
config = types.LiveConnectConfig(
response_modalities=[types.Modality.AUDIO],
system_instruction=types.Content(
parts=[types.Part(text="You are a helpful assistant.")]
)
)
async with client.aio.live.connect(model="gemini-3.1-flash-live-preview", config=config) as session:
pass # Session is active
JavaScript
const session = await ai.live.connect({
model: 'gemini-3.1-flash-live-preview',
config: {
responseModalities: ['audio'],
systemInstruction: { parts: [{ text: 'You are a helpful assistant.' }] }
},
callbacks: {
onopen: () => console.log('Connected'),
onmessage: (response) => console.log('Message:', response),
onerror: (error) => console.error('Error:', error),
onclose: () => console.log('Closed')
}
});
Sending Text
Python
await session.send_realtime_input(text="Hello, how are you?")
JavaScript
session.sendRealtimeInput({ text: 'Hello, how are you?' });
Sending Audio
Python
await session.send_realtime_input(
audio=types.Blob(data=chunk, mime_type="audio/pcm;rate=16000")
)
JavaScript
session.sendRealtimeInput({
audio: { data: chunk.toString('base64'), mimeType: 'audio/pcm;rate=16000' }
});
Sending Video
Python
### frame: raw JPEG-encoded bytes
await session.send_realtime_input(
video=types.Blob(data=frame, mime_type="image/jpeg")
)
JavaScript
session.sendRealtimeInput({
video: { data: frame.toString('base64'), mimeType: 'image/jpeg' }
});
Receiving Audio and Text
Python
async for response in session.receive():
content = response.server_content
if content:
# Audio โ process ALL parts in each event
if content.model_turn:
for part in content.model_turn.parts:
if part.inline_data:
audio_data = part.inline_data.data
# Transcription
if content.input_transcription:
print(f"User: {content.input_transcription.text}")
if content.output_transcription:
print(f"Gemini: {content.output_transcription.text}")
# Interruption
if content.interrupted is True:
pass # Stop playback, clear audio queue
JavaScript
// 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; // Base64 encoded
}
}
}
if (content?.inputTranscription) console.log('User:', content.inputTranscription.text);
if (content?.outputTranscription) console.log('Gemini:', content.outputTranscription.text);
if (content?.interrupted) { /* Stop playback, clear audio queue */ }
Live Translation (Gemini Live Translate)
The Live API supports real-time, low-latency streaming translation of speech (audio) across 70+ languages. For full details on options and capabilities, see the Live Translate Guide.
Model
gemini-3.5-live-translate-preview- The recommended translation model for all Live Translate use cases.
Configuration (TranslationConfig)
To enable translation, specify a TranslationConfig object inside your live session setup:
- Python SDK: Configure the connection using
translation_configonLiveConnectConfig:config = types.LiveConnectConfig( response_modalities=[types.Modality.AUDIO], translation_config=types.TranslationConfig( target_language_code="es", # Target language code (e.g. es, fr, pl) echo_target_language=True, ), input_audio_transcription=types.AudioTranscriptionConfig(), output_audio_transcription=types.AudioTranscriptionConfig(), ) - Raw WebSockets: Place
translationConfiginsidegenerationConfig:{ "setup": { "model": "models/gemini-3.5-live-translate-preview", "generationConfig": { "responseModalities": ["AUDIO"], "translationConfig": { "targetLanguageCode": "es", "echoTargetLanguage": true } } } }
Limitations
- Response modality - Only
TEXTorAUDIOper session, not both. Native audio models only support audio. - Audio-only session - 15 min without compression
- Audio+video session - 2 min without compression
- Connection lifetime - ~10 min (use session resumption)
- Context window - 128k tokens (native audio) / 32k tokens (standard)
- Async function calling - Not yet supported; function calling is synchronous only. The model will not start responding until you've sent the tool response.
- Proactive audio - Not yet supported in Gemini 3.1 Flash Live. Remove any configuration for this feature.
- Affective dialogue - Not yet supported in Gemini 3.1 Flash Live. Remove any configuration for this feature.
- Code execution - Not supported
- URL context - Not supported
Migrating from Gemini 2.5 Flash Live
When migrating from gemini-2.5-flash-native-audio-preview-12-2025 to gemini-3.1-flash-live-preview:
- Model string - Update from
gemini-2.5-flash-native-audio-preview-12-2025togemini-3.1-flash-live-preview. - Thinking configuration - Use
thinkingLevel(minimal,low,medium,high) instead ofthinkingBudget. Default isminimalfor lowest latency. - Server events - A single event can contain multiple content parts simultaneously (audio + transcript). Process all parts in each event.
- Client content -
send_client_contentis only for seeding initial context history (setinitial_history_in_client_contentinhistory_config). Usesend_realtime_inputfor text during conversation. - Turn coverage - Defaults to
TURN_INCLUDES_AUDIO_ACTIVITY_AND_ALL_VIDEOinstead ofTURN_INCLUDES_ONLY_ACTIVITY. If sending constant video frames, consider sending only during audio activity to reduce costs. - Async function calling - Not yet supported. Function calling is synchronous only.
- Proactive audio & affective dialogue - Not yet supported. Remove any configuration for these features.
Best Practices
- Use headphones when testing mic audio to prevent echo/self-interruption
- Enable context window compression for sessions longer than 15 minutes
- Implement session resumption to handle connection resets gracefully
- Use ephemeral tokens for client-side deployments - never expose API keys in browsers
- Use
send_realtime_inputfor all real-time user input (audio, video, text). Reservesend_client_contentonly for seeding initial context history - Send
audioStreamEndwhen the mic is paused to flush cached audio - Clear audio playback queues on interruption signals
- Process all parts in each server event - events can contain multiple content parts
Documentation Lookup
When MCP is Installed (Preferred)
If the search_docs tool (from the Google MCP server) is available, use it as your only documentation source:
- Call
search_docswith your query - Read the returned documentation
- Trust MCP results as source of truth for API details - they are always up-to-date.
When MCP is NOT Installed (Fallback Only)
If no MCP documentation tools are available, fetch from the official docs index:
llms.txt URL: https://ai.google.dev/gemini-api/docs/llms.txt
This index contains links to all documentation pages in .md.txt format. Use web fetch tools to:
- Fetch
llms.txtto discover available documentation pages - Fetch specific pages (e.g.,
https://ai.google.dev/gemini-api/docs/live-session.md.txt)
Key Documentation Pages
- Live API Overview - getting started, raw WebSocket usage
- Live Translate - configuration options and capabilities for translation
- Live API Capabilities Guide - voice config, transcription config, native audio (thinking), VAD configuration, media resolution
- Live API Tool Use - function calling (sync and async), Google Search grounding
- Session Management - context window compression, session resumption, GoAway signals
- Ephemeral Tokens - secure client-side authentication for browser/mobile
- WebSockets API Reference - raw WebSocket protocol details
Supported Languages
The Live API supports 70 languages including: English, Spanish, French, German, Italian, Portuguese, Chinese, Japanese, Korean, Hindi, Arabic, Russian, and many more. Native audio models automatically detect and switch languages.
FAQ
Common questions
Discussion
Questions & comments ยท 0
Sign In Sign in to leave a comment.