<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Dr. Wafae Bakkali on Medium]]></title>
        <description><![CDATA[Stories by Dr. Wafae Bakkali on Medium]]></description>
        <link>https://medium.com/@wafaebakkali?source=rss-63974cf5734d------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*eMhX7LqAwjQw9T4IT05arQ.jpeg</url>
            <title>Stories by Dr. Wafae Bakkali on Medium</title>
            <link>https://medium.com/@wafaebakkali?source=rss-63974cf5734d------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 06:49:42 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@wafaebakkali/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Building generative media agents: model, harness, tools]]></title>
            <link>https://medium.com/google-cloud/building-generative-media-agents-model-harness-tools-b405dad35aee?source=rss-63974cf5734d------2</link>
            <guid isPermaLink="false">https://medium.com/p/b405dad35aee</guid>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[agents]]></category>
            <category><![CDATA[multimodal]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <dc:creator><![CDATA[Dr. Wafae Bakkali]]></dc:creator>
            <pubDate>Tue, 22 Sep 2026 06:55:58 GMT</pubDate>
            <atom:updated>2026-09-22T10:45:02.511Z</atom:updated>
            <content:encoded><![CDATA[<p><em>A practical guide to building generative media agents, the ones that produce images, video and audio: what is different compared to text agents, and how to build them on Google Cloud.</em></p><h3>Introduction</h3><p>Much of the focus in AI engineering over the past few years went into turning models from question-answerers into agents that can do more than talk: planning steps, using tools, remembering context, or working through long, complex tasks in the background. However, the agent stack is still mainly focused on text. Even as foundation models become increasingly multimodal, the field still treats a multimodal agent as a text agent with extra modalities.</p><p>As models improve at processing and generating rich multimodal content, they are naturally being pulled into visual and creative work. With that, the demand shifts toward end-to-end deliverables. Users do not want to manually prompt every individual asset, but because creative work is subjective, they rarely want hands-off, black-box automation either. They want systems that take a high-level goal, handle multi-step execution, and keep humans in the loop for review and creative steering.</p><p>This is the promise of Generative Media Agents (GenMedia agents): systems designed to orchestrate and iterate on generative media from an objective to a finished deliverable, working alongside human creators.</p><p>Building them, however, requires rethinking key assumptions about agent design. Working with media fundamentally changes how an agent tracks state, executes edits, and judges whether an output is actually good enough. This post covers what a GenMedia agent is made of, when to use one, how it differs from a text agent, and how to build one on Google Cloud, along with reference implementations.</p><h3>Anatomy of a GenMedia agent</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CLggyE6FdFDaikyB8bpblw.png" /><figcaption>Figure 1. An example of a GenMedia agent architecture</figcaption></figure><p>Not every media task needs an agent. Generating image variants from a fixed template or running batch voiceovers across a catalog is just a pipeline: predictable, batchable, and simple to test.</p><p>You need an agent when the creative path cannot be scripted in advance. These are open-ended workflows where an objective spans multiple models, user feedback directs each step, and generation must be combined with downstream tools and business data.</p><p>At that level of complexity, a typical GenMedia agent architecture breaks down into four core layers as shown in Figure 1.</p><ul><li><strong>The interface:</strong> where users review outputs and steer the process, across modalities like voice, text, camera or screen.</li><li><strong>The harness:</strong> the runtime environment (such as <a href="https://adk.dev/get-started/">Agent Development Kit</a> (ADK)) that runs the main agentic loop: it manages sessions, tracks state, runs the tools (functions you write, Model Context Protocol (MCP) servers, skills, other agents) and delivers the results.</li><li><strong>The model: </strong>the cognitive layer (like Gemini) that interprets creative direction, decides when to call a tool and writes its prompt.</li><li><strong>External systems:</strong> what the tools call, including the generative media models, search grounding, object storage and enterprise business services.</li></ul><h3>Levels of abstraction</h3><p>Knowing the components is one thing; deciding how much of that harness to write yourself is the practical choice.</p><p>Teams implement GenMedia agents across three levels of abstraction, depending on how much control they need over the runtime.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8Vwdq1GP--96ZfaEmiQ8Mg.png" /><figcaption>Figure 2. Levels of abstraction for building GenMedia agents</figcaption></figure><p><strong>Level 1: Model-orchestrated tools (code-first):</strong> You build the runtime loop and interface yourself, using the model for reasoning and function calling to trigger media tools.</p><ul><li><strong>When to use:</strong> Low-latency interactive experiences (like voice-driven audio/visual co-creation) and lightweight single-purpose apps where you need direct control over UI delivery.</li><li><strong>Typical users:</strong> Creative technologists and frontend/full-stack engineers.</li></ul><p><strong>Level 2: Agent frameworks (managed harness):</strong> You build on a standardized harness, for instance using ADK. The framework handles session lifecycles, long-running video tasks, MCP integrations and multi-agent patterns. In ADK terms, that is an LlmAgentwith a generation tool wrapped as a LongRunningFunctionTool, the GenMedia MCP servers attached through an McpToolset, and a SkillToolsetthat loads prompting guides on demand.</p><pre>root_agent = LlmAgent(<br>    model=&quot;gemini-...&quot;,<br>    tools=[<br>        LongRunningFunctionTool(generate_video),<br>        McpToolset(connection_params=genmedia_mcp),<br>        SkillToolset(skills=[load_skill_from_dir(&quot;skills/omni-prompting&quot;)]),<br>    ],<br>)</pre><ul><li><strong>When to use:</strong> Production creative pipelines requiring persistent state, asynchronous background generation, multi-agent orchestration, and enterprise scale.</li><li><strong>Typical users:</strong> Backend AI engineers and production platform teams.</li></ul><p><strong>Level 3: Visual and no-code builders:</strong> You assemble workflows visually on a canvas like Agent Studio, Google Flow, or ComfyUI, relying on the platform to manage execution and routing.</p><ul><li><strong>When to use:</strong> Creative exploration, rapid concept validation, and node-based media experimentation.</li><li><strong>Typical users:</strong> Creative directors, technical artists, and product teams prototyping flows without writing code.</li></ul><p>To see how the three abstraction levels in Figure 2 map to actual implementation effort, the matrix below highlights what you build yourself versus what the framework or platform provides. At level 1 you own everything except the models. At level 2 the framework owns sessions, tool execution and MCP, and you own the media plane, the asset registry and the interface. At level 3 the platform owns the harness and interface, and you own prompts and tool configuration.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6Mj_MvpvW03uSeBWhNrixQ.png" /><figcaption>Figure 3. Mapping architectural layers to implementation levels</figcaption></figure><h3>Six operational constraints of generative media agents</h3><p>At a high level, the architectural layers resemble those of a conventional text agent. What changes is what flows through them: media generation introduces six operational constraints that shape harness design, model reasoning, and external integrations:</p><ol><li><strong>Latency:</strong> Generating an image takes seconds, while rendering video takes tens of seconds to minutes. The harness must support asynchronous, long-running tool execution (such as ADK’s <a href="https://adk.dev/tools-custom/function-tools/#long-run-tool">LongRunningFunctionTool</a>) so conversational streaming over the <a href="https://ai.google.dev/gemini-api/docs/live?utm_source=gemini">Gemini Live API</a> continues uninterrupted while generation jobs run in the background.</li><li><strong>Output size:</strong> Results are heavy binary payloads (megabytes of raw image arrays or MP4 streams). The harness routes binary data directly to object stores like <a href="https://cloud.google.com/storage?utm_source=gemini">Google Cloud Storage</a> and straight to the client interface, passing only lightweight URIs and metadata back to the model context.</li><li><strong>State and lineage:</strong> Creative workflows are iterative. Users continually reference earlier iterations (<em>“make the second shot darker,”</em> <em>“extend that clip”</em>), requiring the harness session service or external asset registries to track asset lineage, prompt history, and parent-child dependencies across turns.</li><li><strong>Prompt engineering:</strong> Raw user requests like <em>“a car driving at night”</em> require expansion into technical visual language covering camera movement, focal length, lighting, and composition. Generative models expect cinematic shot grammar, so this prompting expertise must live in the agent’s instructions or dynamically retrieved skill documents.</li><li><strong>Cost and execution limits:</strong> Media calls carry higher per-invocation costs than simple token completions. The harness requires strict concurrency caps, retry limits, and confirmation checkpoints before triggering expensive multi-model tasks.</li><li><strong>Safety, provenance, and regional compliance: </strong>Media endpoints enforce prompt safety filters and regional availability constraints, and apply provenance signals such as <a href="https://deepmind.google/models/synthid/?utm_source=gemini">SynthID </a>watermarking from Google DeepMind and, where supported, <a href="https://c2pa.org/?utm_source=gemini">C2PA Content Credentials</a>.</li></ol><h3>Design patterns for GenMedia agents</h3><p>Across all three implementation levels, the following design patterns help solve these six constraints in production:</p><h4>1. Separate your media plane from the control plane</h4><p>Passing raw binary buffers (megabytes of image arrays or video streams) through an LLM’s context window exhausts token limits and increases latency.</p><p>Treat your agent strictly as the control plane. It only needs to see lightweight references: asset IDs, media types, and cloud storage URIs. Leave the heavy lifting to your media plane (object storage and edge delivery), which routes the actual bytes between generation endpoints and your UI. Here is what that looks like in a typed tool return:</p><pre>from typing import Literal, Optional<br>from pydantic import BaseModel<br><br>class MediaReference(BaseModel):<br>    &quot;&quot;&quot;Registered in the media plane once the worker finishes rendering.&quot;&quot;&quot;<br>    asset_id: str<br>    storage_uri: str  # Direct Cloud Storage URI; raw bytes bypass the agent<br>    media_type: Literal[&quot;image/png&quot;, &quot;video/mp4&quot;]<br><br>def get_asset(asset_id: str) -&gt; MediaReference:<br>    &quot;&quot;&quot;The agent sees a URI and metadata, never the bytes.&quot;&quot;&quot;<br>    return asset_registry.lookup(asset_id)</pre><h4>2. Decouple generation jobs from the chat loop</h4><p>Video and high-resolution image generation can take anywhere from 30 seconds to a couple of minutes. If you wait synchronously, your whole conversational loop freezes, network timeouts kick in, and the user is left staring at a dead screen.</p><p>Instead, decouple the generation job from the conversational turn:</p><ul><li>Return an immediate acknowledgement (like &quot;status&quot;: &quot;in_progress&quot;) so your agent can confirm receipt and keep talking.</li><li>Push the actual rendering task to a background worker queue.</li><li>Once the render completes, push the asset straight to the UI out-of-band and drop a lightweight completion notice back into the session history.</li></ul><pre>def generate_video(<br>    prompt: str,<br>    duration_seconds: int = 8,<br>    aspect_ratio: Literal[&quot;16:9&quot;, &quot;9:16&quot;] = &quot;16:9&quot;,<br>    reference_asset_id: Optional[str] = None,<br>) -&gt; dict:<br>    &quot;&quot;&quot;Queues a render and returns a receipt so the conversation keeps going.&quot;&quot;&quot;<br>    job_id = task_queue.enqueue(<br>        &quot;render_worker&quot;,<br>        prompt=prompt,<br>        duration=duration_seconds,<br>        ratio=aspect_ratio,<br>        parent_id=reference_asset_id,<br>    )<br>    return {&quot;job_id&quot;: job_id, &quot;status&quot;: &quot;in_progress&quot;, &quot;estimated_seconds&quot;: 90}<br><br><br>def render_worker(job_id: str, session_id: str, **params) -&gt; None:<br>    &quot;&quot;&quot;Runs off the chat loop. Renders, registers, delivers, then notifies.&quot;&quot;&quot;<br>    video_bytes = video_model.generate(**params)<br>    storage_uri = media_store.put(video_bytes, content_type=&quot;video/mp4&quot;)<br>    asset = asset_registry.register(<br>        storage_uri=storage_uri,<br>        media_type=&quot;video/mp4&quot;,<br>        parent_id=params.get(&quot;parent_id&quot;),<br>        prompt=params[&quot;prompt&quot;],<br>    )<br>    ui.push(session_id, asset)<br>    session_service.append_event(<br>        session_id,<br>        {&quot;job_id&quot;: job_id, &quot;status&quot;: &quot;done&quot;, &quot;asset_id&quot;: asset.asset_id},<br>    )</pre><h4>3. Track state and lineage in your harness</h4><p>Creative work is rarely linear; it is an iterative, branching tree. When someone says, <em>“Go back to the second version, but make the background sunset,”</em> your agent needs to know exactly which asset they mean and what parameters created it.</p><p>Do not rely on raw chat memory for this. Keep a stateful asset registry inside your harness that maps child assets back to their parent IDs, original prompts, seeds, and generation parameters. This is what lets you build non-destructive rollbacks, branch comparisons, and reliable audit logs.</p><h4>4. Compile and refine prompts in the agent</h4><p>Most users will not talk like film directors or seasoned prompt engineers. They will say things like <em>“make a cool car clip.”</em> But generative media models need precise, technical language to produce stable results.</p><p>Your orchestrating agent should act as a prompt compiler. Teach it visual and cinematic grammar in its instructions so it can translate casual requests into structured parameters before hitting your APIs. For example:</p><ul><li><strong>For video:</strong> Specify camera movement (dolly, crane, tracking), focal depth, lighting style, and explicit anchors like <em>“single continuous shot”</em> so the video model does not splice in unwanted cuts.</li><li><strong>For images:</strong> Specify composition, perspective, rendering style, and exact quoted text for in-image typography.</li></ul><h4>5. Evaluate across three distinct tiers</h4><p>When a media agent breaks, it rarely fails in a single, predictable way. You need three separate testing layers to catch problems before users do:</p><ul><li><strong>Dispatch accuracy (The routing layer):</strong> Does the model select the right tool with the right arguments? The check is deterministic and cheap to run, and it immediately catches regressions when someone tweaks a docstring.</li><li><strong>Semantic asset quality (The visual layer):</strong> Did the model produce a good image or video? Use multimodal LLM judges and human spot-checks against clear rubrics (prompt adherence, physical artifacts, text readability, temporal stability).</li><li><strong>Pipeline latency (The transport layer):</strong> Where is time actually being spent? Track your time-to-first-acknowledgement separately from your final asset delivery so you know whether bottlenecks come from the LLM, the rendering queue, or asset transfer.</li></ul><h4>6. Put guardrails around cost and refusals</h4><p>Cap concurrent generation jobs per session, set retry limits, and require an explicit confirmation step before any multi-model chain. Catch upstream safety refusals and filter blocks in the tool wrapper and return them to the model as a structured result, so the agent can explain the issue and suggest a rephrased prompt without crashing the session.</p><h3>Two reference implementations</h3><p>This section provides two open-source projects that demonstrate these patterns end to end. Both run as real-time agents on the Gemini Live API.</p><h4>1. GenMedia Live</h4><p><a href="https://github.com/WafaeBakkali/genmedia-live">A level 1 agent built on the Gemini Live API</a> that integrates <a href="%E2%80%A63-1-flash-image">Nano Banana</a> for image generation, <a href="%E2%80%A6omni-flash-preview">Gemini Omni</a> for video generation, and ffmpeg as tools. Users can generate and edit images by voice, animate stills into video, assemble clips into short films, and use active camera or screen shares as visual references.</p><h4>2. Live Avatar Studio</h4><p>A level 2 agent for <a href="https://github.com/schenkfab/live-avatar-tutor">interactive avatars.</a> It streams video of a speaking avatar instead of plain audio, pairing image editing and video generation tools for dynamic scene composition. Users can share screens or camera feeds as visual references while customizing avatar styles and voices.</p><h3>Conclusion</h3><p>Building reliable GenMedia agents today still means writing the pieces no framework gives you: the asset registry, the media plane, the async job queue, and the branching edit history.</p><p>While the developer tooling is still catching up, the applications are already here. Teams are already deploying voice-guided visual editors, live-streaming avatars, and automated multimodal production workflows. Solid systems engineering is what keeps those experiences fast, resilient, and cost-effective at scale.</p><p><strong><em>👉 For a hands-on version of the evaluation and </em>prompting <em>patterns above, see </em></strong><a href="https://www.deeplearning.ai/courses/ai-agents-for-image-and-video-generation"><strong><em>AI Agents for Image and Video Generation</em></strong></a><strong><em>, the DeepLearning.AI short course I co-teach.</em></strong></p><blockquote><em>📜</em><strong><em>About the author</em></strong></blockquote><blockquote><em>Dr. Wafae Bakkali is a Tech Lead AI, Blackbelt at Google. With over 13 years of experience, she has a proven track record of combining deep technical expertise and leadership with strategic business insights to drive impactful outcomes. Through her current role at Google and former roles at reputable organizations such as AWS, Dr. Bakkali has successfully guided organizations across various industries in adopting and building AI solutions.</em></blockquote><blockquote><em>She holds a PhD from IMT Atlantique, France, and served as a postdoctoral researcher at Centrale Supélec, Paris-Saclay University, France.</em></blockquote><blockquote><em>Dr. Bakkali is also an active contributor to the AI community. She regularly shares her expertise as a speaker at international tech conferences and mentors participants in AI hackathons, tech, and startup events.</em></blockquote><p>🔗Connect with me on LinkedIn: <a href="https://www.linkedin.com/in/wafae-bakkali/">https://www.linkedin.com/in/wafae-bakkali/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b405dad35aee" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/building-generative-media-agents-model-harness-tools-b405dad35aee">Building generative media agents: model, harness, tools</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[GenMedia Live: Voice-Driven Multimodal AI Creation with Gemini Live API, Gemini 3 Pro Image, and…]]></title>
            <link>https://medium.com/google-cloud/genmedia-live-real-time-multimodal-ai-creation-with-gemini-live-api-gemini-3-pro-image-and-veo-df655b960e34?source=rss-63974cf5734d------2</link>
            <guid isPermaLink="false">https://medium.com/p/df655b960e34</guid>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[google]]></category>
            <category><![CDATA[generative-ai-tools]]></category>
            <dc:creator><![CDATA[Dr. Wafae Bakkali]]></dc:creator>
            <pubDate>Wed, 28 Jan 2026 21:45:46 GMT</pubDate>
            <atom:updated>2026-01-29T08:51:47.096Z</atom:updated>
            <content:encoded><![CDATA[<h3>GenMedia Live: Voice-Driven Multimodal AI Creation with Gemini Live API, Gemini 3 Pro Image, and Veo</h3><p><em>Voice-driven multimodal creation built on Gemini Live API with image and video generation.</em></p><blockquote>👉 The complete code for this workflow is available on <a href="https://github.com/GoogleCloudPlatform/generative-ai/tree/main/vision/sample-apps/genmedia-live">GitHub</a>.</blockquote><h3>Introduction</h3><p>Generative AI multimodal capabilities are rapidly improving, enabling high-quality generation across images, video, voice, and beyond. By combining multiple modalities, multimodal AI systems are unlocking entirely new kinds of experiences across domains, from voice assistants and conversational interfaces to applications for creative media.</p><p>One of the key reasons behind the rapid adoption of these systems is accessibility. AI models are becoming easier to use because we can communicate with them in natural language and interact through multiple, more intuitive ways.</p><p>Today, we still do not have a single model that supports all multimodal input–output combinations, such as audio-to-image generation. A practical way to unlock richer multimodal experiences is to build workflows that combine multiple models, each optimized for a specific capability.</p><p>One particularly interesting direction is the combination of real-time voice with image and video creation, where voice becomes the control layer for creation. Through natural voice interaction, users can generate images, produce videos, and even assemble creative workflows such as short films.</p><p>This approach is especially compelling for use cases like storytelling, creative media production, and content creation, where ideas evolve through iteration rather than fixed inputs.</p><p>This post explores that direction through GenMedia Live, a workflow that combines Google’s <a href="https://ai.google.dev/gemini-api/docs/live?example=mic-stream">Gemini Live API</a>, <a href="https://deepmind.google/models/gemini-image/pro/">Gemini 3 Pro Image</a> (aka Nano Banana Pro), and <a href="https://deepmind.google/models/veo/">Veo</a> to enable multimodal creation through voice.</p><h3>High-Level Overview</h3><p>GenMedia Live uses Gemini Live API for live conversational interaction and orchestration, extending its capabilities through function calling to:</p><ul><li><strong>Gemini 3 Pro Image</strong> for image generation and editing</li><li><strong>Veo</strong> for video generation</li><li><strong>ffmpeg</strong> for frame extraction and video combining</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FE8rCOhMxdSObE7FHu1UXw.png" /><figcaption>[Image by author] Figure 1. GenMedia Live architecture: High-Level Overview</figcaption></figure><p>You can interact naturally with voice or text to generate images from descriptions or edit existing ones, create videos from text or animate generated images, combine videos into short movies, and show your camera or share your screen to ask questions about what you see.</p><h3>How It Works</h3><p>Let’s look at how GenMedia Live works in practice.</p><blockquote>👉 <strong>Note</strong>: Code samples are simplified to illustrate the pattern. See the code repo for the full implementation.</blockquote><h3>Real-Time Voice Streaming</h3><p>Real-time voice streaming is based on Gemini Live API. For details on setting up real-time streaming with Gemini Live, see Google’s <a href="https://cloud.google.com/vertex-ai/generative-ai/docs/live-api">Live API documentation</a> and <a href="https://github.com/google-gemini/cookbook">cookbook examples</a>.</p><h3>Defining Tools for Gemini Live API</h3><p>The key pattern is registering tools that Gemini Live API can call. Each tool has a name, description, and parameter schema. The descriptions matter because Gemini Live API reads them to understand what each tool does and decides which one to call based on the user’s request. Here’s an example of how the tools are defined:</p><pre>from google.genai import types<br>tools = [<br>    types.Tool(function_declarations=[<br>        types.FunctionDeclaration(<br>            name=&quot;generate_image&quot;,<br>            description=&quot;Generate or edit an image&quot;,<br>            parameters={<br>                &quot;type&quot;: &quot;object&quot;,<br>                &quot;properties&quot;: {<br>                    &quot;prompt&quot;: {&quot;type&quot;: &quot;string&quot;},<br>                    &quot;refers_to_last&quot;: {&quot;type&quot;: &quot;boolean&quot;},<br>                },<br>                &quot;required&quot;: [&quot;prompt&quot;]<br>            }<br>        ),<br>        types.FunctionDeclaration(<br>            name=&quot;generate_video&quot;,<br>            description=&quot;Generate a video from text or animate an image&quot;,<br>            parameters={<br>                &quot;type&quot;: &quot;object&quot;,<br>                &quot;properties&quot;: {<br>                    &quot;prompt&quot;: {&quot;type&quot;: &quot;string&quot;},<br>                    &quot;duration&quot;: {&quot;type&quot;: &quot;integer&quot;},<br>                    &quot;refers_to_last&quot;: {&quot;type&quot;: &quot;boolean&quot;},<br>                },<br>                &quot;required&quot;: [&quot;prompt&quot;]<br>            }<br>        ),<br>        types.FunctionDeclaration(<br>            name=&quot;extract_frame&quot;,<br>            description=&quot;Extract a frame from a video at a specific timestamp&quot;,<br>            parameters={...}<br>        ),<br>        types.FunctionDeclaration(<br>            name=&quot;combine_videos&quot;,<br>            description=&quot;Combine multiple videos into one&quot;,<br>            parameters={...}<br>        ),<br>    ])<br>]</pre><h3>Connecting to Gemini Live API</h3><p>Once the tools are defined, we connect to Gemini Live API and pass the tools in the configuration. We also enable session resumption to maintain conversation history, allowing users to reference previous generations (e.g. “edit image 2”, “animate the last one”, etc). Here’s how to set up the connection:</p><pre>from google import genai<br>client = genai.Client(vertexai=True, project=PROJECT_ID, location=LOCATION)<br>config = types.LiveConnectConfig(<br>    response_modalities=[&quot;AUDIO&quot;],<br>    system_instruction=&quot;You are GenMedia Live, a creative AI assistant...&quot;,<br>    session_resumption=types.SessionResumptionConfig(handle=resumption_handle),<br>    tools=tools<br>)<br>async with client.aio.live.connect(<br>    model=&quot;gemini-live-2.5-flash-native-audio&quot;, <br>    config=config<br>) as session:<br>    # Handle real-time interaction</pre><h3>Handling Function Calls</h3><p>When a user makes a request like “generate an image of a dragon” or “combine all videos,” Gemini Live API decides which tool to call and sends a function call with the tool name and arguments. Our code then routes to the appropriate handler based on the function name:</p><pre>async for response in session.receive():<br>    if response.tool_call:<br>        for fc in response.tool_call.function_calls:<br>            if fc.name == &quot;generate_image&quot;:<br>                result = handle_image_generation(dict(fc.args))<br>            elif fc.name == &quot;generate_video&quot;:<br>                result = handle_video_generation(dict(fc.args))<br>            elif fc.name == &quot;extract_frame&quot;:<br>                result = handle_extract_frame(dict(fc.args))<br>            elif fc.name == &quot;combine_videos&quot;:<br>                result = handle_combine_videos(dict(fc.args))<br>            <br>            await session.send_tool_response(function_responses=[<br>                types.FunctionResponse(id=fc.id, name=fc.name, response=result)<br>            ])</pre><h3>Image Generation with Gemini 3 Pro Image</h3><p>The generate_image handler calls Gemini Pro Image to create or edit images. Users can reference a previously generated image (e.g. &quot;edit the last one&quot;) or use images from their camera, screen share, or upload images from the UI as reference:</p><pre>def handle_image_generation(args):<br>    prompt = args.get(&quot;prompt&quot;)<br>    refers_to_last = args.get(&quot;refers_to_last&quot;, False)<br>    <br>    content_parts = []<br>    <br>    # Add reference image if editing<br>    if refers_to_last and last_generated_image:<br>        content_parts.append({<br>            &quot;inline_data&quot;: {&quot;mime_type&quot;: &quot;image/png&quot;, &quot;data&quot;: last_generated_image}<br>        })<br>        content_parts.append(f&quot;Based on this image: {prompt}&quot;)<br>    else:<br>        content_parts.append(prompt)<br>    <br>    # Call Gemini 3 Pro Image<br>    response = image_client.models.generate_content(<br>        model=&quot;gemini-3-pro-image-preview&quot;,<br>        contents=content_parts,<br>        config=types.GenerateContentConfig(response_modalities=[&#39;TEXT&#39;, &#39;IMAGE&#39;])<br>    )<br>    <br>    # Save and return result</pre><h3>Video Generation with Veo 3.1</h3><p>The generate_video handler calls Veo to create videos. When a user speaks, Gemini Live API processes the audio, understands the request, and passes the prompt as text in the function call arguments. Users can also animate a previously generated image by referencing it (e.g. &quot;animate the last image&quot;):</p><pre>def handle_video_generation(args):<br>    prompt = args.get(&quot;prompt&quot;)<br>    duration = args.get(&quot;duration&quot;, 8)<br>    refers_to_last = args.get(&quot;refers_to_last&quot;, False)<br>    <br>    config = types.GenerateVideosConfig(<br>        aspect_ratio=&quot;16:9&quot;,<br>        duration_seconds=duration,<br>        enhance_prompt=True,<br>    )<br>    <br>    # With or without reference image<br>    if refers_to_last and last_generated_image:<br>        operation = video_client.models.generate_videos(<br>            model=&quot;veo-3.1-generate-001&quot;,<br>            prompt=prompt,<br>            image=types.Image(image_bytes=last_generated_image, mime_type=&quot;image/png&quot;),<br>            config=config<br>        )<br>    else:<br>        operation = video_client.models.generate_videos(<br>            model=&quot;veo-3.1-generate-001&quot;,<br>            prompt=prompt,<br>            config=config<br>        )<br>    <br>    # Poll for completion and save result</pre><h3><em>Frame Extraction and Video Combining</em></h3><p>GenMedia Live also includes utility tools powered by ffmpeg. The extract_frame handler extracts a frame from a video at a specific timestamp, and the combine_videos handler merges multiple videos into one, enabling users to create short movies from their generated clips:</p><pre>def handle_extract_frame(args):<br>    video_id = args.get(&quot;video_id&quot;)<br>    timestamp = args.get(&quot;timestamp&quot;, 0)<br>    <br>    video_path = f&quot;outputs/videos/video_{video_id}.mp4&quot;<br>    frame_path = f&quot;outputs/images/image_{next_id}.png&quot;<br>    <br>    # Extract frame using ffmpeg<br>    subprocess.run([<br>        &quot;ffmpeg&quot;, &quot;-ss&quot;, str(timestamp),<br>        &quot;-i&quot;, video_path,<br>        &quot;-vframes&quot;, &quot;1&quot;,<br>        frame_path<br>    ])<br>    <br>    # Save and return result<br><br>def handle_combine_videos(args):<br>    video_ids = args.get(&quot;video_ids&quot;, [])<br>    output_path = f&quot;outputs/videos/video_{next_id}.mp4&quot;<br>    <br>    # Create file list for ffmpeg concat<br>    with open(&quot;concat_list.txt&quot;, &quot;w&quot;) as f:<br>        for vid_id in video_ids:<br>            f.write(f&quot;file &#39;outputs/videos/video_{vid_id}.mp4&#39;\n&quot;)<br>    <br>    # Combine videos using ffmpeg<br>    subprocess.run([<br>        &quot;ffmpeg&quot;, &quot;-f&quot;, &quot;concat&quot;,<br>        &quot;-safe&quot;, &quot;0&quot;,<br>        &quot;-i&quot;, &quot;concat_list.txt&quot;,<br>        &quot;-c&quot;, &quot;copy&quot;,<br>        output_path<br>    ])<br>    <br>    # Save and return result</pre><h3>The Complete Flow</h3><p>For each interaction:</p><ol><li>User speaks → audio streams to Gemini Live API</li><li>Gemini Live API understands intent → decides to call a tool</li><li>Tool call received → routed to handler</li><li>Handler calls Gemini Pro Image, Veo, or ffmpeg → saves output</li><li>Result sent back to Gemini Live API → speaks confirmation to user</li></ol><p>The session maintains conversation history, allowing Gemini Live API to recall the context of previous generations, while the application layer manages the media assets for iterative editing.</p><h3>Demo: GenMedia Live in Action</h3><p>See how natural voice interaction drives image and video generation, enabling multimodal creation as a single conversational flow.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FaITLykQbJI4%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DaITLykQbJI4&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FaITLykQbJI4%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/0d37d3461543f262bdd9084efb525788/href">https://medium.com/media/0d37d3461543f262bdd9084efb525788/href</a></iframe><blockquote>👉 <strong>Note: </strong>For demonstration purposes, the wait times between the voice command and the final image and video output have been accelerated.</blockquote><h3>Try It Yourself</h3><p>To run GenMedia Live, you’ll need:</p><ul><li>Python 3.10+</li><li>A Google Cloud project with Vertex AI API enabled</li><li>ffmpeg installed (<a href="https://ffmpeg.org/download.html">installation guide</a>)</li></ul><p>Clone and run:</p><pre>git clone https://github.com/WafaeBakkali/genmedia-live.git<br>cd genmedia-live<br>python -m venv venv<br>source venv/bin/activate<br>pip install -r requirements.txt<br>python app.py</pre><p>Open <a href="http://localhost:8080">http://localhost:8080</a>, authenticate with your Google Cloud credentials, and click Voice to start.</p><p>Example use cases to try with GenMedia Live include:</p><ul><li><strong>Storytelling and creative media</strong>, combining generated images and videos into short, conversationally driven narratives</li><li><strong>Virtual try-on</strong> using a live camera feed to explore outfits, styles, and short animated previews through voice</li><li><strong>Home decoration and interior design</strong> based on what the camera sees, including furniture changes and style transformations</li><li><strong>Educational and explainer content</strong>, where spoken questions are turned into images, animations, or short videos</li></ul><h3>Conclusion</h3><p>GenMedia Live demonstrates how to extend Gemini Live API’s real-time conversation capabilities to image and video generation through function calling. By combining Gemini Live API, Gemini 3 Pro Image, Veo, and ffmpeg, users can create and edit images, generate videos, and produce short movies through natural voice and text interaction.</p><p>This type of interaction can enable new possibilities across many domains such as creative workflows where ideas evolve through conversation, interactive learning experiences, or accessible interfaces for people who prefer voice over typing. Some ideas to extend this pattern include:</p><ul><li>Add more tools (music generation, code generation, etc.)</li><li>Build domain-specific applications (storyboarding, product visualization, education)</li><li>Integrate with external APIs (search, databases, file storage)</li></ul><h3>Disclaimer</h3><p>This project is a technical proof-of-concept for educational purposes. This is not an officially supported Google product.</p><blockquote><em>📜</em><strong><em>About the author</em></strong></blockquote><blockquote><em>Dr. Wafae Bakkali is a Staff Generative AI Specialist, Blackbelt at Google. With over 13 years of experience, she has a proven track record of combining deep technical expertise and leadership with strategic business insights to drive impactful outcomes. Through her current role at Google and former roles at reputable organizations such as AWS, Dr. Bakkali has successfully guided organizations across various industries in adopting and building AI solutions.</em></blockquote><blockquote><em>She holds a PhD from IMT Atlantique, France, and served as a postdoctoral researcher at Centrale Supélec, Paris-Saclay University, France.</em></blockquote><blockquote><em>Dr. Bakkali is also an active contributor to the AI community. She regularly shares her expertise as a speaker at international tech conferences and mentors participants in AI hackathons, tech, and startup events.</em></blockquote><p>🔗Connect with me on LinkedIn: <a href="https://www.linkedin.com/in/wafae-bakkali/">https://www.linkedin.com/in/wafae-bakkali/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=df655b960e34" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/genmedia-live-real-time-multimodal-ai-creation-with-gemini-live-api-gemini-3-pro-image-and-veo-df655b960e34">GenMedia Live: Voice-Driven Multimodal AI Creation with Gemini Live API, Gemini 3 Pro Image, and…</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building a Multimodal AI Shopping Workflow with Gemini 2.5]]></title>
            <link>https://medium.com/google-cloud/building-a-multimodal-ai-shopping-workflow-with-gemini-2-5-916fe04800c6?source=rss-63974cf5734d------2</link>
            <guid isPermaLink="false">https://medium.com/p/916fe04800c6</guid>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[agents]]></category>
            <category><![CDATA[veo-3]]></category>
            <category><![CDATA[generative-ai]]></category>
            <dc:creator><![CDATA[Dr. Wafae Bakkali]]></dc:creator>
            <pubDate>Wed, 22 Oct 2025 13:59:11 GMT</pubDate>
            <atom:updated>2025-10-22T19:36:50.845Z</atom:updated>
            <content:encoded><![CDATA[<h3>Building a Multimodal AI Shopping Workflow with Gemini 2.5 Computer Use, Gemini Nano Banana, and Veo</h3><p><em>Exploring a generative AI workflow that combines computer use, multimodal reasoning, and creative generation to build end-to-end shopping experiences.</em></p><blockquote>👉 The complete code for this workflow is available on <a href="https://github.com/WafaeBakkali/ai-shopping-agent/tree/main">GitHub</a>.</blockquote><h3>Introduction</h3><p>Generative AI has transformed how we create, learn, and connect, but also how we shop. Online shopping often means endless scrolling, filtering, and comparing. Despite having infinite options, finding what we actually want can still take hours.</p><p>But what if shopping were conversational? What if you could simply say: <em>“I need an outfit for a birthday party,” </em>or<em> “I want to decorate my living room in a cozy, minimalist style.” </em>and get back curated selections, a photorealistic preview showing you wearing the outfit or your room styled with new furniture, and even a short video that brings it all to life?</p><p>In this post, we’ll explore what becomes possible when <a href="https://ai.google.dev/gemini-api/docs/computer-use">Gemini 2.5 Computer Use</a>, <a href="https://ai.google.dev/gemini-api/docs/image-generation">Gemini 2.5 Flash Image</a> (aka Nano Banana), and <a href="https://ai.google.dev/gemini-api/docs/video?example=dialogue">Veo 3.1</a> work together to power an AI shopping workflow that can:</p><ul><li>Understand a user’s natural language intent and break it down into a list of structured, actionable search terms</li><li>Automatically perform multiple searches on the web to collect relevant products for each term</li><li>Generate realistic creative visuals and videos showing how items fit together</li></ul><h3>The AI Shopping Workflow: An Overview</h3><p>While our main example will be finding an outfit, this exact workflow can be applied to other use cases, like home decor, event planning, and more.</p><p>Here’s the global picture of what we’re building:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2U1XLR8nF0A3f_RrSjzYAg.png" /><figcaption><strong>[Image by author] Figure 1. The AI Shopping Workflow: Decompose → Search → Visualize → Animate</strong></figcaption></figure><p>Together, these three models form a multimodal pipeline:</p><ul><li><strong>Gemini 2.5 Computer Use</strong> → Web navigation and data collection</li><li><strong>Gemini 2.5 Flash Image (Nano Banana)</strong> → Image synthesis and virtual try-on</li><li><strong>Veo 3.1</strong> → Video generation and realistic motion</li></ul><h3>Step 1: The Agentic Loop: Navigate Websites (Gemini 2.5 Computer Use)</h3><p>Once the user’s intent is broken down, the next task is interacting with the web to find the right data. This is where Gemini 2.5 Computer Use comes in.</p><h4>What is Gemini 2.5 Computer Use?</h4><p>In the context of Artificial Intelligence (AI), “computer use” refers to an agent’s ability to operate a computer’s graphical user interface (GUI) to achieve a goal. Instead of relying on structured data or APIs, this type of agent “sees” the screen visually and decides where to click, type, and scroll to complete a task. Think of it as an AI agent that can operate a web browser by seeing the screen and using a virtual “mouse” and “keyboard” to execute a task.</p><p>Gemini 2.5 Computer Use is Google’s specialized model built to do exactly this. It’s built on Gemini 2.5 Pro’s capabilities to power agents capable of interacting with user interfaces.</p><p>It works as part of an agentic loop process:</p><ol><li><strong>Input:</strong> The model receives a user request (the goal) and a screenshot of the current environment.</li><li><strong>Analysis:</strong> It analyzes these inputs and generates a response, typically a function_call representing a UI action (e.g., click_at, type_text_at).</li><li><strong>Action: </strong>Your application code executes this action.</li><li><strong>Feedback:</strong> A new screenshot is captured and sent back to the model, restarting the loop.</li><li>This iterative process continues until the task is complete.</li></ol><p>In our AI shopping workflow, this agentic loop is the engine for the search step. It’s what turns the user’s intent into action on the web. When a user gives a complex prompt, like: <em>“I need an outfit for a job interview under 300 euros”.</em></p><p>The workflow first uses Gemini 2.5 Flash model to decompose this query into a list of searchable items (e.g., blazer, shirt, pants, shoes)</p><p>Once we have this list, the Computer Use agent takes over. For each item in the list, it performs an independent, automated browsing session. It will:</p><ul><li><strong>Navigate</strong> to an e-commerce site (using permitted, test-friendly environments).</li><li><strong>Click</strong> the cookie acceptance button.</li><li><strong>Type</strong> “blazer” into the search bar and press Enter.</li><li><strong>Scroll</strong> down the page to load more results.</li><li><strong>Extract</strong> the product details (name, price, image URL) from the 5 best-matching items.</li><li><strong>Repeat</strong> this entire process for “shirt,” “ pants,” and “shoes.”</li></ul><p>The image below shows our application’s logs, which capture the series of actions and observations as the model works towards its goal.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ITHPHLjjz7-HHBYUDe-log.png" /><figcaption><strong>[Image by author] Figure 2. Gemini 2.5 Computer use actions log</strong></figcaption></figure><p>The code to run this is straightforward. We operate in a loop: we give the agent our goal and a screenshot, it gives us the next action to perform, we execute that action, and repeat.</p><pre># From computer_use_helper.py - Main Action Loop<br># The user&#39;s goal<br>goal = f&quot;&quot;&quot;Search Amazon.fr for &quot;{search_terms}&quot;.<br>1. Click search box<br>2. Type: &quot;{search_terms}&quot;<br>3. Press Enter<br>4. Scroll down twice<br>5. Say &quot;Done&quot;<br>&quot;&quot;&quot;<br># Give the goal and the first screenshot<br>contents = [<br>    Content(<br>        role=&quot;user&quot;,<br>        parts=[<br>            Part(text=goal),<br>            Part.from_bytes(data=screenshot, mime_type=&quot;image/png&quot;)<br>        ]<br>    )<br>]<br># Loop until the agent is &quot;Done&quot;<br>for turn in range(max_turns):<br>    # Get the agent&#39;s desired action<br>    response = client.models.generate_content(<br>        model=MODEL, # &quot;gemini-2.5-computer-use-preview-10-2025&quot;<br>        contents=contents,<br>        config=config # Config specifies the computer_use tool<br>    )<br>    <br>    candidate = response.candidates[0]<br>    <br>    # Omitted for brevity<br>    <br>    # Execute the browser actions (click, type, scroll)<br>    results, fcs, parts = execute_actions(candidate, page, ...)<br>    <br>    # Create the function response and new screenshot<br>    function_responses, screenshot = create_function_responses(page, results, fcs, parts)<br>    <br>    # Omitted for brevity</pre><p>At the end of this step, our workflow has a curated list of 20 products (5 for each of the 4 items) ready for the user to review.</p><blockquote>👉 <strong>Note:</strong> For this demonstration, we are targeting a single, known e-commerce site for simplicity and reliability. However, Gemini 2.5 Computer use itself is site-agnostic, and this workflow could be generalized to navigate other sites.</blockquote><blockquote>For the workflow’s design, the code provides a specific, multi-step goal (e.g., &quot;Click search box,&quot; &quot;Type,&quot; &quot;Scroll&quot;) and programmatically navigates to a known e-commerce site.</blockquote><blockquote>This defines the high-level strategy for the agent. The computer use model’s job is to take each of those steps and figure out <em>how</em> to visually execute it, for example, by looking at the screenshot to find the actual coordinates of the “search box” to click or identifying where to type the text.</blockquote><h3>Step 2: Visualize (Gemini 2.5 Flash Image)</h3><p>The agent has successfully found a list of products. Now, the next step in our workflow is to bridge the gap between a list of items and a cohesive look. How do these products look together? And more importantly, how could we create a photorealistic visualization of them on the user?</p><p>This is where Gemini 2.5 Flash Image (Nano Banana) steps in. Here’s how this step works in practice:</p><ol><li>The user selects their favorite items from the search results (e.g., one blazer, one shirt, one pair of pants, one pair of shoes).</li><li>They upload a photo of themselves (the “original asset”).</li><li>Our application creates a simple product collage from the selected items. This is a crucial step because Gemini 2.5 Flash Image (Nano Banana) accepts a maximum of three input images. To send the user’s photo plus a full outfit of 3–4 items, we must first combine all the product images into a single collage.</li><li>We send the user’s photo and the product collage to the Gemini 2.5 Flash Image model with a clear, simple prompt.</li></ol><pre># From vto_generator.py - Nano Banana Virtual Try-On<br>def generate_multi_product_tryon(user_photo_base64, products, gemini_client):<br>    # ... (Logic to decode user photo)<br>    # ... (Logic to download product images)<br>    # 1. Create the collage (if more than 2 items)<br>    collage_bytes = create_product_collage(product_images_bytes)<br>    <br>    # 2. Build the prompt<br>    prompt = &quot;Generate a picture of the person in the first image wearing all the clothes shown in the collage photo (second image).&quot;<br>    <br>    model = &quot;gemini-2.5-flash-image&quot;<br>    <br>    # 3. Build the content parts<br>    parts = [<br>        types.Part.from_text(text=prompt),<br>        types.Part.from_bytes(data=user_photo_bytes, mime_type=&quot;image/jpeg&quot;), # Image 1<br>        types.Part.from_bytes(data=collage_bytes, mime_type=&quot;image/jpeg&quot;)      # Image 2<br>    ]<br>    contents = [types.Content(role=&quot;user&quot;, parts=parts)]<br>    # 4. Generate the new image<br>    response = gemini_client.models.generate_content_stream(<br>        model=model,<br>        contents=contents,<br>        # Omitted for brevity<br>    )<br>    <br>    # ... (Extract image from response)</pre><p>In seconds, the user receives a single, photorealistic Virtual Try-On (VTO) image of themselves wearing the complete outfit they just assembled from the agent’s search results.</p><h3>Step 3: Animate (Veo 3.1)</h3><p>We have a static, photorealistic image, which is a fantastic result. But to truly enhance the user experience, we can take it one step further. A dynamic video gives the user a complete, 360-degree view, helping them understand the fit and flow of the outfit in a way a static image can’t. The final step in our workflow is to bring this static image to life</p><p>This final animation step is powered by Veo 3.1, Google’s most capable video generation model. Veo can take a starting image and a text prompt to generate a high-definition, coherent video with complex and realistic camera movements.</p><p>Our workflow logic for this final step is:</p><ol><li>We take the static virtual try-on image generated by Nano Banana in Step 2. This will be the starting frame for our video.</li><li>Our application logic checks the list of selected items. If it detects “shoes,” “boots,” or other footwear, it knows a full-body shot is required.</li><li>Based on this check, it builds an intelligent prompt:</li><li>If shoes are present: It requests a “smooth 360-degree camera rotation” to show the full outfit from head to toe.</li><li>If no shoes are present: It requests a “smooth 180-degree rotation” to focus on the upper body.</li><li>This starting image and the custom prompt are sent to the Veo 3.1 API.</li></ol><p>This “smart prompt” logic ensures the generated video is always framed correctly for the specific outfit.</p><pre># From video_generator.py - Veo 3.1 Video Generation<br><br>def generate_outfit_video_veo(user_photo_base64, products, project_id, ...):<br>    <br>    # ... (Logic to check for shoes)<br>    has_shoes = any(keyword in name.lower() for name in product_names ...)<br>    <br>    # 1. Select the right camera movement based on presence of shoes<br>    if has_shoes:<br>        # Full outfit with shoes - 360° rotation<br>        prompt = f&quot;&quot;&quot;A professional video showing the full outfit.<br>SUBJECT: The person wearing {len(products)} new clothing items.<br>CAMERA MOVEMENT: Smooth 360-degree clockwise rotation around the person, showing all angles.<br>VISUAL STYLE: Full body shot (head to toe visible), well-lit, simple neutral background. Keep the person centered.<br>&quot;&quot;&quot;<br>    else:<br>        # Upper body outfit - 180° rotation<br>        prompt = f&quot;&quot;&quot;A professional video showing the upper-body outfit.<br>SUBJECT: The person wearing {len(products)} new clothing items.<br>CAMERA MOVEMENT: Smooth 180-degree rotation (front to back to front).<br>VISUAL STYLE: Medium shot focusing on the upper body, well-lit, simple neutral background. Keep the person centered.<br>&quot;&quot;&quot;<br>    <br>    # 2. Load the try-on image (output from Step 2)<br>    tryon_image = types.Image.from_file(location=temp_path)<br>    <br>    # 3. Call the Veo 3.1 API<br>    operation = client.models.generate_videos(<br>        model=&quot;veo-3.1-generate-preview&quot;,<br>        prompt=prompt,<br>        image=tryon_image, # Use the try-on as the starting frame<br>        config=types.GenerateVideosConfig(<br>            aspect_ratio=&quot;9:16&quot;, # Vertical for outfit showcase<br>            duration_seconds=8,<br>            resolution=&quot;1080p&quot;,<br>        ),<br>    )<br>    <br>    # ... (Wait for operation to complete)</pre><p>The result is a 8-second, high-definition, vertical video of the user in their new outfit, complete with smooth, professional camera motion. It’s a dynamic asset that gives a 360° view of the products, taking the shopping experience to a whole new level.</p><h3>Beyond Apparel: The Workflow’s Versatility</h3><p>While we used outfit generation as the main example, this agentic workflow generalizes beautifully to many domains. Whether it’s home decor, event planning, or recipe creation, the pattern <strong>Decompose → Search → Visualize → Animate</strong> remains the same.</p><h4>Example 1: Home Decor</h4><ul><li><strong>Prompt:</strong> “I need a mid-century modern look for my living room under $2000.”</li><li><strong>Step 1:</strong> The agent browses sites like Wayfair or IKEA, searching for “mid-century sofa,” “walnut coffee table,” and “abstract rug” that fit the budget. It gathers a list of products.</li><li><strong>Step 2:</strong> The user uploads a photo of their empty living room...</li><li><strong>Step 3:</strong> The model takes the “virtually staged” room and generates a short video, smoothly panning across the room to showcase the new furniture from different angles.</li></ul><h4>Example 2: Professional Recipe Showcase</h4><ul><li><strong>Prompt:</strong> “I need a 3-course Italian dinner menu for a corporate event this week.”</li><li><strong>Step 1:</strong> The agent decomposes this into “Italian appetizer,” “Italian main course,” and “Italian dessert.” It browses recipe sites to find 3–4 top-rated options for each, extracting ingredients and instructions.</li><li><strong>Step 2:</strong> The user selects one recipe from each category. They upload a photo of a simple dinner plate. Nano Banana generates a photorealistic image of the final, plated meal.</li><li><strong>Step 3:</strong> The model takes the plated meal image and generates a short, appetizing promotional video, perhaps with a slow zoom or a subtle steam effect, making the recipe irresistible.</li></ul><h3>Demo: AI Shopping Workflow in Action</h3><p>Watch the end-to-end workflow in action, from intent understanding to product search, virtual try-on, and video generation.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FNco7DN9tO3M%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DNco7DN9tO3M&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FNco7DN9tO3M%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/fa62679d1943b84deec12982bb6d71ad/href">https://medium.com/media/fa62679d1943b84deec12982bb6d71ad/href</a></iframe><blockquote>👉 <strong>Note:</strong> For demonstration purposes, some browsing sequences in the video have been accelerated. In real-world usage, the complete workflow (searching 4 items across Amazon.fr, generating virtual try-on, and creating video) takes approximately 8–9 minutes from start to finish.</blockquote><h3>Conclusion</h3><p>What we’ve built here is just one of many possible generative AI workflows. It shows the power of specialized multimodal models accessible via APIs, each designed for a specific task, from reasoning and computer use to image and video generation.</p><p>By combining these capabilities, we can build complex, end-to-end applications that move beyond simple Q&amp;A to actively assist users in completing real-world tasks. As models become more multimodal and compositional, these orchestrated pipelines are shaping the next generation of AI experiences, ones that understand, act, and collaborate with users seamlessly.</p><h3>Responsible Use</h3><p>Gemini 2.5 Computer Use was built with safety at its core. Developers should follow the best practices outlined in the <a href="https://ai.google.dev/gemini-api/docs/computer-use">documentation</a>, including per-step safety checks, user confirmation for sensitive actions, and thorough testing before deployment. Use these capabilities responsibly, with transparency, respect for website policies, and a focus on trust, safety, and human benefit.</p><h3><strong>Disclaimer</strong></h3><p>This project is a technical proof-of-concept for educational purposes. The workflow shown in the demo is intended to illustrate the capabilities of these AI models. The use of a commercial website and its content is for demonstration purposes only.</p><p>A real-world application of this technology would require explicit permission from website owners to ensure it aligns with their policies and content usage guidelines.</p><blockquote><em>📜</em><strong><em>About the author</em></strong></blockquote><blockquote><em>Dr. Wafae Bakkali is a Staff Generative AI Specialist, Blackbelt at Google. With over 13 years of experience, she has a proven track record of combining deep technical expertise and leadership with strategic business insights to drive impactful outcomes. Through her current role at Google and former roles at reputable organizations such as AWS, Dr. Bakkali has successfully guided organizations across various industries in adopting and building AI solutions.</em></blockquote><blockquote><em>She holds a PhD from IMT Atlantique, France, and served as a postdoctoral researcher at Centrale Supélec, Paris-Saclay University, France.</em></blockquote><blockquote><em>Dr. Bakkali is also an active contributor to the AI community. She regularly shares her expertise as a speaker at international tech conferences and mentors participants in AI hackathons, tech, and startup events.</em></blockquote><p>🔗Connect with me on LinkedIn: <a href="https://www.linkedin.com/in/wafae-bakkali/">https://www.linkedin.com/in/wafae-bakkali/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=916fe04800c6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/building-a-multimodal-ai-shopping-workflow-with-gemini-2-5-916fe04800c6">Building a Multimodal AI Shopping Workflow with Gemini 2.5</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Color Code Adherence in AI Image Generation: A Case Study with Gemini]]></title>
            <link>https://medium.com/google-cloud/color-code-adherence-in-ai-image-generation-a-case-study-with-gemini-9d48c06d9e41?source=rss-63974cf5734d------2</link>
            <guid isPermaLink="false">https://medium.com/p/9d48c06d9e41</guid>
            <category><![CDATA[image-generation]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[gemini]]></category>
            <category><![CDATA[multimodal-ai]]></category>
            <category><![CDATA[machine-learning]]></category>
            <dc:creator><![CDATA[Dr. Wafae Bakkali]]></dc:creator>
            <pubDate>Sat, 20 Sep 2025 20:43:01 GMT</pubDate>
            <atom:updated>2025-10-19T23:04:25.543Z</atom:updated>
            <content:encoded><![CDATA[<p><em>How to achieve precise color matching (HEX, RGB, HSL) with AI Image generation models: Example of Gemini 2.5 Flash Image (aka Nano Banana)</em></p><blockquote><em>👉 The complete code for this analysis is available </em><a href="https://github.com/WafaeBakkali/gemini-color-adherence-study"><em>on GitHub.</em></a></blockquote><h3>Introduction</h3><p>In multimodal generative AI, precise control over image attributes such as color, texture, and composition is essential for producing professional, brand-consistent content. Among these attributes, color plays a particularly critical role. Image-generative models can approximate colors well, but exact pixel-perfect adherence to a specific HEX, RGB or HSL code is still a challenge. Even small discrepancies between a specified color value and the final color rendered in the generated image can disrupt workflows and compromise brand identity.</p><p>This level of accuracy is vital for applications such as on-brand marketing materials, digital art, e-commerce imagery, social media assets, product mockups, user interface elements or web design. While minor color variations may be acceptable for casual use, professional settings require strict adherence to predefined color palettes.</p><p>In this post:</p><ul><li>We show how to achieve precise color code matching in AI-generated images using visual references.</li><li>We provide examples with <a href="https://deepmind.google/models/gemini/image/">Gemini 2.5 Flash Image</a> (aka “Nano Banana”) and evaluate how well the model reproduces target colors specified in HEX, RGB and HSL formats. For that, we analyze 50 generated images created with the model.</li><li>For objective evaluation, color accuracy is measured using <a href="https://sdc.org.uk/wp-content/uploads/2022/06/2002RP028.pdf">Delta E 2000 (CIE2000)</a>, an industry-standard metric for perceptual color difference</li></ul><h3>The “Color Image Reference” Approach</h3><p>Typically, users specify a color in the text prompt (e.g., <em>“a car in color #FF0000”</em> or <em>“a car in RGB(255,0,0)”</em>). While this can work in some cases, it is often inaccurate because the model does not interpret the instruction with mathematical precision. This can result in noticeable discrepancies between the prompt and the generated image.</p><p><strong>The solution? Instead of telling the model the color, show it.</strong></p><p>This is a two-step process:</p><ol><li><strong>Convert:</strong> Turn your color code (e.g., HEX) into a simple, flat image swatch.</li><li><strong>Reference:</strong> Pass this image swatch as a multimodal input along with your text prompt.</li></ol><h4>Step 1: convert a color code to a swatch</h4><p>We can use the Python Pillow (PIL) library to create an in-memory PNG of any color. The following function takes a hex code, converts it to RGB, and saves it as bytes, ready to be sent to the API:</p><pre>def hex_to_rgb(h: str) -&gt; tuple:<br>    &quot;&quot;&quot;Converts a hex color string (e.g. #FF0000) to an (R, G, B) tuple.&quot;&quot;&quot;<br>    h = h.lstrip(&quot;#&quot;)<br>    return tuple(int(h[i : i + 2], 16) for i in (0, 2, 4))<br>def create_color_swatch_bytes(hex_color: str) -&gt; bytes:<br>    &quot;&quot;&quot;Creates a 256x256 PNG image of a solid color in memory.&quot;&quot;&quot;<br>    # Convert the hex code to a numerical (R, G, B) tuple<br>    rgb_color = hex_to_rgb(hex_color)<br>    <br>    # Create a new image in &#39;RGB&#39; mode with the specified color<br>    img = Image.new(&quot;RGB&quot;, (256, 256), color=rgb_color)<br>    <br>    # Save the image to an in-memory byte buffer<br>    buf = io.BytesIO()<br>    img.save(buf, format=&quot;PNG&quot;)<br>    <br>    # Return the raw bytes of the image<br>    return buf.getvalue()<br># --- Example Usage ---<br>hex_code = &quot;#d81515&quot;<br>image_bytes = create_color_swatch_bytes(hex_code)<br>image_swatch = Image.open(io.BytesIO(image_bytes))</pre><h4>Step 2: use the swatch in the Gemini prompt</h4><p>With our image_swatch object, we now build a multimodal prompt. The contents list will include our base prompt (defining the object) and the image_swatch (defining the color), as shown in the example below:</p><pre># Assuming &#39;client&#39; is the genai module and the model is defined<br># We pass the PIL.Image object directly in the contents list<br>parts_image = [<br>    f&quot;{base_prompt} The color should match the attached swatch.&quot;,<br>    image_swatch  <br>]<br># This list is sent to the model:<br>client.models.generate_content(contents=parts_image)</pre><p><em>👉 For the complete, runnable code, including client setup and helper functions, see the full repository [linked in the Appendix].</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0ZTwKRiBo1rJZOcEBCFAhA.png" /><figcaption>Source: Generated with Gemini 2.5 Flash</figcaption></figure><h3>Evaluation</h3><p>In this section, we conduct a quantitative evaluation to assess how well Gemini 2.5 Flash Image adheres to specific color codes and compare the results of prompting the model with color text-only descriptions versus text with color image references.</p><ul><li><strong>Text-only prompt:</strong><br> [f&quot;{base_prompt} The color is {hex_code}.&quot;]</li><li><strong>Color image reference prompt:</strong><br> [f&quot;{base_prompt} The color should match the attached swatch.&quot;, image_swatch]</li></ul><p>We performed this test using 50 randomly selected, diverse hex color codes to ensure a representative sample across the color spectrum. For each prompt type (text-only and text with a color image reference), Gemini generated an image, from which we computed the average color of the output.</p><p>We then measured the perceptual color difference using ΔE2000, comparing the average generated color to the exact target color code.</p><p>To ensure the outputs were suitable for this kind of evaluation, we included the following instruction in the prompt:</p><blockquote>“A full-frame, solid-color background. The entire image should be a single, flat, unified color. No texture, no lighting, no gradients.”</blockquote><p>This ensured that the generated images were visually flat and uniform, allowing for accurate color averaging and meaningful Delta E 2000 (ΔE2000) comparisons.</p><h4>Example Comparison</h4><p>As shown in Figure 1, the results of the two prompting strategies for the target color #d81515 are compared:</p><ul><li><strong>Target:</strong> A flat red with hex code #d81515</li><li><strong>Text-only color instruction result:</strong> ΔE = 9.46 (visibly darker)</li><li><strong>Color image reference result:</strong> ΔE = 0.66 (nearly indistinguishable from the target)</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ShO1CLt2XyfrbWrRr0usTg.png" /><figcaption><strong>[Image by author] Figure 1. Color reproduction accuracy using text-only descriptions vs. color image references. </strong><br>This example reflects the overall pattern observed throughout the experiment: visual references lead to closer color matches.</figcaption></figure><h4>Results across all 50 tests</h4><p>The results across all 50 different color tests show a significant improvement in color reproduction accuracy with the color image reference approach:</p><ul><li><strong>Average ΔE (Text-only):</strong> 11.25</li><li><strong>Average ΔE (Image reference):</strong> 0.90</li></ul><p>A ΔE below 1.0 is generally considered imperceptible to the human eye, indicating that the color image-based approach enables high-fidelity color reproduction, with the average error (0.90) falling below the perceptible threshold, while a higher value indicates greater perceptual deviation, as seen with text-only descriptions, which lead to larger color errors.</p><p>To illustrate these findings, Figure 2 shows the distribution of ΔE values across all 50 test cases.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6INZeFlf_JaDQbSRjdp98w.png" /><figcaption><strong>[Image by author] </strong>Figure 2. Delta E (Color Difference) Distribution: Text-only color instruction vs. color image reference (n=50)</figcaption></figure><h4>Additional Examples</h4><p>To further illustrate the performance across different tasks, we include additional examples that highlight the real-world implications of using text-only versus image-reference instructions. These examples cover both image generation and image editing tasks.</p><p><strong>Image generation examples</strong></p><ul><li>Figure 3 shows an image generation result using a text-only prompt.</li><li>Figure 4 presents the same generation task, but with an image swatch provided as a reference, allowing the model to match the color more precisely.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cWKRSEhm-TTrK1elsIbNBg.png" /><figcaption><strong>[Image by author] </strong>Figure 3. Image generation with text-only color instruction</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kMKemxloHeAyORil-2Lzmg.png" /><figcaption><strong>[Image by author] </strong>Figure 4. Image generation with color image reference</figcaption></figure><p><strong>Image editing examples</strong></p><ul><li>Figure 5 illustrates an image editing task where color modification is prompted through text alone.</li><li>Figure 6 shows the corresponding image editing task using a color image reference, enabling more accurate and faithful edits.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7KoNgZy6xLIHvXt3hla9KA.png" /><figcaption><strong>[Image by author] </strong>Figure 5. Image editing with text-only color instruction</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9ZiTNG6M0i86ErXIWKkiTQ.png" /><figcaption><strong>[Image by author] </strong>Figure 6. Image editing with color image reference</figcaption></figure><h3>Conclusion</h3><p>In this post, we explored how to achieve precise color reproduction with AI image generation models, using Gemini 2.5 Flash Image as an example. We compared the effectiveness of text-only prompts versus color image reference-based generation. The results clearly show that the color image reference method leads to near-perfect color reproduction, with an average Delta E score of 0.90, a value generally considered imperceptible to the human eye. This highlights Gemini’s ability to match colors with remarkable precision, ensuring high-fidelity color replication across the entire color spectrum.</p><p>When it comes to selecting the right approach for achieving accurate color reproduction, text-only prompts may be suitable for quick, creative generation tasks. However, for more professional projects or scenarios requiring brand-accurate color replication, leveraging a color image reference with Gemini 2.5 Flash Image can unlock the model’s full potential, delivering precise color matching and ensuring high-quality, accurate color results.</p><h3>Appendix</h3><ol><li><em>For complete results, further exploration, or reproducing the results, see the complete code used for this blog </em><a href="https://github.com/WafaeBakkali/gemini-color-adherence-study"><em>on GitHub</em></a><em>.</em></li><li><em>For those interested in further exploring Gemini 2.5 Flash Image and its capabilities, you can try the model on </em><a href="https://aistudio.google.com/prompts/new_chat?model=gemini-2.5-flash-preview-image&amp;utm_source=deepmind.google&amp;utm_medium=referral&amp;utm_campaign=gdm&amp;utm_content="><em>Google AI Studio </em></a><em>or refer to the </em><a href="https://ai.google.dev/gemini-api/docs/image-generation"><em>official documentation</em></a><em> for deeper insights.</em></li></ol><blockquote><em>📜</em><strong><em>About the author</em></strong></blockquote><blockquote><em>Dr. Wafae Bakkali is a Staff Generative AI Specialist, Blackbelt at Google. With over 13 years of experience, she has a proven track record of combining deep technical expertise and leadership with strategic business insights to drive impactful outcomes. Through her current role at Google and former roles at reputable organizations such as AWS, Dr. Bakkali has successfully guided organizations across various industries in adopting and building AI solutions.</em></blockquote><blockquote><em>She holds a PhD from IMT Atlantique, France, and served as a postdoctoral researcher at Centrale Supélec, Paris-Saclay University, France.</em></blockquote><blockquote><em>Dr. Bakkali is also an active contributor to the AI community. She regularly shares her expertise as a speaker at international tech conferences and mentors participants in AI hackathons, tech, and startup events.</em></blockquote><p>🔗Connect with me on LinkedIn: <a href="https://www.linkedin.com/in/wafae-bakkali/">https://www.linkedin.com/in/wafae-bakkali/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9d48c06d9e41" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/color-code-adherence-in-ai-image-generation-a-case-study-with-gemini-9d48c06d9e41">Color Code Adherence in AI Image Generation: A Case Study with Gemini</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Veo 3: A Detailed Prompting Guide]]></title>
            <link>https://medium.com/google-cloud/veo-3-a-detailed-prompting-guide-867985b46018?source=rss-63974cf5734d------2</link>
            <guid isPermaLink="false">https://medium.com/p/867985b46018</guid>
            <category><![CDATA[video-generation]]></category>
            <category><![CDATA[veo]]></category>
            <category><![CDATA[prompt-engineering]]></category>
            <category><![CDATA[generative-ai-tools]]></category>
            <category><![CDATA[google-ai]]></category>
            <dc:creator><![CDATA[Dr. Wafae Bakkali]]></dc:creator>
            <pubDate>Wed, 25 Jun 2025 08:09:45 GMT</pubDate>
            <atom:updated>2025-12-18T00:50:24.485Z</atom:updated>
            <content:encoded><![CDATA[<p>Master video generation with expert-level prompting techniques using Google’s Veo 3</p><h3>Introduction</h3><p><a href="https://deepmind.google/models/veo/">Veo 3</a> is Google’s most advanced Artificial Intelligence (AI) video generation model to date. It creates high-quality videos from text or images and can even generate synchronized audio from a single prompt. As one of the most powerful generative video models available today, Veo 3 unlocks new creative possibilities for filmmakers, marketers, and content creators.</p><p>Creating compelling videos with generative AI requires thoughtful prompting. This requires a different approach than prompting a large language model.</p><p>In this guide:</p><ul><li>We share experimentation-based prompting guidance for Veo 3.</li><li>You will learn how to structure effective prompts for Veo 3, apply best practices for video generation and avoid common pitfalls even without prior experience in AI or video production.</li></ul><h3>The Anatomy of a Veo 3 Prompt</h3><p>Creating a great Veo 3 prompt is different from prompting a chatbot. It’s about using the right terminology and prompt structure. Breaking your creative idea down into key components is the most effective way to guide Veo 3 toward your desired outcome.</p><p>Figure 1, below, illustrates this structure, outlining the nine core elements of an expert-level prompt. These elements represent the key building blocks you may use when crafting your prompt. However, it’s important to note that you don’t need to include all of them in every prompt. The right combination depends on your specific goals.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wRWFNX7ZNDmQfjNRUvkt0Q.png" /><figcaption><strong>[Image by author]</strong> Figure 1. The anatomy of a Veo 3 prompt</figcaption></figure><p>In the following sections, we will break down each of the nine elements in detail, sharing supported options and examples to help you apply them effectively in your Veo 3 prompts.</p><h4>1- Subject</h4><p>Common options for the subject include, but are not limited to:</p><ul><li><strong>People:</strong> Man, woman, elderly person, specific professions (e.g., “a seasoned detective”, “a joyful baker”, “a futuristic astronaut”), historical figures, mythical beings (e.g., “a mischievous fairy”, “a stoic knight”).</li><li><strong>Animals:</strong> Specific breeds (e.g., “a playful Golden Retriever puppy”, “a majestic bald eagle”, “a sleek black panther”), fantastical creatures (e.g., “a miniature dragon with iridescent scales”, “a wise, ancient talking tree”).</li><li><strong>Objects:</strong> Everyday items (e.g., “a vintage typewriter”, “a steaming cup of coffee”, “a worn leather-bound book”), vehicles (e.g., “a classic 1960s muscle car”, “a futuristic hovercraft”, “a weathered pirate ship”), abstract shapes (“glowing orbs”, “crystalline structures”).</li><li><strong>Multiple Subjects:</strong> You can combine people, animals, objects, or any mix of them in the same video (e.g., “A group of diverse friends laughing around a campfire while a curious fox watches from the shadows”, “a busy marketplace scene with vendors and shoppers”).</li></ul><p><strong>Example: complex details with multiple subjects</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FGKOpOcs8IF8%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DGKOpOcs8IF8&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FGKOpOcs8IF8%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/f1faab46460bc549aeb0f6c42217f438/href">https://medium.com/media/f1faab46460bc549aeb0f6c42217f438/href</a></iframe><h4>2- Action</h4><p>Actions can include, but are not limited to, the following examples:</p><ul><li><strong>Basic Movements:</strong> e.g., Walking, running, jumping, flying, swimming, dancing, spinning, falling, standing still, sitting.</li><li><strong>Interactions:</strong> e.g., Talking, laughing, arguing, hugging, fighting, playing a game, cooking, building, writing, reading, observing.</li><li><strong>Emotional Expressions:</strong> e.g., Smiling, frowning, looking surprised, concentrating deeply, appearing thoughtful, showing excitement, crying.</li><li><strong>Subtle Actions:</strong> e.g., A gentle breeze ruffling hair, leaves rustling, a subtle nod, fingers tapping impatiently, eyes blinking slowly.</li><li><strong>Transformations/Processes:</strong> e.g., A flower blooming in fast-motion, ice melting, a city skyline developing over time (though keep clip length in mind).</li></ul><p><strong>Example: Directing a story by sequencing actions and emotional changes</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FEbCAqMF2DBo%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DEbCAqMF2DBo&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FEbCAqMF2DBo%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/057adb0e28ed9968cc84acc4a0283aa1/href">https://medium.com/media/057adb0e28ed9968cc84acc4a0283aa1/href</a></iframe><h4>3- Scene / context</h4><p>The most common options for the scene include:</p><ul><li><strong>Location (Interior):</strong> e.g., A cozy living room with a crackling fireplace, a sterile futuristic laboratory, a cluttered artist’s studio, a grand ballroom, a dusty attic.</li><li><strong>Location (Exterior):</strong> e.g., A sun-drenched tropical beach, a misty ancient forest, a bustling futuristic cityscape at night, a serene mountain peak at dawn, a desolate alien planet.</li><li><strong>Time of Day:</strong> e.g., Golden hour, midday sun, twilight, deep night, pre-dawn.</li><li><strong>Weather:</strong> e.g., Clear blue sky, overcast and gloomy, light drizzle, heavy thunderstorm with visible lightning, gentle snowfall, swirling fog.</li><li><strong>Historical/Fantastical Period:</strong> e.g., A medieval castle courtyard, a roaring 1920s jazz club, a cyberpunk alleyway, an enchanted forest glade.</li><li><strong>Atmospheric Details:</strong> e.g., Floating dust motes in a sunbeam, shimmering heat haze, reflections on wet pavement, leaves scattered by the wind.</li></ul><p><strong>Example:</strong> <strong>Building an immersive world</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FbIZwAvnXkbY%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DbIZwAvnXkbY&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FbIZwAvnXkbY%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/b4db4fbec7791203845b29cde2c8e0d1/href">https://medium.com/media/b4db4fbec7791203845b29cde2c8e0d1/href</a></iframe><h4>4- Camera angles</h4><p>Here are some of the most common camera angles and the effects they typically create:</p><ul><li><strong>Eye-Level Shot:</strong> Offers a neutral, common perspective, as if viewed from human height. “Eye-level shot of a woman sipping tea.”</li><li><strong>Low-Angle Shot:</strong> Positions the camera below the subject, looking up, making the subject appear powerful or imposing. “Low-angle tracking shot of a superhero landing.”</li><li><strong>High-Angle Shot:</strong> Places the camera above the subject, looking down, which can make the subject seem small, vulnerable, or part of a larger pattern. “High-angle shot of a child lost in a crowd.”</li><li><strong>Bird’s-Eye View / Top-Down Shot:</strong> A shot taken directly from above, offering a map-like perspective of the scene. “Bird’s-eye view of a bustling city intersection.”</li><li><strong>Worm’s-Eye View:</strong> A very low-angle shot looking straight up from the ground, emphasizing height and grandeur. “Worm’s-eye view of towering skyscrapers.”</li><li><strong>Dutch Angle / Canted Angle:</strong> The camera is tilted to one side, creating a skewed horizon line, often used to convey unease, disorientation, or dynamism. “Dutch angle shot of a character running down a hallway.”</li><li><strong>Close-Up:</strong> Frames a subject tightly, typically focusing on a face to emphasize emotions or a specific detail. “Close-up of a character’s determined eyes.”</li><li><strong>Extreme Close-Up:</strong> Isolates a very small detail of the subject, such as an eye or a drop of water. “Extreme close-up of a drop of water landing on a leaf.”</li><li><strong>Medium Shot:</strong> Shows the subject from approximately the waist up, balancing detail with some environmental context, common for dialogue. “Medium shot of two people conversing.”</li><li><strong>Full Shot / Long Shot:</strong> Shows the entire subject from head to toe, with some of the surrounding environment visible. “Full shot of a dancer performing.”</li><li><strong>Wide Shot / Establishing Shot:</strong> Shows the subject within their broad environment, often used to establish location and context at the beginning of a sequence. “Wide shot of a lone cabin in a snowy landscape.”</li><li><strong>Over-the-Shoulder Shot:</strong> Frames the shot from behind one person, looking over their shoulder at another person or object, common in conversations. “Over-the-shoulder shot during a tense negotiation.”</li><li><strong>Point-of-View Shot:</strong> Shows the scene from the direct visual perspective of a character, as if the audience is seeing through their eyes. “POV shot as someone rides a rollercoaster.”</li></ul><p><strong>Example: Bird’s-eye view</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FryXetoIo0nQ%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DryXetoIo0nQ&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FryXetoIo0nQ%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/e94d4310c0269ade68c3a847f43bffe3/href">https://medium.com/media/e94d4310c0269ade68c3a847f43bffe3/href</a></iframe><p><strong>Example: Extreme close-up</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FllpdGtooh4c%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DllpdGtooh4c&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FllpdGtooh4c%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/ebd7ee64b3ee672d7887f4c05eb62921/href">https://medium.com/media/ebd7ee64b3ee672d7887f4c05eb62921/href</a></iframe><p><strong>5- Camera movements</strong></p><p>Here are some of the most common camera movements you can use in your prompts:</p><ul><li><strong>Static Shot (or fixed):</strong> The camera remains completely still; there is no movement. “Static shot of a serene landscape.”</li><li><strong>Pan (left/right):</strong> The camera rotates horizontally left or right from a fixed position. “Slow pan left across a city skyline at dusk.”</li><li><strong>Tilt (up/down):</strong> The camera rotates vertically up or down from a fixed position. “Tilt down from the character’s shocked face to the revealing letter in their hands.”</li><li><strong>Dolly (In/Out):</strong> The camera physically moves closer to the subject or further away. “Dolly out from the character to emphasize their isolation.”</li><li><strong>Truck (Left/Right):</strong> The camera physically moves horizontally (sideways) left or right, often parallel to the subject or scene. “Truck right, following a character as they walk along a busy sidewalk.”</li><li><strong>Pedestal (Up/Down):</strong> The camera physically moves vertically up or down while maintaining a level perspective. “Pedestal up to reveal the full height of an ancient, towering tree.”</li><li><strong>Zoom (In/Out):</strong> The camera’s lens changes its focal length to magnify or de-magnify the subject. This is different from a dolly, as the camera itself does not move. “Slow zoom in on a mysterious artifact on a table.”</li><li><strong>Crane Shot:</strong> The camera is mounted on a crane and moves vertically (up or down) or in sweeping arcs, often used for dramatic reveals or high-angle perspectives. “Crane shot revealing a vast medieval battlefield.”</li><li><strong>Aerial Shot / Drone Shot:</strong> A shot taken from a high altitude, typically using an aircraft or drone, often involving smooth, flying movements. “Sweeping aerial drone shot flying over a tropical island chain.”</li><li><strong>Handheld / Shaky Cam:</strong> The camera is held by the operator, resulting in less stable, often jerky movements that can convey realism, immediacy, or unease. “Handheld camera shot during a chaotic marketplace chase.”</li><li><strong>Whip Pan:</strong> An extremely fast pan that blurs the image, often used as a transition or to convey rapid movement or disorientation. “Whip pan from one arguing character to another.”</li><li><strong>Arc Shot:</strong> The camera moves in a circular or semi-circular path around the subject. “Arc shot around a couple embracing in the rain.”</li></ul><p><strong>Example: Zoom-in shot</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2Fizn8VHHFy3c%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3Dizn8VHHFy3c&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2Fizn8VHHFy3c%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/044c9e0bdd9affa3fda8f19db53b5e70/href">https://medium.com/media/044c9e0bdd9affa3fda8f19db53b5e70/href</a></iframe><p><strong>Example: Aerial drone shot</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FgvPtt5f-kKc%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DgvPtt5f-kKc&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FgvPtt5f-kKc%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/7aa449241c48b55aeb92b539bf4be5f0/href">https://medium.com/media/7aa449241c48b55aeb92b539bf4be5f0/href</a></iframe><h4>6- Lens and optical effects</h4><p>Here are some common lenses and optical effects you can use to enhance your video:</p><ul><li><strong>Wide-Angle Lens (e.g., “18mm lens,” “24mm lens”):</strong> Captures a broader field of view than a standard lens. It can exaggerate perspective, making foreground elements appear larger and creating a sense of grand scale or, at closer distances, distortion. “Wide-angle lens shot of a grand cathedral interior, emphasizing its soaring arches.”</li><li><strong>Telephoto Lens (e.g., “85mm lens,” “200mm lens”):</strong> Narrows the field of view and compresses perspective, making distant subjects appear closer and often isolating the subject by creating a shallow depth of field. “Telephoto lens shot capturing a distant eagle in flight against a mountain range.”</li><li><strong>Shallow Depth of Field / Bokeh:</strong> An optical effect where only a narrow plane of the image is in sharp focus, while the foreground and/or background are blurred. The aesthetic quality of this blur is known as ‘bokeh’. “Portrait of a man with a shallow depth of field, their face sharp against a softly blurred park background with beautiful bokeh.”</li><li><strong>Deep Depth of Field:</strong> Keeps most or all of the image, from foreground to background, in sharp focus. “Landscape scene with deep depth of field, showing sharp detail from the wildflowers in the immediate foreground to the distant mountains.”</li><li><strong>Lens Flare:</strong> An effect created when a bright light source directly strikes the camera lens, causing streaks, starbursts, or circles of light to appear in the image. Often used for dramatic or cinematic effect. “Cinematic lens flare as the sun dips below the horizon behind a silhouetted couple.”</li><li><strong>Rack Focus:</strong> The technique of shifting the focus of the lens from one subject or plane of depth to another within a single, continuous shot. “Rack focus from a character’s thoughtful face in the foreground to a significant photograph on the wall behind them.”</li><li><strong>Fisheye Lens Effect:</strong> An ultra-wide-angle lens that produces extreme barrel distortion, creating a circular or strongly convex, wide panoramic image. “Fisheye lens view from inside a car, capturing the driver and the entire curved dashboard and windscreen.”</li><li><strong>Vertigo Effect (Dolly Zoom):</strong> A camera effect achieved by dollying the camera towards or away from a subject while simultaneously zooming the lens in the opposite direction. This keeps the subject roughly the same size in the frame, but the background perspective changes dramatically, often conveying disorientation or unease. “Vertigo effect (dolly zoom) on a character standing at the edge of a cliff, the background rushing away.</li></ul><p><strong>Example: Shallow Depth of Field</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FOl66pK2N7L0%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DOl66pK2N7L0&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FOl66pK2N7L0%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/bf95a5f557b6a3cb737d6091f37805ed/href">https://medium.com/media/bf95a5f557b6a3cb737d6091f37805ed/href</a></iframe><p><strong>Example: Rack focus shot</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2F-p6W4mCYuvc%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3D-p6W4mCYuvc&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2F-p6W4mCYuvc%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/2ae61c27a0f5547bbb238829d2ffafc5/href">https://medium.com/media/2ae61c27a0f5547bbb238829d2ffafc5/href</a></iframe><h4>7- Visual style &amp; aesthetics</h4><p>This broad category can be broken down into four key components:</p><p><strong>7.1. Lighting:</strong></p><ul><li><strong>Natural Light:</strong> “Soft morning sunlight streaming through a window,” “Overcast daylight”, “Moonlight.”</li><li><strong>Artificial Light:</strong> “Warm glow of a fireplace”, “Flickering candlelight,” “Harsh fluorescent office lighting”, “Pulsating neon signs.”</li><li><strong>Cinematic Lighting:</strong> “Rembrandt lighting on a portrait”, “Film noir style with deep shadows and stark highlights”, “High-key lighting for a bright, cheerful scene”, “Low-key lighting for a dark, mysterious mood.”</li><li><strong>Specific Effects:</strong> “Volumetric lighting creating visible light rays”, “Backlighting to create a silhouette”, “Golden hour glow”, “Dramatic side lighting.”</li></ul><p><strong>7.2. Tone / Mood</strong></p><ul><li><strong>Happy/Joyful:</strong> Bright, vibrant, cheerful, uplifting, whimsical.</li><li><strong>Sad/Melancholy:</strong> Somber, muted colors, slow pace, poignant, wistful.</li><li><strong>Suspenseful/Tense:</strong> Dark, shadowy, quick cuts (if implying edit), sense of unease, thrilling.</li><li><strong>Peaceful/Serene:</strong> Calm, tranquil, soft, gentle, meditative.</li><li><strong>Epic/Grandiose:</strong> Sweeping, majestic, dramatic, awe-inspiring.</li><li><strong>Futuristic/Sci-Fi:</strong> Sleek, metallic, neon, technological, dystopian, utopian.</li><li><strong>Vintage/Retro:</strong> Sepia tone, grainy film, specific era aesthetics (e.g., “1950s Americana”, “1980s vaporwave”).</li><li><strong>Romantic:</strong> Soft focus, warm colors, intimate.</li><li><strong>Horror:</strong> Dark, unsettling, eerie, gory (though be mindful of content filters).</li></ul><p><strong>7.3. Artistic style</strong></p><ul><li><strong>Photorealistic: </strong>“Ultra-realistic rendering”, “Shot on 8K camera.”</li><li><strong>Cinematic: </strong>“Cinematic film look”, “Shot on 35mm film”, “Anamorphic widescreen.”</li><li><strong>Animation Styles: </strong>“Japanese anime style”, “Classic Disney animation style,” “Pixar-like 3D animation”, “Claymation style”, “Stop-motion animation”, “Cel-shaded animation.”</li><li><strong>Art Movements/Artists: </strong>“In the style of Van Gogh”, “Surrealist painting,” “Impressionistic”, “Art Deco design”, “Bauhaus aesthetic.”</li><li><strong>Specific Looks: </strong>“Gritty graphic novel illustration”, “Watercolor painting coming to life”, “Charcoal sketch animation”, “Blueprint schematic style.</li></ul><p><strong>7.4. Ambiance</strong></p><ul><li><strong>Color Palettes:</strong> “Monochromatic black and white”, “Vibrant and saturated tropical colors”, “Muted earthy tones”, “Cool blue and silver futuristic palette”, “Warm autumnal oranges and browns.”</li><li><strong>Atmospheric Effects:</strong> “Thick fog rolling across a moor”, “Swirling desert sands”, “Gentle falling snow creating a soft blanket”, “Heat haze shimmering above asphalt”, “Magical glowing particles in the air”, “Subsurface scattering on a translucent object.”</li><li><strong>Textural Qualities:</strong> “Rough-hewn stone walls”, “Smooth, polished chrome surfaces”, “Soft, velvety fabric”, “Dewdrops clinging to a spiderweb.”</li></ul><p><strong>Example: Animation style</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2Fvu2ZFw-9ZMI%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3Dvu2ZFw-9ZMI&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2Fvu2ZFw-9ZMI%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/c0303eb5f0933e715cb1f1248586c988/href">https://medium.com/media/c0303eb5f0933e715cb1f1248586c988/href</a></iframe><p><strong>Example: Vintage style</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FWJwj6y7p8SI%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DWJwj6y7p8SI&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FWJwj6y7p8SI%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/e1ca4340ea31bb43ae9ba085dafaf342/href">https://medium.com/media/e1ca4340ea31bb43ae9ba085dafaf342/href</a></iframe><h4>8- Temporal elements</h4><p>Common temporal elements you can specify include:</p><ul><li><strong>Pacing: </strong>“Slow-motion”, “Fast-paced action”, “Time-lapse”.</li><li><strong>Evolution (subtle for short clips):</strong> “A flower bud slowly unfurling”, “A candle burning down slightly”, “Dawn breaking, the sky gradually lightening.”</li><li><strong>Rhythm:</strong> “Pulsating light”, “Rhythmic movement.”</li></ul><p><strong>Example: Evolution</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DSNt_G9EjPE8&amp;type=text%2Fhtml&amp;schema=youtube&amp;display_name=YouTube&amp;src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FSNt_G9EjPE8%3Ffeature%3Doembed" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/2ddfbc0312e31f6ec71699c3ae9090f8/href">https://medium.com/media/2ddfbc0312e31f6ec71699c3ae9090f8/href</a></iframe><p><strong>Example: Time-lapse</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FCT0PIze9w0Y%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DCT0PIze9w0Y&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FCT0PIze9w0Y%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/851c498145fbb8fbc6cf3e231809a92d/href">https://medium.com/media/851c498145fbb8fbc6cf3e231809a92d/href</a></iframe><p><strong>9- Audio</strong></p><p>Common audio elements you can describe in your prompt include:</p><ul><li><strong>Sound Effects: </strong>Individual, distinct sounds that occur within the scene (e.g., “the sound of a phone ringing”, “water splashing in the background”, “soft house sounds, the creak of a closet door, and a ticking clock” ).</li><li><strong>Ambient Noise: </strong>The general background noise that makes a location feel real (e.g., “the sounds of city traffic and distant sirens”, “waves crashing on the shore”, “the quiet hum of an office” ).</li><li><strong>Dialogue: </strong>Spoken words from characters or a narrator (e.g., “The man in the red hat says: ‘Where is the rabbit?’”, “A voiceover with a polished British accent speaks in a serious, urgent tone”, “Two people discuss a movie” ).</li></ul><p><strong>Example: Dialogue</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FyGcMvkFK9Zo%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DyGcMvkFK9Zo&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FyGcMvkFK9Zo%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/84c3f0322c6294dae92cca4fda2bc74a/href">https://medium.com/media/84c3f0322c6294dae92cca4fda2bc74a/href</a></iframe><h3>Tips and best practices</h3><p>Beyond understanding the individual components, here are some best practices to help you combine them effectively and refine your results.</p><h4><strong>1- Use advanced cinematic language</strong></h4><p>While we’ve covered basic camera moves, you can suggest more advanced cinematic language in your prompts. Try incorporating terms for editing styles and specific techniques. Consider using terms like: “match cut”, “jump cut”, “establishing shot sequence”, “montage (of brief, related actions)”, “split diopter effect”.</p><p><strong>Example: Jump cut</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2Fd-cGj3kAnsQ%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3Dd-cGj3kAnsQ&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2Fd-cGj3kAnsQ%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/b10eb47a593eebbe3878a42ce20f8b94/href">https://medium.com/media/b10eb47a593eebbe3878a42ce20f8b94/href</a></iframe><h4>2- <strong>Use clear and specific language</strong></h4><p>For instance, instead of a confusing description like the one below:</p><ul><li><strong>Potentially confusing:</strong> “I envision a scene where, like, the main focus, a dude, is kinda sad, and it’s like, dark, and the camera is sort of, from below, you know?”</li></ul><p>Provide a clear and direct prompt that eliminates ambiguity:</p><ul><li><strong>Clear and direct:</strong> “Low-angle close-up shot of a man with a somber expression. The scene is dimly lit, conveying a melancholic mood.”</li></ul><h4><strong>3- Pro tip for dialogue: How to avoid unwanted subtitles</strong></h4><p>To ensure your dialogue is spoken by the character without appearing as <strong>subtitles</strong>, use only a colon<strong> (</strong><strong>:)</strong> after the speaker&#39;s action. Avoid using quotation marks (&quot; &quot;), as the model may interpret them as text to display visually.</p><ul><li><strong>DO:</strong> A women says: My name is Clara</li><li><strong>Don’t</strong>: A women says: “My name is Clara”</li></ul><h4>4- <strong>Maximize impact with multiple orientations</strong></h4><p>To ensure your video performs effectively on all platforms, consider generating it in multiple aspect ratios. Different platforms are optimized for different shapes, and creating versions for each is especially critical for professional use cases like marketing and advertising.</p><p>Here are the key aspect ratios and their primary uses:</p><ul><li><strong>16:9 (Landscape):</strong> The standard for YouTube, presentations, and most traditional video displays.</li><li><strong>9:16 (Portrait/Vertical):</strong> Essential for mobile-first platforms like TikTok, Instagram Reels, and YouTube Shorts.</li></ul><h4><strong>5- Focus on a single scene</strong></h4><p>For the best results, dedicate each prompt to a single, focused moment. Trying to chain multiple distinct events (A then B then C) in one prompt for a short clip often leads to muddled or incomplete videos.</p><p>Instead of one complex prompt:</p><p><em>“A detective finds a clue in a library, then drives across the city at night, and then confronts a suspect in a warehouse.”</em></p><p>Generate each part as a separate clip:</p><ul><li><strong>Clip 1:</strong> “<em>Close-up on a detective’s gloved hand brushing dust off an old book in a dark library, revealing a hidden symbol.</em>”</li><li><strong>Clip 2:</strong> “<em>A car driving through a neon-lit city at night, with rain streaking across the windshield, in a film noir style.</em>”</li><li><strong>Clip 3:</strong> “<em>Inside a shadowy warehouse, a detective stands opposite a silhouetted figure, creating a tense atmosphere.</em>”</li></ul><h4><strong>6- Enhance Your Workflow with Gemini</strong></h4><p>Gemini can be a powerful partner throughout your entire video creation process, from ideation to evaluation.</p><p><strong>Before Creation: Use Gemini as an expert prompter</strong></p><p>Instead of starting from scratch, you can ask Gemini to act as an expert prompter. Have it refine your basic ideas into detailed, veo-ready prompts. You can give it an instruction like this:</p><p><strong>Example prompt for Gemini:</strong><em> “</em>Act as an expert prompter for a generative AI video generation model. Look at this image, and write a prompt that &lt;instruction&gt;. Ensure your prompt is comprehensive and detailed.<em>”</em></p><p><strong>After Creation: Use Gemini as a “Second pair of eyes”</strong></p><p>Once your video is generated, Gemini can evaluate the final output, check it against company or brand guidelines, and flag any potentially problematic areas that may require human review.</p><h4><strong>7- (Image to video) Use a high-quality source image</strong></h4><p>When using the image-to-video feature, the quality of your source image is paramount. Veo uses this image as the foundational blueprint for everything that follows, including character detail, lighting, and overall artistic style.</p><p>A sharp, clear, and well-composed photograph will always yield a more coherent and higher-quality video. Think of your source image as the first frame of your film, the stronger the start, the better the finish.</p><h4><strong>8- (Image to video) Prompt for motion only</strong></h4><p>This is the most important principle of Image-to-Video. Your source image already provides the subject, scene, and style. Your text prompt should <em>only</em> describe the <strong>motion</strong> you want to see.</p><ul><li><strong>DO:</strong> Prompt for camera movement, subject animation, and environmental changes.</li><li><strong>DON’T:</strong> Re-describe the character, the background, or the lighting. Redundant prompts confuse the model and lead to poor results.</li></ul><p><strong>Pro Tip: </strong>In your motion prompt, refer to the character with general terms like “the subject”, “the woman” or “he/she.”</p><h4><strong>9- (Image to video) Three ways to animate your image</strong></h4><p>You can direct three types of movement, either alone or in combination.</p><p><strong>Camera Motion:</strong> The camera moves, but the scene is static. This is the simplest and most reliable way to add dynamism.</p><ul><li><em>Example:</em> “Slow dolly in on the subject.”</li></ul><p><strong>Subject Animation:</strong> The main character or object moves. Best for subtle, lifelike actions.</p><ul><li><em>Example:</em> “The character’s hair and clothes flutter gently in the wind.”</li></ul><p><strong>Environmental Animation:</strong> The background or atmosphere comes alive.</p><ul><li><em>Example:</em> “Fog rolls in slowly across the landscape.”</li></ul><p><strong>Example: Subject animation</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oK07FRcPt2fPAA_QHopesA.jpeg" /><figcaption><strong>[[Image by author, generated by Imagen 4] </strong>Input Image</figcaption></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FMcOgmOGs6N0%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DMcOgmOGs6N0&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FMcOgmOGs6N0%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/51d734d27ff4f3aef853f33e29ae0359/href">https://medium.com/media/51d734d27ff4f3aef853f33e29ae0359/href</a></iframe><h4>10- How to achieve character and voice consistency</h4><p>When creating long videos, character and voice consistency is key. Follow these steps to maintain the best level of coherence throughout your scenes:</p><ul><li><strong>Create a detailed character description:</strong> Your description is the foundation for consistency. To ensure reusability and voice consistency, build out the description for your character with a rich set of unchangeable features: physical build and age, hair color and style, facial structure, eye color and shape, any defining marks and a voice style. You can use Gemini to generate an exhaustive verbal description of your character’s facial features.</li><li><strong>Apply the description consistently:</strong> Copy and paste the entire, unchanged character description into your prompt for every new scene. Only modify the parts that describe the new action or setting. To speed up your workflow, you can also use Gemini as a scene generator. Provide it with your final character description and ask it to generate multiple scene prompts for you.</li><li><strong>Use the same seed parameter:</strong> Seed numbers are numerical values that control the randomness in the AI’s generation process. Using the same seed with the same prompt will likely generate very similar outputs, while altering the seed can lead to variations. For specific details on how to integrate the seed parameter, refer to the <a href="https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/veo-video-generation">VEO API specification</a>.</li></ul><p><strong>Example: Character and voice consistency</strong></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FTZ8go3Q7Sqo%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DTZ8go3Q7Sqo&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FTZ8go3Q7Sqo%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/833a289bcbcdb01064867661bad8476b/href">https://medium.com/media/833a289bcbcdb01064867661bad8476b/href</a></iframe><h3>Conclusion</h3><p>This guide shares experimentation-based best practices for structuring prompts, helping you create compelling videos with Veo 3 and bring your creative concepts to life.</p><p>As you create, keep in mind that Veo applies safety filters across <a href="https://cloud.google.com/vertex-ai?utm_source=google&amp;utm_medium=cpc&amp;utm_campaign=emea-fr-all-en-dr-skws-all-all-trial-e-gcp-1707574&amp;utm_content=text-ad-none-any-DEV_c-CRE_759193215965-ADGP_Hybrid+%7C+SKWS+-+MIX+%7C+Txt+-+AI+And+Machine+Learning+-+Vertex+AI-KWID_43700082188297470-kwd-553582750299-userloc_9056504&amp;utm_term=KW_vertex+ai-NET_g-PLAC_&amp;&amp;gad_source=1&amp;gad_campaignid=19982419621&amp;gclid=CjwKCAjwmenCBhA4EiwAtVjzmin55N7eozO45rMjB56BU7zRcBbt-WkRY-ReZMLoqck-fNSlMT0wwRoC-AwQAvD_BwE&amp;gclsrc=aw.ds&amp;hl=en">Vertex AI</a> to help ensure that generated videos and uploaded photos don’t contain offensive content. For example, prompts that violate <a href="https://cloud.google.com/vertex-ai/generative-ai/docs/learn/responsible-ai">responsible AI guidelines</a> are blocked.</p><h4>Acknowledgments</h4><p>The author would like to thank <a href="https://medium.com/u/24c4b96c21c5">G. Hussain Chinoy</a> for their earlier work that inspired this post, and feedback on this guidance.</p><blockquote><em>📜</em><strong>About the author</strong></blockquote><blockquote>Dr. Wafae Bakkali is a Staff Generative AI Specialist, Blackbelt at Google. With over 12 years of experience, she has a proven track record of combining deep technical expertise and leadership with strategic business insights to drive impactful outcomes. Through her current role at Google and former roles at reputable organizations such as AWS, Dr. Bakkali has successfully guided organizations across various industries in adopting and building AI solutions.</blockquote><blockquote>She holds a PhD from IMT Atlantique, France, and served as a postdoctoral researcher at Centrale Supélec, Paris-Saclay University, France.</blockquote><blockquote>Dr. Bakkali is also an active contributor to the AI community. She regularly shares her expertise as a speaker at international tech conferences and mentors participants in AI hackathons, tech, and startup events.</blockquote><p>🔗Connect with me on LinkedIn: <a href="https://www.linkedin.com/in/wafae-bakkali/">https://www.linkedin.com/in/wafae-bakkali/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=867985b46018" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/veo-3-a-detailed-prompting-guide-867985b46018">Veo 3: A Detailed Prompting Guide</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Speech-to-Speech Generative AI: From Theory to Practice]]></title>
            <link>https://medium.com/google-cloud/speech-to-speech-generative-ai-from-theory-to-practice-bc6701f34549?source=rss-63974cf5734d------2</link>
            <guid isPermaLink="false">https://medium.com/p/bc6701f34549</guid>
            <category><![CDATA[multimodal]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[generative-ai]]></category>
            <category><![CDATA[multimodal-ai]]></category>
            <category><![CDATA[speech-to-speech]]></category>
            <dc:creator><![CDATA[Dr. Wafae Bakkali]]></dc:creator>
            <pubDate>Tue, 07 Jan 2025 07:30:42 GMT</pubDate>
            <atom:updated>2025-09-20T19:31:49.772Z</atom:updated>
            <content:encoded><![CDATA[<p><em>Explore the world of speech-to-speech generative AI. Learn key components and practical considerations to build your applications</em></p><h3>Introduction</h3><p>Generative AI is one of the most transformative, rapidly evolving, and widely adopted technologies today. A key reason for its impact is its ability to enable humans to communicate with computers using natural language, making interactions easy and intuitive. This ability has facilitated its adoption in our daily lives and across multiple industries, spanning sectors from education and healthcare to entertainment.</p><p>The way we interact started with text, powered by large language models (LLMs). Now, to further bridge the gap between human and machine communication, the natural evolution is moving beyond writing to speaking. This is driving a growing focus in research on multimodal generative AI, which refers to systems capable of processing and generating multiple forms of data (modalities), such as text, speech, and images.</p><p>In this post, we focus on speech-to-speech models, which are generative AI models designed to process spoken input and respond in real-time with natural, human-like speech, opening new possibilities for technological innovation and applications.</p><p>Here’s what we’ll explore:</p><ul><li><strong>Under the Hood:</strong> Key components of speech-to-speech generative AI models.</li><li><strong>Real-World Applications:</strong> Use cases, capabilities and best practices for building with speech-to-speech generative AI models.</li><li><strong>Measuring Success:</strong> Essential evaluation metrics for these systems.</li></ul><h3><strong>Overview</strong></h3><p>Given the wide availability of LLMs trained on massive text datasets and the challenges associated with collecting and annotating large amounts of speech data, the natural approach to building speech-to-speech generative AI systems has been to leverage these LLMs and adapt them for spoken interactions. Broadly speaking, this adaptation of LLMs for speech has been done in two main approaches: using a pipeline of cascaded independent modules or employing an end-to-end speech large language model that directly handles the speech modality. In this post, we will refer to these approaches as <strong>cascaded</strong> and <strong>end-to-end speech-to-speech systems</strong>. Figure 1 illustrates these two approaches.</p><blockquote>📜 <strong>N.B: </strong>The discussion throughout this post focuses on decoder-only (autoregressive) transformer architectures, as they are representative of the majority of current LLMs and speech-to-speech models.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CQUU2HMtpF2y1_QcKBJ-Hg.png" /><figcaption><strong>[Image by author] </strong>Figure 1. Cascaded vs. end-to-end speech-to-speech systems</figcaption></figure><h4>1- Cascaded speech-to-speech systems</h4><p>Cascaded systems operate as a pipeline, with processing handled by independent modules. The main components include <strong>Automatic Speech Recognition (ASR)</strong> to transcribe the spoken input into text, an <strong>LLM</strong> to process and generate text responses, and <strong>Text-to-Speech (TTS)</strong> to convert the generated text back into speech. <a href="https://arxiv.org/pdf/2304.12995">AudioGPT</a> is an example of a cascaded speech-to-speech system.</p><p>Despite its modularity, the reliance on separate modules in cascaded systems can introduce latency making real-time conversation challenging. Additionally, relying on intermediate text representations can sometimes lose nuances in the original speech, such as emotion or tone.</p><h4>2- End-to-end speech-to-speech models</h4><p>In contrast, end-to-end speech-to-speech models are capable of handling the speech modality by directly extracting information from speech inputs and generating speech representations without relying on intermediate text representation. End-to-end systems offer a more integrated approach, often resulting in lower latency and a more natural conversational flow.</p><p>It’s worth noting that there are also hybrid approaches, where some cascaded systems skip the ASR module by handling input speech directly but still need the TTS module, such as <a href="https://arxiv.org/abs/2407.10759">Qwen2-Audio</a> or <a href="https://arxiv.org/abs/2408.05211">VITA</a>. The choice between cascaded and end-to-end systems depend on the specific needs and constraints of the real-world application.</p><p>As current research primarily focuses on end-to-end models, we will emphasize them in this post. In the next section, we will discuss the key components of end-to-end speech-to-speech models.</p><h4>2.1- Key components of end-to-end speech-to speech models</h4><p>There are three main components within an end-to-end speech-to-speech model, namely the <strong>speech encoder</strong>, the <strong>LLM</strong> (decoder-only transformer), and the <strong>vocoder</strong>, as illustrated in Figure 1.</p><p>Specifically, the speech encoder processes raw audio waveforms into a set of audio embeddings. In multimodal systems, additional modalities, primarily text, are often required in conjunction with audio. A crucial concept in such systems is the alignment of text and speech modalities to ensure coherent integration. While we will not delve deeply into alignment techniques in this post, we include both text and audio modalities in our illustrations to provide a realistic example of a speech-to-speech model.</p><p>One possible way of aligning text and audio modalities is to concatenate the audio embeddings with the text embeddings, achieved by expanding the embeddings matrix of the model to include a new set of audio token embeddings. A mixed sequence of text and audio embeddings is then fed as input to the language model, which performs next-token prediction in an autoregressive manner, generating either text or audio tokens as needed. This approach is used, for instance, in <a href="https://arxiv.org/abs/2306.12925">AudioPaLM</a>.</p><p>Finally, the <strong>vocoder</strong> converts the audio tokens produced by the language model back into high-quality audio waveforms, enabling natural and seamless speech synthesis.</p><p><strong>2.1.1- Audio encoders</strong></p><p>The audio encoder is a critical component in end-to-end speech-to-speech models, with several types of encoders employed depending on how the speech is represented. These encoders can be designed for two types of representations: <strong>discrete representation </strong>and <strong>continuous representation, </strong>as illustrated in Figure 2.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*e2U0mH87eYPz7o1r7OLeaQ.png" /><figcaption><strong>[Image by author]</strong> Figure 2: Types of representations in audio encoders</figcaption></figure><p><strong>Discrete representation</strong></p><p>In the case of discrete representation, the audio encoder is also referred to as an audio tokenizer. It processes continuous audio signals (waveforms) by first encoding them into latent representations and then converting these latent representations into discrete tokens. These tokens represent the audio in a compressed, quantized form and can be directly fed into the LLM for further processing. Models like AudioPaLM and <a href="https://arxiv.org/abs/2410.00037">Moshi</a> utilize this approach.</p><p>Current models primarily use three main audio tokenization methods:</p><ul><li><strong>Acoustic tokens</strong>, which focus on capturing sound patterns and low-level acoustic details. These are typically generated by audio encoders like <a href="https://arxiv.org/abs/2107.03312">SoundStream</a>, a neural audio codec designed for audio compression and synthesis.</li><li><strong>Semantic tokens</strong>, which emphasize the meaning and linguistic content of the speech. These are extracted by models like <a href="https://arxiv.org/abs/2106.07447">HuBERT</a> (Hidden-Unit BERT), which learns high-level semantic representations from speech for tasks like speech understanding.</li><li><strong>Mixed tokens </strong>combine elements of acoustic and semantic tokens, offering a balanced representation that captures acoustic, semantic, and paralinguistic features. Models like <a href="https://arxiv.org/abs/2209.03143">AudioLM</a> utilize both acoustic and semantic tokens in tandem to ensure meaningful and high-quality speech synthesis and translation.</li></ul><p>To further understand the distinctions between audio tokenization methods, Table 1 summarizes the characteristics, objectives, and applications of acoustic, semantic, and mixed tokens for clearer differentiation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YckcZzO8MHsB4NtXTGqifA.png" /><figcaption><strong>[Table by author] </strong>Table 1: Comparison of acoustic, semantic, and mixed speech tokens</figcaption></figure><p><strong>Continuous representation</strong></p><p>In the case of continuous representation, the audio encoder extracts speech features that are unquantized, real-valued representations of speech signals existing on a continuous scale. These features capture fine-grained, nuanced aspects of speech that might otherwise be lost during discretization. To make these features compatible with the LLM, a feature projection layer, i.e., an audio projector is required to map the extracted audio features into continuous input embedding vectors, which are then transmitted to the LLM for further processing. An example of a model using this approach is <a href="https://arxiv.org/abs/2310.13289">SALMONN</a>.</p><p><strong>2.1.2- Vocoder</strong></p><p>The other key element in end-to-end speech-to-speech models is the vocoder, also referred to as the Token-to-Speech Synthesizer. The vocoder’s primary role is to convert discrete or continuous audio tokens generated by the LLM back into high-quality, natural-sounding audio waveforms. A typical vocoder used for this purpose is <a href="https://arxiv.org/abs/2010.05646">HiFi-GAN</a>, known for its ability to generate high-fidelity waveforms from token sequences. The choice of vocoder significantly impacts the quality and expressiveness of the synthesized audio, making it an essential part of the speech synthesis pipeline.</p><h3><strong>Capabilities and practical considerations</strong></h3><p>Now that we understand the basics of speech-to-speech generative AI models, let’s discuss the ideal capabilities and key considerations you should think of when building your applications with these models.</p><blockquote>📜<strong>N.B: </strong>While this section primarily focuses on capabilities specific to voice, it’s important to remember that other general capabilities required for LLMs — such as factuality, reasoning, and memory — remain equally critical for creating effective and reliable speech-to-speech systems.</blockquote><h4><strong>1. Low latency</strong></h4><p>Latency is one of the most critical factors in speech-to-speech systems, directly affecting user experience. Achieving low latency ensures that interactions feel natural and fluid, maintaining a good perceived responsiveness. While there are numerous latency metrics, the most important ones for speech systems include:</p><ul><li><strong>Time to First Token (TTFT):</strong> Measures how quickly the system begins generating output after receiving input. A lower TTFT ensures faster responsiveness, which is crucial for maintaining conversational flow.</li><li><strong>Interruption Time:</strong> Refers to how swiftly the system can process and respond to user interruptions during ongoing speech. This is essential for natural turn-taking in dialogue.</li><li><strong>Average Latency:</strong> Represents the total processing time from input to output. Consistently low average latency enhances the overall experience, especially in real-time applications.</li></ul><h4><strong>2. High-quality voice output</strong></h4><p>Beyond low latency, high-quality voice ensures user engagement, clarity, and satisfaction. From a quality perspective, ideal capabilities include:</p><p><strong>2.1. Naturalness and speech intelligence</strong></p><p>A good-quality speech-to-speech system should have naturalness and speech intelligence capabilities, such as emotion recognition, multilingual support, accent recognition, or sarcasm detection. These capabilities can be achieved through advanced voice encoders and vocoders, which capture subtle speech features such as intonation, rhythm, and prosody, as well as emotions like joy, sadness, or excitement.</p><p><strong>2.2. Voice adaptability with prompt engineering</strong></p><p>Contextual prompting for voice is an essential capability that enables easy adaptation of voice output features — such as tone, emotion, and style — using natural language prompts, without the need to explicitly define SSML (Speech Synthesis Markup Language) tags. For example, the prompt can adapt the voice to convey empathy in mental health applications, excitement in promotional scenarios, or professionalism in corporate interactions. For instance, generating a “Happy New Year” message with a dynamic voice could be as simple as this:</p><pre>tone = &quot;cheerful&quot;<br>emotion = &quot;joyful&quot;<br><br>prompt = f&quot;Generate a Happy New Year message with a {tone} tone and a {emotion} emotion. </pre><p><strong>2.3. Speaker flexibility</strong></p><p>Speaker flexibility is another essential component of high-quality voice output. By offering a variety of speakers — differing in gender, accent, or age — applications can cater to diverse user preferences and contexts. This flexibility is particularly important in areas such as customer service, where certain voice characteristics can improve user comfort, or in multilingual systems, where accents aid comprehension. Speech-to-speech systems that provide a range of speaker options ensures adaptability and inclusivity of diverse audiences.</p><h4><strong>3- Barge-in and full-duplex interaction</strong></h4><p>Barge-in refers to a user’s ability to interrupt a system’s speech output with their own speech input. This capability is essential for achieving full-duplex communication, where both the user and the system can simultaneously listen and speak, closely mimicking natural human conversational dynamics. Unlike text-based models, which typically operate in a half-duplex manner, full-duplex interaction is particularly important in voice-based systems to enable seamless, real-time interactions.</p><p>Recent advancements in speech-based models have aimed to incorporate full-duplex capabilities through techniques such as <a href="https://github.com/huggingface/speech-to-speech">Voice Activity Detection (VAD)</a>, <a href="https://arxiv.org/abs/2410.00037">Parallel Stream Processing</a> or <a href="https://arxiv.org/abs/2411.00774">Interleaved Token Modeling</a></p><h4><strong>4- Streaming</strong></h4><p>Streaming means the system should not wait for a lengthy audio segment to be processed before generating a response. Instead, the model typically operates on a chunk-based mechanism, dynamically processing and generating audio in real time, one chunk at a time.</p><p>Streaming functionality is closely tied to the need for low latency, and both are essential for seamless real-time interactions and overall system responsiveness.</p><h4><strong>5- Agentic capabilities</strong></h4><p>Agentic capabilities empower speech-to-speech models to autonomously perform tasks, make decisions, and interact with external tools or environments based on user input. While these functionalities are valuable for LLMs in general, they are particularly crucial for speech-to-speech models, enabling them to access external knowledge and be utilized in advanced applications beyond simple dialogue. Examples of agentic capabilities include accessing external tools, APIs or Databases through function calling or executing code.</p><h4><strong>6- Multimodal capabilities</strong></h4><p>Multimodal capabilities enable speech-to-speech systems to process and integrate inputs from multiple modalities, such as text, images, and video, alongside speech. This enhances context understanding, broadens use cases in areas like education and healthcare, and increases accessibility for users with disabilities. For instance, a system might analyze a photo and verbal description simultaneously to offer precise solutions. Despite challenges like data alignment and computational demands, these capabilities are driving the evolution of more intuitive systems, making interactions richer and more human-like.</p><h3><strong>Evaluation</strong></h3><p>As systems grow in complexity, evaluating speech-to-speech systems is a challenging task, as it must account for linguistic, emotional nuance, real-time performance and interactional factors. Effective evaluation requires a combination of approaches to capture both technical precision and user experience. Evaluating speech-to-speech systems remains a less advanced area of research compared to system development, with ongoing efforts to establish comprehensive and reliable methodologies. Available evaluation methods are typically divided into human-based assessments and automatic approaches, which include benchmarks and metrics.</p><blockquote>📜<strong>N.B:</strong> This section aims to provide examples and is not an exhaustive list. Similarly to the capabilities section, we focus on metrics specific to voice. Common metrics used for LLMs, including LLMs as a judge, are not covered in this post.</blockquote><h4><strong>1- Human evaluation</strong></h4><p>Human evaluation is critical for assessing subjective qualities like naturalness, expressiveness, and overall user experience. The <a href="https://arxiv.org/abs/2109.03264">Mean Opinion Score (MOS)</a> is an example of metrics used, where raters score audio samples on a predefined scale based on perceived quality, focusing on intelligibility, emotional expressiveness, and fluency. However, while effective in capturing human-centric insights, MOS is resource-intensive and influenced by rater bias.</p><h4><strong>2- Automatic evaluation</strong></h4><p>Automatic evaluation provides objective measures to complement human assessment. It can be divided into two main components:</p><p><strong>2.1. Benchmarks</strong></p><p>Benchmarks such as <a href="https://arxiv.org/abs/2410.17196">VoiceBench</a>, <a href="https://arxiv.org/abs/2105.01051">SUPERB (Speech Processing Universal PERformance Benchmark)</a>, <a href="https://arxiv.org/abs/2406.16020#:~:text=AudioBench%3A%20A%20Universal%20Benchmark%20for%20Audio%20Large%20Language%20Models,-Bin%20Wang%2C%20Xunlong&amp;text=We%20introduce%20AudioBench%2C%20a%20universal,7%20are%20newly%20proposed%20datasets.">AudioBench</a> or <a href="https://arxiv.org/abs/2402.07729">AIR-Bench</a> standardize the evaluation of speech-to-speech systems by providing pre-defined datasets and tasks. These benchmarks enable fair comparisons across models and ensure consistency in assessing performance across areas like speech recognition, translation, and synthesis.</p><p><strong>2.2. Metrics</strong></p><p>Metrics quantify specific aspects of system performance. For semantic accuracy, metrics like <a href="https://arxiv.org/abs/2401.16812">SpeechBERTScore, SpeechBLEU or SpeechTokenDistance</a> can be used.</p><p><a href="https://github.com/Takaaki-Saeki/DiscreteSpeechMetrics?utm_source=chatgpt.com">Acoustic quality metrics</a> include Mel Cepstral Distortion (MCD) which evaluates the difference in spectral features between generated and reference speech or Log F0 Root Mean Square Error (RMSE) which measures prosody accuracy by comparing fundamental frequency (F0) patterns. Real-time performance is evaluated through latency metrics, while interaction metrics such as Turn-taking accuracy assess responsiveness and coherence in dynamic conversational scenarios. Figure 3 provides examples of evaluation metrics.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uTeIAPRXemQCZg8QQUG1gw.png" /><figcaption><strong>[Image by author] </strong>Figure 3: Examples of evaluation metrics for speech-to-speech systems</figcaption></figure><h3><strong>Use cases and best practices</strong></h3><p>Speech-to-speech generative AI models have transformative applications across various domains. Examples of use cases include conversational assistants and agents, such as virtual customer service representatives or personal assistants. They are also valuable for language learning and testing, allowing users to practice pronunciation and comprehension in different languages. Effective integration with other systems, such as multimodal frameworks or text-based LLMs, extends functionality to diverse domains: education, by enabling interactive language tutors or immersive learning environments; healthcare, by supporting voice-enabled patient assistance and telehealth services; entertainment, by enhancing gaming experiences and virtual reality interactions; and sports, by providing real-time commentary or personalized coaching through voice interfaces.</p><p>Developing speech-to-speech applications is a complex task that requires careful planning and execution. Here are some practical recommendations to guide you:</p><p><strong>1- It’s not just the model, think of the full stack </strong>— From the user interface, data storage, APIs, to infrastructure, every layer impacts performance. Adopt a long-term vision and choose a stack that offers you flexibility to integrate with existing and new technologies, scale with demand, and adapt to changing requirements and future advancements.</p><p><strong>2- Thoroughly test, evaluate and monitor your system </strong>— Validate every component of your voice system across multiple aspects: accuracy for accents, languages, clarity, naturalness, hallucinations and behavior in noisy conditions. Build scalable test protocols for real-world scenarios to measure latency and the ability to handle interruptions. Perform scalability tests for stress and edge cases. Include user feedback, accessibility checks. Regularly update tests to cover new features and keep monitoring over time.</p><p><strong>3- Responsible AI is even more critical for speech systems </strong>— It’s not just about latency or voice quality; it’s also about safety and trust. Implement strong guardrails to prevent harmful or biased outputs, ensure user privacy, and comply with regulations. Speech systems are accessible and interact directly with users — making ethical considerations non-negotiable.</p><p><strong>4- Trade-offs are key: optimize for your use case </strong>— Noticed the diverse capabilities of generative AI speech models? You don’t need all of them to be perfect. Consider trade-offs to prioritize what matters most for your application. For example, you might accept slower latency for higher accuracy or sacrifice flexibility for better real-time performance in some use cases.</p><p><strong>5- You need the right mindset and expertise </strong>— Speech-to-speech systems lies at the intersection of multiple disciplines including multimodal AI, software engineering, and user experience design. Fostering collaboration is critical, as interdisciplinary problem-solving is essential to creating an effective user experience and adopting the technology effectively. Generative AI is also a fast-moving field, requiring a growth and learning mindset to stay ahead of advancements. Invest in the right talent and build teams that excel in cross-functional expertise, embrace diverse perspectives, and communicate effectively.</p><h3><strong>Conclusion</strong></h3><p>The rise of speech-to-speech generative AI is certainly opening up a range of new possibilities and can assist us in countless ways. However, this potential can only be fully realized if these technologies are built responsibly, users are educated on ethical use, and awareness is raised about the broader ethical implications and societal impacts. This field is constantly evolving, and what we’ve covered here is not exhaustive — it’s just the starting point. Staying informed about the latest innovations and engaging with the research community are essential for developing a comprehensive understanding.</p><h3>How to build your speech-to-speech applications with Google Cloud?</h3><ol><li><strong>Explore the multimodal live API</strong><br>Discover how the <a href="https://ai.google.dev/api/multimodal-live">Multimodal Live API</a>, powered by Gemini, enables low-latency, bidirectional voice and video interactions. This API is designed for seamless, real-time communication, making it ideal for applications like virtual assistants, interactive education, and immersive entertainment.</li><li><strong>Check out Gemini 2.0 advanced native audio capabilities</strong><br>Watch the video below to see <a href="https://blog.google/technology/google-deepmind/google-gemini-ai-update-december-2024/">Gemini 2.0</a> in action.</li></ol><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fembed%2FqE673AY-WEI%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fwww.youtube.com%2Fwatch%3Fv%3DqE673AY-WEI&amp;image=https%3A%2F%2Fblue-sea-697d.quartiers047.workers.dev%3A443%2Fhttps%2Fi.ytimg.com%2Fvi%2FqE673AY-WEI%2Fhqdefault.jpg&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/a4f3eb7d59d83240f7b8e8bea7a25aff/href">https://medium.com/media/a4f3eb7d59d83240f7b8e8bea7a25aff/href</a></iframe><blockquote>📜<strong>About the Author</strong></blockquote><blockquote>Dr. Wafae Bakkali is a Staff Generative AI Specialist, Blackbelt at Google. With over 12 years of experience, she has a proven track record of combining deep technical expertise and leadership with strategic business insights to drive impactful outcomes. Through her current role at Google and former roles at reputable organizations such as AWS, Dr. Bakkali has successfully guided organizations across various industries in adopting and building AI solutions.</blockquote><blockquote>She holds a PhD from IMT Atlantique, France, and served as a postdoctoral researcher at Centrale Supélec, Paris-Saclay University, France.</blockquote><blockquote>Dr. Bakkali is also an active contributor to the AI community. She regularly shares her expertise as a speaker at international tech conferences and mentors participants in AI hackathons, tech, and startup events.</blockquote><p>🔗Connect with me on LinkedIn: <a href="https://www.linkedin.com/in/wafae-bakkali/">https://www.linkedin.com/in/wafae-bakkali/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bc6701f34549" width="1" height="1" alt=""><hr><p><a href="https://medium.com/google-cloud/speech-to-speech-generative-ai-from-theory-to-practice-bc6701f34549">Speech-to-Speech Generative AI: From Theory to Practice</a> was originally published in <a href="https://medium.com/google-cloud">Google Cloud - Community</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>