Skip to main content

Building a Documentary with AI: 15 Atmospheric Clips from Veo 3.1

8 min read By Craig Merry
AI Veo video generation documentary Python Google AI

This project demonstrates how to use Google’s Veo 3.1 AI video generation model to create atmospheric background clips for documentary filmmaking. The toolkit generates 15 cinematic clips totaling ~112 seconds, each designed as a backdrop for quote overlays in post-production.


The Concept: “In His Own Words”

The documentary concept overlays verified political quotes onto atmospheric visuals—storm clouds, American symbols in shadow, abstract textures—creating an emotional resonance without depicting specific individuals. Each clip is designed with a dark lower third for text placement.


The 15 Generated Clips

Each video below was generated using Veo 3.1 with carefully crafted prompts. Click to play.

Hover or tap to play each clip

01
8s

Opening: Dust Particles

Soft dust particles floating in a beam of harsh white light against black void. Title card background.

02
8s

Storm Clouds

Ominous storm clouds rolling slowly, dark grey and navy blue palette with distant lightning.

"Maybe we'll give that a shot some day." — on president for life, March 2018

03
8s

Liberty Face in Shadows

Low-angle close-up of Statue of Liberty's face with dramatic chiaroscuro lighting.

"We fell in love. He wrote me beautiful letters." — on Kim Jong Un, September 2018

04
8s

Flag in Slow Motion

Desaturated American flag waving against overcast grey sky, almost monochrome.

"I said, 'This is genius.'" — on Putin, February 22, 2022

05
6s

Constitution Texture

Extreme close-up of aged parchment paper with raking side light revealing texture.

"...allows for the termination of all rules...even those found in the Constitution." — December 2022

06
6s

Chains and Rust

Heavy iron chains with deep rust and corrosion, harsh side lighting creating dramatic shadows.

"...that live like vermin within the confines of our country." — Veterans Day 2023

07
8s

Smoke Rising

Wispy white smoke rising against pure black, catching harsh side light.

"They're poisoning the blood of our country." — December 2023

08
8s

Capitol in Fog

U.S. Capitol dome silhouette emerging from heavy morning fog, pre-dawn blue hour.

"I am your retribution." — CPAC 2023

09
6s

Breaking Glass

Extreme slow-motion of glass shattering, fragments suspended catching backlight.

"No, no, no. Other than Day One." — on being a dictator, December 2023

10
8s

Rain on Window

Close-up of rain streaming down window glass with blurred city lights beyond.

"The enemy from within...is more dangerous than China, Russia..." — October 2024

11
8s

Liberty's Torch

Close-up of Liberty's torch and flame against stormy sky, appearing almost extinguished.

"You won't have to vote anymore..." — July 2024

12
8s

Floating Embers

Glowing orange embers and sparks floating upward against pure black background.

"No. I think they haven't gone far enough." — on ICE raids, November 2025

13
8s

Washington Monument

Washington Monument silhouette emerging from dense ground fog at dawn.

"...either the nice way or the more difficult." — on Greenland, January 2026

14
6s

Ink Spreading

Black ink slowly spreading through clear water, tendrils reaching outward.

"This is, in essence, a federal invasion..." — Minnesota AG, January 2026

15
8s

Finale: Liberty Full

Wide shot of complete Statue of Liberty at golden hour, slow push-in toward her face.

The pattern was always visible. The words were always there.

15

Video Clips

112s

Total Duration

9:16

Aspect Ratio

Veo 3.1

AI Model


The Python Generator Script

The complete script below generates all clips using Google’s Veo 3.1 API. Each prompt is carefully crafted for cinematic, documentary-style output.

Prerequisites

# Install the Google GenAI SDK
pip install google-genai

# Set your API key
export GEMINI_API_KEY="your-api-key-here"

Usage

# List all available clips
python veo_documentary_generator.py list

# Generate all clips
python veo_documentary_generator.py all

# Generate a single clip
python veo_documentary_generator.py single 03_liberty_face_shadows

# Generate a range (clips 0-4)
python veo_documentary_generator.py range 0 5

# Show quote sequence for post-production
python veo_documentary_generator.py quotes

Full Script

#!/usr/bin/env python3
"""
Veo 3.1 Documentary Video Generator
Generates atmospheric background clips for quote-based political documentary

Usage:
    export GEMINI_API_KEY="your-api-key"
    python veo_documentary_generator.py
"""

import os
import time
from datetime import datetime
from google import genai
from google.genai import types

# Client initialized lazily when needed
client = None

def get_client():
    """Initialize and return the Gemini client."""
    global client
    if client is None:
        api_key = os.environ.get("GEMINI_API_KEY")
        if not api_key:
            raise ValueError(
                "GEMINI_API_KEY environment variable not set.\n"
                "Set it with: export GEMINI_API_KEY='your-api-key'\n"
                "Get your API key from: https://aistudio.google.com/apikey"
            )
        client = genai.Client(api_key=api_key)
    return client

# Output directory
OUTPUT_DIR = os.path.join(os.getcwd(), "veo_clips")
os.makedirs(OUTPUT_DIR, exist_ok=True)

# Documentary clip prompts (15 total)
DOCUMENTARY_CLIPS = [
    {
        "name": "01_opening_dust_particles",
        "prompt": """Slow cinematic shot of soft dust particles floating in a single beam of
harsh white light against a completely black void background. Particles drift slowly
left to right. Minimal, moody, mysterious atmosphere. Shallow depth of field creates
bokeh effect on distant particles. Dramatic chiaroscuro lighting. No people, no objects,
pure atmosphere. Silent, no audio. 9:16 vertical format. No text, no subtitles,
no watermarks, no logos.""",
        "duration": 8
    },
    # ... (14 more clips defined similarly)
]

def generate_video_sync(clip_config: dict) -> str:
    """Generate a single video clip using Veo 3.1 synchronously."""
    name = clip_config["name"]
    prompt = clip_config["prompt"]
    duration = clip_config.get("duration", 8)

    print(f"Generating: {name} ({duration}s)")

    try:
        api_client = get_client()

        # Start video generation
        operation = api_client.models.generate_videos(
            model="veo-3.1-generate-preview",
            prompt=prompt,
            config=types.GenerateVideosConfig(
                aspect_ratio="9:16",
                number_of_videos=1,
                duration_seconds=duration,
            )
        )

        # Poll for completion
        while not operation.done:
            time.sleep(10)
            operation = api_client.operations.get(operation)

        if operation.error:
            print(f"ERROR: {operation.error}")
            return None

        # Download and save
        if operation.response and operation.response.generated_videos:
            video = operation.response.generated_videos[0]
            output_path = os.path.join(OUTPUT_DIR, f"{name}.mp4")
            video_data = api_client.files.download(file=video.video)

            with open(output_path, "wb") as f:
                f.write(video_data)

            print(f"✓ Saved: {output_path}")
            return output_path

    except Exception as e:
        print(f"ERROR: {str(e)}")
        return None

def generate_all_clips():
    """Generate all documentary clips sequentially."""
    for i, clip in enumerate(DOCUMENTARY_CLIPS):
        print(f"[{i+1}/{len(DOCUMENTARY_CLIPS)}] {clip['name']}")
        generate_video_sync(clip)
        time.sleep(5)  # Rate limiting pause

if __name__ == "__main__":
    import sys
    if len(sys.argv) > 1 and sys.argv[1] == "all":
        generate_all_clips()
    else:
        print("Usage: python veo_documentary_generator.py all")

Technical Specifications

SpecificationValue
ModelVeo 3.1 (veo-3.1-generate-preview)
Resolution720p (1080p with AI Ultra)
Aspect Ratio9:16 vertical
Frame Rate24fps
Max Duration8 seconds per clip
FormatMP4
Total Clips15
Total Duration~112 seconds

API Costs (Approximate)

  • Each 8-second clip: ~$3.20 with AI Pro
  • Full 15-clip project: ~$45-50
  • Generation time: 2-5 minutes per clip

Post-Production Workflow

ToolBest ForCost
CapCutQuick edits, auto-captionsFree
DaVinci ResolveProfessional qualityFree
Premiere ProFull production$22.99/mo

Text Overlay Guidelines

  1. Font: Clean sans-serif (Inter, Helvetica, Arial)
  2. Size: 48-72pt for quotes, 36pt for attribution
  3. Position: Lower third with safe margins
  4. Duration: 3-5 seconds per quote segment
  5. Animation: Simple fade in/out (200-400ms)

Export Settings

  • Resolution: 1080 x 1920 (9:16)
  • Codec: H.264 or H.265
  • Bitrate: 10-15 Mbps
  • Frame Rate: 24fps

The Full Quote Sequence

For post-production reference, here’s the complete quote sequence to overlay on each clip:

ClipQuote
01[Title card - no quote]
02”Maybe we’ll give that a shot some day.” — March 2018
03”We fell in love. He wrote me beautiful letters.” — September 2018
04”I said, ‘This is genius.’…How smart is that?” — February 22, 2022
05”…allows for the termination of all rules…even those found in the Constitution.” — December 2022
06”…that live like vermin within the confines of our country.” — Veterans Day 2023
07”They’re poisoning the blood of our country.” — December 2023
08”I am your warrior. I am your justice…I am your retribution.” — CPAC 2023
09”No, no, no. Other than Day One.” — December 2023
10”The enemy from within…is more dangerous than China, Russia…” — October 2024
11”You won’t have to vote anymore…We’ll have it fixed so good…” — July 2024
12”No. I think they haven’t gone far enough.” — November 2025
13”…either the nice way or the more difficult.” — January 2026
14”This is, in essence, a federal invasion…it must stop.” — MN AG, January 2026
15[The pattern was always visible. The words were always there.]

Resources