Ga naar hoofdinhoud

Een complete gids voor Nano Banana 2 Lite en Gemini Omni Flash: Python-mediapijplijnen

Leer hoe je Google's nieuwste multimodale modellen inzet om in Python krachtige, kostenefficiënte pipelines voor beeld- en videogeneratie te bouwen.
· 11 min lezen

Verken met AI

Google heeft onlangs Nano Banana 2 Lite en Gemini Omni Flash uitgebracht, twee modellen die snelheid en multimodale mogelijkheden in AI-ontwikkeling opnieuw definiëren.

Deze modellen bieden een krachtige combinatie van extreem lage latentie voor beeldgeneratie en veelzijdige, conversatiegestuurde video-editing.

In dit artikel verken ik de kerncapaciteiten van deze modellen en bouw ik een volledige AI-videobewerkingspipeline waarmee gebruikers beelden kunnen selecteren en genereren met Nano Banana 2 Lite, om ze vervolgens samen te voegen tot een video.

Hier is een demovideo van de app die we bouwen:

Wat is Nano Banana 2 Lite?

Nano Banana 2 Lite (gemini-3.1-flash-lite-image) is tot nu toe Google's snelste en meest kostenefficiënte model voor beeldgeneratie. 

Het is specifiek gebouwd voor ontwikkelaars-pijplijnen met hoge doorvoer en toepassingen met veel verkeer, en geoptimaliseerd voor scenario's waar lage latentie en krappe operationele budgetten de primaire randvoorwaarden zijn.

Voor platforms die momenteel Google's legacy-model (gemini-2.5-flash-image) gebruiken, fungeert Nano Banana 2 Lite als directe vervanger, met onmiddellijke verbeteringen in snelheid, kosten en visuele kwaliteit.

Belangrijkste prestatie-indicatoren

  • Ultra-lage latentie: Levert text-to-image-uitvoer in circa 4 seconden, ideaal voor interactieve prototyping en realtime gebruikersapplicaties.
  • Kostenefficiëntie: Geprijsd op $0,034 per afbeelding met 1K-resolutie, waardoor de drempel voor generatie op grote schaal aanzienlijk lager ligt.
  • Behouden van kwaliteit: Ondanks de focus op snelheid behoudt het model sterke prompt-naleving, consistente karakterrenders en betrouwbare tekstgeneratie in beelden.

Wat is Gemini Omni Flash?

Gemini Omni Flash (gemini-omni-flash-preview) is Google's kostenefficiënte model voor videogeneratie en conversatiegestuurde video-editing.

In tegenstelling tot standalone videogeneratoren die strikt vertrouwen op statische tekstprompts, brengt Omni Flash Gemini’s kern van multimodaal redeneren direct in het videocreatieproces. 

Het accepteert van nature combinaties van tekst-, beeld- en video-inputs, waardoor je programmatische controle krijgt over videogeneratie met ongekende precisie.

Kernmogelijkheden en prijsstelling van Omni Flash

  • Concurrerende prijsstelling: $0,10 per seconde video-uitvoer, gelijk aan het tarief van Veo 3.1 Fast.
  • Conversatiegestuurde video-editing: In plaats van video’s bij kleine aanpassingen helemaal opnieuw te genereren, kunnen applicaties natuurlijke taal gebruiken om bestaande sequenties te verfijnen.
  • Multimodale referenties: Tekstprompts kunnen worden gecombineerd met referentieafbeeldingen of -clips om visuele consistentie en gedetailleerde controle over scene-elementen te waarborgen.
  • Verankering in de echte wereld: Door gebruik te maken van Gemini’s basiskennis construeert het model realistische animaties op basis van logica en fysica.
  • Synchronisatie van tekst en acties: Tekst op het scherm en grafische overlays kunnen via simpele prompts direct worden gekoppeld aan video-acties.

Grafiek met de Elo-score tussen Gemini Omni Flash en andere state-of-the-art AI-videogeneratiemodellen.

Hoe genereer en stel je een Gemini API-sleutel in

Voordat we de Gemini API kunnen gebruiken, moeten we een API-sleutel aanmaken en instellen zodat onze code met de API kan communiceren.

De eenvoudigste manier om dit te doen is:

  • Bezoek de API-sleutelpagina van Google’s AI Studio en log in.
  • Klik op de knop “Create API key” rechtsboven.
  • Kopieer de API-sleutel naar een bestand met de naam .env in dezelfde map als waar de Python-code staat, met het volgende formaat:
GEMINI_API_KEY=replace_with_api_key

Let op: Het gebruik van de API brengt kosten met zich mee. Om deze te gebruiken, moeten we een betaalmethode configureren op de factureringspagina van Google’s AI Studio.

Hoe genereer je afbeeldingen met Nano Banana 2 Lite in Python

Vereisten voor AI-beeldgeneratie in Python

Voordat we beginnen met het coderen van onze Python AI-beeldgenerator, zorg dat het volgende klaarstaat:

  • Python 3.9+ is op het systeem geïnstalleerd.
  • Google Gemini API-sleutel: Een geldige Google Gemini API-sleutel om aanvragen te authenticeren. Zie de stappen hierboven om de sleutel te maken en te configureren.
  • Vereiste Python-bibliotheken: We gebruiken de officiële google-genai SDK voor API-integratie en Pillow voor het verwerken van de beelduitvoer.

De benodigde Python-pakketten kunnen met pip worden geïnstalleerd:

pip install google-genai pillow python-dotenv

Stap 1: Modules importeren en omgevingsvariabelen laden

Maak een nieuw bestand (bijv. generate_image.py) en voeg de volgende imports en laadsequentie toe om de omgeving in te stellen:

import io
from dotenv import load_dotenv
from google.genai import types
from PIL import Image
from google.genai import Client

# Load environment variables from the .env file
load_dotenv()

Stap 2: De Google GenAI-client initialiseren

Om met het Nano Banana 2 Lite-model te communiceren, moeten we eerst de Google GenAI-client initialiseren. 

Omdat de SDK automatisch de systeomgevingsvariabelen controleert op GEMINI_API_KEY (die in de vorige stap uit het .env-bestand is geladen), kunnen we de client initialiseren zonder de API-sleutel expliciet in de code door te geven.

# Initialize the Gemini API client
client = Client()

Stap 3: De functie voor AI-beeldgeneratie schrijven

Nu komt de kernlogica van ons Python-script. We schrijven een aparte Python-functie, generate_image(), die de geïnitialiseerde client en een tekstprompt als input neemt.

Nano Banana 2 Lite wordt aangeroepen door model="gemini-3.1-flash-lite-image" op te geven. We configureren het API-verzoek om een beeldmodaliteit te verwachten en specificeren de gewenste beeldverhouding voor de AI-beeldgeneratie.

def generate_image(client, prompt: str, ratio: str = "1:1") -> Image.Image | None:
    """
    Generates an AI image using the Nano Banana 2 Lite model via the Gemini API.
    """
    print(f"Generating AI image for prompt: '{prompt}'...")
    
    # 1. Call the Nano Banana 2 Lite model
    response = client.models.generate_content(
        model="gemini-3.1-flash-lite-image",
        contents=prompt,
        config=types.GenerateContentConfig(
            response_modalities=[types.Modality.IMAGE],
            image_config=types.ImageConfig(aspect_ratio=ratio),
        ),
    )
    
    # 2. Extract and convert the generated image data
    if response and response.candidates:
        for part in response.candidates[0].content.parts:
            if part.inline_data:
                # Load the bytes into a PIL Image and convert to RGB
                image = Image.open(io.BytesIO(part.inline_data.data)).convert("RGB")
                return image
                
    return None

Het Python-verzoek voor beeldgeneratie uitgelegd:

  • response_modalities: Dit dwingt het Google Gemini-model om een beeld te retourneren in plaats van tekst.
  • inline_data: De Gemini API retourneert het gegenereerde beeld als ruwe bytes. We gebruiken io.BytesIO in Python om deze bytes te wrappen zodat Pillow (Image.open) ze als een standaard afbeeldingsbestand kan lezen.
  • image_config: We zetten de aspect_ratio op "1:1" (vierkant), maar dit is eenvoudig aan te passen afhankelijk van de usecase van je AI-toepassing.

Ondersteunde beeldverhoudingen:

Tabel met de beeldverhoudingen die Nano Banana 2 Lite ondersteunt

Stap 4: Het Python-script voor beeldgeneratie uitvoeren

Laten we alles samenbrengen en Nano Banana 2 Lite vragen om een afbeelding te genereren! 

We geven een creatieve prompt, roepen de functie show() aan op het resulterende beeld om het AI-kunstwerk te bekijken, en sluiten de client om resources vrij te geven.

if __name__ == "__main__":
    # Define our creative prompt for the AI model
    my_prompt = "A futuristic city skyline at sunset, cyberpunk style, highly detailed"
    
    # Generate the AI image
    result_image = generate_image(client, my_prompt)
    
    # Display the resulting image
    if result_image:
        print("AI Image generated successfully!")
        result_image.show()
    else:
        print("Failed to generate AI image.")
        
    # Close the client to prevent shutdown exceptions
    client.close()

Hier is de afbeelding die door Nano Banana 2 Flash werd gegenereerd:

image14.png

Zoals Google in hun aankondiging beloofde, had het model slechts een paar seconden nodig om de afbeelding te genereren. Op het eerste gezicht voelt het veel sneller aan dan elk ander model dat ik tot nu toe heb geprobeerd.

Het volledige script vind je in het generate_image.py-script uit de repository van deze tutorial.

Het script uitbreiden naar beeldbewerking

Laten we een functie edit_image() schrijven die een afbeelding bewerkt. Het enige wat we in het verzoek hoeven te wijzigen, is de afbeelding samen met de prompt aanleveren in de parameter contents als een lijst [image, prompt].

def edit_image(client, image: Image.Image, prompt: str, aspect_ratio: str = "1:1") -> Image.Image | None:
    """
    Edits an AI image using the Gemini 3.1 Flash Lite model via the Gemini API.
    """
    response = client.models.generate_content(
        model="gemini-3.1-flash-lite-image",
        contents=[image, prompt],
        config=types.GenerateContentConfig(
            response_modalities=[types.Modality.IMAGE],
            image_config=types.ImageConfig(aspect_ratio=aspect_ratio),
        ),
    )
    if response and response.candidates:
        for part in response.candidates[0].content.parts:
            if part.inline_data:
                return Image.open(io.BytesIO(part.inline_data.data)).convert("RGB")
    return None

Nano Banana 2 Flash testen

We hebben de prestaties in de praktijk geëvalueerd door een reeks gerichte stresstests uit te voeren. 

Deze evaluaties richten zich op het vermogen van het model om complexe visuele taken aan te kunnen, zoals leesbare tekst renderen, strakke ruimtelijke lay-outs behouden en consistentie waarborgen over meerdere beurten, om te bepalen of het zijn belofte van hoogwaardige generatie op hoge snelheid waarmaakt.

Leesbare tekstrendering ín de afbeelding testen

image9.png

Strikte ruimtelijke controle en naleving met twee onderwerpen testen

Snelle UI-prototyping en lay-outprecisie testen

image2.png

Complexe materiaalcontrasten en belichting testen

image7.png

Consistentie van personages over meerdere beurten testen

image5 (1).png

Eerlijk gezegd ben ik behoorlijk onder de indruk van de resultaten voor zo’n snel model. In het laatste voorbeeld wist het model zelfs de tekst in de krant enigszins consistent te houden. 

Uit mijn ervaring is consistentie een van de belangrijkste aspecten waar een beeldgeneratiemodel in moet uitblinken om echt nuttig te zijn.

Hoe genereer je video’s met Gemini Omni Flash in Python

In deze sectie laten we zien hoe je een Python-script bouwt om video’s te genereren, te beginnen met een simpele tekst-naar-video-prompt en dit vervolgens uit te breiden met referentieafbeeldingen.

In tegenstelling tot standaard beeldgeneratie gebeurt het genereren van video’s met Gemini Omni Flash via de Interactions API van de SDK (client.interactions.create). Deze endpoint is specifiek ontworpen voor rijke, meerstaps- en multimodale interacties.

Omdat de vereiste SDK-imports, het instellen van omgevingsvariabelen en het initialiseren van de Google GenAI-client identiek zijn aan het proces voor beeldgeneratie in de vorige sectie, kunnen we ons direct richten op het schrijven van onze functies voor videogeneratie.

Stap 1: Tekst-naar-video (Eenvoudige prompt-naar-video)

Om een video te genereren op basis van alleen een tekstprompt, geven we één tekstinvoerblok door aan de Interactions API. We kunnen hiervoor een eenvoudige Python-functie schrijven:

def text_to_video(client, prompt: str, aspect_ratio: str = "16:9", duration: str = "5s"):
    """
    Generates a video from a text prompt using Gemini Omni Flash.
    """
    interaction = client.interactions.create(
        model="gemini-omni-flash-preview",
        input=[{"type": "text", "text": prompt}],
        response_format={
            "type": "video",
            "aspect_ratio": aspect_ratio,
            "duration": duration,
        },
    )
    return interaction

We kunnen deze functie aanroepen en de geretourneerde videobytes als volgt opslaan in een bestand:

if __name__ == "__main__":
    import base64

    # Define a creative video prompt
    text_prompt = """
    Generate a first person view of what daily life would look like in the year
    1000 at this location: 41.89030621184054, 12.492266126772481
    """

    # Call the video generator
    interaction = text_to_video(
        client=client,
        prompt=text_prompt,
        aspect_ratio="16:9",
        duration="5s"
    )

    # Extract and save the generated video file
    if interaction and hasattr(interaction, "output_video") and interaction.output_video:
        # Decode the base64-encoded video data returned by the API
        video_bytes = base64.b64decode(interaction.output_video.data)
        
        # Save the bytes locally as an MP4 file
        with open("videos/video.mp4", "wb") as f:
            f.write(video_bytes)
    else:
        print("Failed to generate video.")

De prompt die we gebruikten was:

Generate a first-person view of what daily life would look like in the year 1000 at this location: 41.89030621184054, 12.492266126772481

Die specifieke locatie is het Romeinse Colosseum. Ik gebruikte coördinaten om de wereldkennis van het model te testen. Dit is de video die werd gegenereerd:

Ter vergelijking: dit is wat het model genereerde toen ik het jaar 1000 verving door 1980:

Best interessant, vind ik. Bekijk het text_to_video.py-bestand om het volledige script te zien.

Stap 2: Image-to-Video-mogelijkheden implementeren

Om een statische afbeelding te animeren of deze alleen als referentie te gebruiken om de videogeneratie aan te sturen, moeten we zowel de afbeelding als een tekstprompt aan het model doorgeven.

Omdat de Interactions API verwacht dat afbeeldingsinputs base64-gecodeerd zijn, definiëren we eerst een hulpfunctie om PIL Image-objecten naar base64-strings te converteren:

import io
from PIL import Image
import base64

def _image_to_base64(img: Image.Image) -> str:
    """
    Converts a PIL Image object to a base64-encoded string.
    """
    buffered = io.BytesIO()
    img.save(buffered, format="PNG")
    return base64.b64encode(buffered.getvalue()).decode()

Nu kunnen we een algemenere functie bouwen, generate_video(), die zowel optionele afbeeldingen als de tekstprompt verwerkt.

from google.genai import types

def generate_video(client, valid_images: list[Image.Image], animation_prompt: str, aspect_ratio: str):
    """
    Generates a commercial-quality AI video using Google's Gemini Omni Flash model.
    Supports image-to-video and text-to-video multimodal inputs using the Gemini API.
    """
    omni_inputs = []
    
    # 1. Base64 encode and append any input images
    for img in valid_images:
        img_b64 = _image_to_base64(img)
        omni_inputs.append({
            "type": "image",
            "data": img_b64,
            "mime_type": "image/png",
        })

    # 2. Append the text animation prompt
    omni_inputs.append({"type": "text", "text": animation_prompt})

    # 3. Request video generation from the interactions endpoint
    interaction = client.interactions.create(
        model="gemini-omni-flash-preview",
        input=omni_inputs,
        response_format={
            "type": "video",
            "aspect_ratio": aspect_ratio,
        },
    )
    return interaction

Tot slot: zo gebruiken we deze functies om een video te genereren die deze keverafbeelding animeert, die ik met Gemini heb gegenereerd:

image4 (1).png

if __name__ == "__main__":
    # Load our reference image
    reference_image = Image.open("images/beetle.png").convert("RGB")

    # Describe how we want the image to be animated
    animation_prompt = """
    A detailed, close-up photograph of an iridescent biomechanical stag beetle, 
    shimmering with metallic green, blue, and violet hues, as it traverses a 
    rugged amethyst crystal formation in a subterranean grotto. 
    The cavern walls are lined with a dense matrix of glowing crystals emitting 
    deep purple, blue, and green light. The air is misty, with bioluminescent 
    flora clinging to the rock. As the camera maintains focus, the beetle 
    subtly activates a soft internal orange glow from its mandibles, begins 
    vibrating its wings, and slowly crawls upward across the crystalline 
    surface, reflecting the surrounding light.
    """

    # Call the generator with the reference image
    interaction = generate_video(
        client=client,
        valid_images=[reference_image],
        animation_prompt=animation_prompt,
        aspect_ratio="16:9"
    )

    # Extract and save the animated video
    if interaction and hasattr(interaction, "output_video") and interaction.output_video:
        video_bytes = base64.b64decode(interaction.output_video.data)
        with open("videos/video.mp4", "wb") as f:
            f.write(video_bytes)

Dit was de video die werd gegenereerd:

Het volledige script is hier beschikbaar.

Stap 3: Video bewerken met Video-to-Video

Een video conversatiegestuurd bewerken met de Gemini Omni Flash API is ontzettend eenvoudig dankzij het gebruik van interacties. Wanneer we een video genereren, krijgen we een interactie-ID die toegankelijk is als interaction.id. 

Om een video te bewerken, geven we vervolgens een prompt en de ID van de vorige interactie op. Is het de eerste bewerking, dan geven we de ID op van de interactie die is gebruikt om de video te genereren. Voor volgende bewerkingen geven we de ID van de vorige bewerking op.

client.interactions.create(
        model="gemini-omni-flash-preview",
        input=edit_prompt,
        previous_interaction_id=previous_interaction_id,
)

Een interactieve AI Video Studio bouwen: architectuur en synergie tussen modellen

In de vorige secties leerden we hoe je programmatisch afbeeldingen genereert met Nano Banana 2 Lite en video’s met Gemini Omni Flash. Nu laten we zien hoe je deze mogelijkheden samenbrengt in één samenhangende, interactieve webapplicatie: een AI Video Studio.

De architectuur van de AI Video Studio

Het maken van hoogwaardige AI-video’s vereist meestal veel trial-and-error. De AI Video Studio lost dit op met een tweefasige pipeline met meerdere modellen die de unieke sterke punten van twee verschillende modellen benut:

  • Assets verzamelen: Aangedreven door Nano Banana 2 Lite kunnen gebruikers snel resources en referentieafbeeldingen voor de video genereren en combineren met bestaande beelden die ze hebben.
  • Videogeneratie: We gebruiken Gemini Omni Flash om een video te genereren op basis van die assets.
  • Videobewerking: Nadat een video is gegenereerd, kunnen we deze conversatiegestuurd bewerken.

image11.png

Fase 1: Snel prototypen met Nano Banana 2 Lite

In de eerste fase laat de applicatie ons referentiebeelden (keyframes) verzamelen. We kunnen ofwel een lokale afbeelding uploaden of er on the fly één genereren. 

Hier blinkt Nano Banana 2 Lite in uit. 

Met een latentie van onder de 4 seconden en voor slechts een fractie van een cent per afbeelding, dient het als een ultrasnelle sandbox. We kunnen razendsnel tientallen verschillende visuele stijlen, composities en onderwerpen prototypen tot we het perfecte keyframe hebben.

image6.png

Fase 2: Multimodale generatie met Gemini Omni Flash

Zodra we het perfecte referentiebeeld hebben, gaan we door naar de videoproductiefase. 

Het referentiebeeld en onze animatieprompt (bijv. beschrijving van camerabeweging, lichtveranderingen of actie) worden base64-gecodeerd en via de Interactions API van de SDK naar Gemini Omni Flash gestuurd. 

Gemini Omni Flash verwerkt deze inputs en retourneert een video met hoge getrouwheid in breedbeeld (16:9) of verticaal (9:16) formaat.

Hier is de video die we kregen:

Streamlit-implementatie van de videogeneratie-app

Voor de gebruikersinterface gebruiken we Streamlit, een populair open-source Python-framework waarmee je heel eenvoudig deelbare webapps voor machine learning en data science bouwt. 

Ben je nieuw met Streamlit of wil je een opfrisser over hoe het werkt, lees dan zeker deze Python Streamlit-tutorial. 

We focussen niet op de Streamlit-UI-code zelf, maar kijken naar de architectuur van de videogeneratiepipeline en verkennen de creatieve mogelijkheden van het combineren van deze twee krachtige modellen.

Het gemini_api.py-script bevat de functies die we hierboven hebben geïmplementeerd om afbeeldingen en video’s te genereren. De gebruikersinterface is met Streamlit geïmplementeerd in het app.py-script.

Wil je het lokaal draaien en ermee experimenteren, doe dan het volgende:

git clone [email protected]:fran-aubry/nano-banana-2-flash-tutorial.git
pip install -r requirement.txt
streamlit run app.py

Hier is een volledig workflowvoorbeeld dat een bestaande afbeelding van een denkbeeldig theemerk combineert met een gegenereerde afbeelding van een theeplantage om een commercial shot voor dat theeblik te maken. 

Daarna bewerken we de video met een prompt.

De video is versneld weergegeven tijdens de videogeneratie, omdat dit enkele minuten kan duren.

Conclusie

De snelheidsclaims die Google doet over hun nieuwe Nano Banana 2 Lite-model kloppen. 

Het model is ongelooflijk snel en komt dichter in de buurt van iets dat beelden in realtime kan genereren. Hoewel de afbeeldingen die het genereert goed zijn, zijn ze niet bepaald revolutionair. De primaire innovatie van het model is ongetwijfeld de indrukwekkende snelheid, niet baanbrekende beeldkwaliteit.

Samen vormen de Gemini Omni Flash- en Nano Banana 2 Lite-modellen een krachtige pipeline. Het Omni-model is bijzonder effectief in het behouden van de getrouwheid aan het referentiemateriaal.

Wil je meer weten over Nano Banana 2, bekijk dan dit artikel: Nano Banana 2: Een volledige gids met Python.

Voor meer diepgang in de Gemini Omni-serie raad ik aan om Gemini Omni: één model voor tekst, beeld, audio en video te lezen.

FAQs

Waarin verschillen Nano Banana 2 Lite en Gemini Omni Flash qua doel?

Nano Banana 2 Lite is geoptimaliseerd voor snelle, kostenefficiënte beeldgeneratie (ideaal voor snel prototypen), terwijl Gemini Omni Flash is ontworpen voor multimodale videogeneratie en conversatiegestuurde videobewerking.

Kan ik een video bewerken zonder deze vanaf nul opnieuw te genereren?

Ja. Met Gemini Omni Flash kun je video’s conversatiegestuurd bewerken. Door een prompt te geven samen met de ID van de vorige interactie kun je bestaande videosequenties met natuurlijke taal verfijnen.

Is Nano Banana 2 Lite geschikt voor realtime gebruikersapplicaties?

Met een ultra-lage latentie van ongeveer 4 seconden per afbeelding is het specifiek gebouwd voor interactieve apps waar snelheid en budget de belangrijkste factoren zijn.

Wat zijn de belangrijkste kostenoverwegingen voor deze modellen?

Beide modellen geven prioriteit aan kostenefficiëntie. Nano Banana 2 Lite kost $0,034 per afbeelding met 1K-resolutie en Gemini Omni Flash kost $0,10 per seconde video-uitvoer, waardoor ze geschikt zijn voor pipelines op grote schaal.

François Aubry

Auteur

François Aubry

Full-stack engineer & oprichter bij CheapGPT. Lesgeven is altijd mijn passie geweest. Al vanaf mijn studententijd zocht ik actief naar kansen om bijles te geven en andere studenten te helpen. Die passie bracht me ertoe om te promoveren, waarbij ik ook als onderwijsassistent werkte ter ondersteuning van mijn academische werk. In die jaren vond ik veel voldoening in de traditionele klasomgeving, waar ik verbindingen kon leggen en leren kon begeleiden. Met de opkomst van online leerplatforms zag ik echter het transformerende potentieel van digitaal onderwijs. Sterker nog, ik was actief betrokken bij de ontwikkeling van zo’n platform op onze universiteit. Ik zet me sterk in om traditionele didactische principes te combineren met innovatieve digitale methoden. Mijn passie is om cursussen te maken die niet alleen boeiend en informatief zijn, maar ook toegankelijk voor lerenden in dit digitale tijdperk.

Onderwerpen

Gerelateerd