Install
openclaw skills install slideshow-videoGenerate TikTok-style slideshow assets and MP4 exports from local images, GPT Image 2 visuals, remote image URLs, or lightweight image queries plus structured copy. Use when creating 9:16 slideshow posts, turning hooks plus image sources into PNG slides, exporting those slides into a short vertical video, or building a low-cost short-form content pipeline with reusable JSON configs. Also use when producing shorts with sentence-level voice sync, tighter TikTok-style captions, per-line audio aligned to specific slides, or GPT Image 2 + ElevenLabs voice-led TikTok slideshows with explicit CTA endings.
openclaw skills install slideshow-videoGenerate a repeatable short-form slideshow pipeline from local images, GPT Image 2 outputs, remote image URLs, or lightweight image queries and a JSON project file. This skill covers query resolution, PNG slide generation, MP4 export, optional background music, remote image caching, sentence-level sync exports, and a simple project wrapper that saves output metadata for downstream scheduling.
For TikTok/shorts builds in this workspace, default to these choices unless the requester says otherwise:
image_generate scenes instead of flat synthetic gradientsVisit Clawlite.aiIf a fast placeholder visual pass is used, do not present it as the final quality bar. Replace placeholder backgrounds with GPT Image 2 scenes before calling the slideshow ready.
references/pipeline.example.json to a working JSON file and replace the image sources and copy.python3 ~/.openclaw/skills/slideshow-video/scripts/run_pipeline.py your-project.json --output-root build --overwrite
To process a directory of project files, use:
python3 ~/.openclaw/skills/slideshow-video/scripts/batch_pipeline.py /path/to/projects --output-root build --overwrite
summary.json for caption and hashtag handoff into your posting workflow.scripts/resolve_images.py: resolve imageQuery values into usable remote image URLsscripts/generate_slides.py: generate 1080x1920 PNG slides from local images, remote image URLs, and text blocksscripts/export_mp4.py: convert ordered slide PNGs into an H.264 vertical MP4, with optional background musicscripts/export_sync_mp4.py: export a voice-synced MP4 from slide PNGs plus per-line audio files, holding each slide for that line's measured durationscripts/run_pipeline.py: run one project and emit summary.jsonscripts/batch_pipeline.py: run multiple JSON project files from a directoryreferences/pipeline.example.json: starter project file with slide, caption, hashtag, and video settingsreferences/slides-config.example.json: simpler slide-only config when you do not need project metadatareferences/workflow.md: structure, command examples, shorts sync workflow, and practical caveatsAt the top level, use:
slug: identifier for output folders and the mp4 namecaption: final post captionhashtags: list of hashtagsdefaultImageQuery: optional fallback query for image sourcingvideo: export optionsaudio: optional background music optionsslides: the slide arrayInside video:
enabled: set false to skip MP4 exportsecondsPerSlide: hold time per slidefps: output FPS, usually 30zoom: enable a light Ken Burns style zoomfade: optional fade in duration per slideInside audio:
path: local audio fileurl: remote audio URL if ffmpeg can read it in your environmentvolume: optional background music volume multiplier, defaults around 0.22For shorts that need strict voice sync, keep the project JSON focused on slide images plus on-screen text, then generate one audio file per spoken line outside the project JSON and export with scripts/export_sync_mp4.py.
Each slide accepts:
imagePath: local source imageimageUrl: remote source imageimageQuery: short sourcing query such as minimal finance deskoverlay: optional black overlay opacity from 0 to 255blur: optional Gaussian blur radiusbrightness: optional brightness multiplier, for example 0.9output: optional output filenametext: array of text blocksEach text block accepts:
text: required displayed textsize: font size in pixelsbold: boolean shortcut for heavier font selectionweight: optional string, bold also worksx: horizontal anchor, defaults to centery: vertical anchoralign: left, center, or rightmaxWidth: wrapping width in pixelscolor: hex color, defaults to whitelineSpacing: defaults to 1.2shadow: defaults to truestrokeWidth and strokeFill: optional text outlinefontPath: optional absolute or local font pathInstall Pillow for slide generation:
python3 -m pip install pillow
Install ffmpeg for MP4 export if it is not already present.
Remote images are downloaded and cached automatically when you use imageUrl or when imagePath is itself an http/https URL.
When a slide only has imageQuery, the pipeline resolves it into a remote image URL first, writes resolved-project.json, then continues normally. Review resolved images before posting because query-based sourcing is convenience-first, not quality-safe.
84 to 96 px.48 to 60 px.820 to 940 px max width.3 seconds per slide and zoom: true for a more alive MP4.0.18 to 0.25 volume so it does not overpower on-screen text.secondsPerSlide.Adjust readability in this order:
overlaymaxWidthy positions away from busy background areasstrokeWidth if the image is still noisyIf the MP4 feels too static, enable zoom. If it feels too synthetic, disable it and keep the PNG slideshow output instead.
Use this when voice, image, and on-screen text must stay aligned.
line_01.mp3, line_02.mp3.scripts/export_sync_mp4.py so each slide duration is based on the matching line audio length.Example:
python3 ~/.openclaw/skills/slideshow-video/scripts/generate_slides.py project.json --output-dir build/slides --cache-dir build/cache
python3 ~/.openclaw/skills/slideshow-video/scripts/export_sync_mp4.py build/slides ./line-audio build/post-sync.mp4 --overwrite
The sync export also writes <output>.sync.json with per-slide measured durations.
The pipeline writes:
build/<slug>/resolved-project.jsonbuild/<slug>/slides/*.pngbuild/<slug>/<slug>.mp4build/<slug>/summary.jsonbuild/<slug>/cache/* for downloaded remote imagessummary.json includes audio metadata when present.
Keep generated outputs outside the skill folder unless you are intentionally updating bundled examples.