---
name: slideshow-video
description: Turn images into a smooth slideshow video with sub-pixel Ken Burns pans and zooms, crossfades, per-slide captions and a music bed that fades out, in any format (9:16, 16:9, 1:1, 4:5). Images and music can come from Kenerate (generate_image, generate_music) or the user. Use when the user wants a slideshow, photo video, Ken Burns effect, image montage, recap / memories video, real-estate or product slideshow, or images set to music.
compatibility: Needs Python 3.9+ with Pillow and ffmpeg; uses the Kenerate MCP for images and music when they have to be made.
metadata:
  author: kenerate
  version: "1.0"
  kenerate-tools: "generate_image generate_music upscale_image wait_for_generation"
---

# Slideshow video

Cheap and fast: stills plus local motion, with no per-second video credits. Rules: [references/KENERATE.md](references/KENERATE.md) (models and voices: [references/MODELS.md](references/MODELS.md), or the free `pick_model` / `pick_voice` tools).

## Ask the user
Images (theirs or generated), their order, seconds per slide (default 3.5), format, captions per slide, and music (their
track or a generated one).

## 1. Assets (Kenerate, optional)
- Images: `generate_image(prompt=..., aspect_ratio=<format>, model="kenerate/gpt-image-2.5-sunburst")`, one call per slide
  (`pick_model` / MODELS.md); use `reference_image_urls` + `kenerate/nano-banana-2.1` for a consistent character or product. Small or old photos:
  `upscale_image(model="image-upscaler", resolution="4k")` makes the zoom sharper.
- Music only if the user wants it (ask: music, voice-over, or silent?): `generate_music(prompt="<mood>, instrumental", instrumental=true, seconds=<slides x seconds>, engine="elevenlabs-music-v2.5")` for an exact length (kind `"music"`).

## 2. Render (local)
```
python <skill-dir>/scripts/slideshow.py --images "<url1>" "<url2>" "<url3>" \
  --seconds 3.5 --xfade 0.7 --transition fade --aspect 9:16 \
  --captions "Day one|The climb|Summit" --music "<music url>" \
  --out kenerate-out/slideshow-video/<project>.mp4
```
- A folder works too: `--images ./photos` (sorted by name).
- `--motion none` for static slides; `--fit blur` keeps whole images (no crop) over a blurred fill.
- `--transition` takes any xfade name (fade, dissolve, slideleft, circleopen, …) or `cut`.
- `--caption-style box|bold|minimal`; leave an entry empty (`a||c`) to skip a slide.

## Output
One MP4. The length is about slides x seconds; the music is trimmed and fades out over the last 2 s.

## If something fails
An image that fails to download: check the link (expired → `get_generation`). Very large images are fine (scaled once).
