Google's Gemini 3, released November 18, 2025, gives developers multimodal reasoning and tool-use for building AI applications. Let's combine it with Decart and other AI services to turn casual voice commands into artistic live video styles.
You can also watch this step-by-step YouTube tutorial to create the demo in under 9 minutes.
Realtime Video-Styling Assistant: Overview
In just a few minutes, let's create a real-time video restyling assistant in Vision Agents that transforms your camera feed into artistic styles via voice prompts.
- It is powered by Gemini 3 Pro (via Google API) for prompt understanding and agentic control.
- Video processing: Decart AI (Mirage LSD for zero-latency restyling).
- Speech-to-Text Component: DeepGram.
- Text-to-Speech Component: ElevenLabs.
Grab These API Credentials
- Stream (WebRTC-based video communication).
- Google (for Gemini 3 access).
- Decart AI (video restyling API).
- ElevenLabs (TTS).
- DeepGram (STT)
Build the Realtime Video-Styler in Python
Start with a new uv-based project, activate the Python environment, and install all dependencies.
12345678910111213# Initialize a Python project uv init realtime-video-restyling cd realtime-video-restyling # Activate your environment uv venv && source .venv/bin/activate # Install Vision Agents and required plugins uv add vision-agents uv add "vision-agents[getstream, gemini, elevenlabs, deepgram]" # Install Decart AI with uv and pip uv pip install vision-agents-plugins-decart
In the root of your generated uv project, substitute the content of main.py with the following sample code listing.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354import logging from dotenv import load_dotenv from vision_agents.core import User, Agent, cli from vision_agents.core.agents import AgentLauncher from vision_agents.plugins import decart, getstream, gemini, elevenlabs, deepgram logger = logging.getLogger(__name__) load_dotenv() async def create_agent(**kwargs) -> Agent: processor = decart.RestylingProcessor( initial_prompt="Change the video style to a cute animated movie with vibrant colours", model="mirage_v2" ) llm = gemini.LLM(model="gemini-3-pro-preview") agent = Agent( edge=getstream.Edge(), agent_user=User(name="Story teller", id="agent"), instructions="You will use the Decart processor to change the style of the video and the user's background. ", llm=llm, tts=elevenlabs.TTS(voice_id="N2lVS1w4EtoT3dr4eOWO"), stt=deepgram.STT(), processors=[processor], ) @llm.register_function( description="This function changes the prompt of the Decart processor which in turn changes the style of the video and user's background" ) async def change_prompt(prompt: str) -> str: await processor.update_prompt(prompt) return f"Prompt changed to {prompt}" return agent async def join_call(agent: Agent, call_type: str, call_id: str, **kwargs) -> None: """Join the call and start the agent.""" # Ensure the agent user is created await agent.create_user() # Create a call call = await agent.create_call(call_type, call_id) logger.info("🤖 Starting Agent...") # Have the agent join the call/room with await agent.join(call): logger.info("Joining call") logger.info("LLM ready") await agent.finish() # Run till the call ends if __name__ == "__main__": cli(AgentLauncher(create_agent=create_agent, join_call=join_call))
The script will display a Stream Video call interface that automatically joins you. You can now go ahead and allow camera/mic access, and say something like, "Make my video Studio Ghibli" and watch your camera feed transforms.
