Image to Video Shots
- What
- Cost
- Free
- Needs
- Before you start: read this whole install prompt, tell me in a few lines what this skill does and what installing it involves, and wait for my go-ahead before you do anything else.
- Install
- Copy the installer prompt below into your Muse — your agent does the rest.
Turn one to six static product images into moving 3–6-second video shots: a verbatim PRODUCT LOCK (shape, colour, logo, material, accessories) in every prompt, one shot role per image, ready-to-paste image-to-video prompts in Chinese and English (camera move, action, lighting, duration, aspect, negative constraints) for any model you choose (Seedance, Kling, Veo, Runway, Hailuo, Wan), a shot table plus a storyboard.json fragment, and a local Ken Burns fallback for every shot so a finished video can still be rendered with the bundled ffmpeg pipeline — whose default voice-over sends narration lines to Microsoft's Edge TTS service, or runs fully offline with --tts none.
Version:
Install
Copy the install package below, then paste it into Muse📌 Pinned version: commit 96c49b3The install prompt below already includes the vetting steps: your agent follows the community checklist before installing anything with executable code. Want more?
Before you start: read this whole install prompt, tell me in a few lines what this skill does and what installing it involves, and wait for my go-ahead before you do anything else. Prerequisites: none for the install itself: no account, no API key, no paid service, and nothing else to install first. For using the skill afterwards, read this first — two use routes, both disclosed in full in point 2 before either ever happens: (1) the main route in SKILL.md writes image-to-video prompts for an external video-generation model I choose myself (examples named in SKILL.md: Seedance / Kling / Veo / Runway / Hailuo / Wan); that model is not in this folder, no code in this folder calls it, and any account, API key, paid plan or terms for it are that provider's, not this skill's — if I use one, my reference product image and its prompt leave this machine for that provider, by my own pasting or submission. (2) The bundled local fallback, scripts/assemble.py, needs Python 3 with Pillow, NumPy and edge-tts (repository requirements.txt: pillow>=10, numpy>=1.24, edge-tts>=6.1), plus ffmpeg (with libass) and ffprobe on PATH, plus a CJK font for subtitles (make_subs.py detects one via the local fc-list, looking for Noto Sans CJK SC / Source Han Sans SC / PingFang SC / Microsoft YaHei / WenQuanYi Zen Hei) — none of that is installed by this install. On its default --tts edge setting, assemble.py also uses the network: each narration line is sent to Microsoft's free Edge online TTS service through the edge-tts library, with no key and no account (see point 2); --tts none avoids the network entirely. Install "image-to-video-shots" for me. It turns one to six static product images (white-background main images, scene images or detail images) into moving 3–6-second shots for an ecommerce product video: first write a PRODUCT LOCK from looking at the images (shape, colour, logo/text, material, accessories — carried verbatim into every prompt, so the model must not change the product), assign each image one shot role only (white-background: slow push-in or 360° orbit if supported, product still, light sweeping; scene: slight lateral move or a hand entering the frame; detail: macro push-in; selling-point/text image: static or extremely slow push so text does not warp), then write one image-to-video prompt per image (subject → action → camera move → lighting/mood → duration/aspect → constraints, in Chinese and in English — SKILL.md notes most models parse English best — plus a first-frame/last-frame mode and negative constraints where the model supports them), and give every shot a local Ken Burns fallback motion (zoom_in / pan_left / punch and the other motion values of the bundled assemble.py) so a video can still be made with no video model at all. Delivery is a shot table (number, image, prompt, fallback motion, duration) plus a shots fragment I can paste directly into storyboard.json. Repository: https://github.com/xianyu110/ecommerce-video-skills (the skill is the whole skills/image-to-video-shots/ folder at the pinned commit: SKILL.md plus its scripts/ folder, 5 files) Pinned version: install the code at commit 96c49b349b7d975bda8f05ce6669c1d33500c269 exactly. Do not substitute a newer version. If this commit is unreachable, stop and tell me. 1. Clone https://github.com/xianyu110/ecommerce-video-skills into a temporary folder, check out commit 96c49b349b7d975bda8f05ce6669c1d33500c269, and copy the skills/image-to-video-shots/ folder from that checkout. Then compare every file in the folder with the fingerprints recorded for this listing on 2026-10-19: [FINGERPRINTS] - SKILL.md: SHA-256 4c581f78ef7c43985992205131ce9c02ef40a0e7669bba3da24bd3ccf626f7e6 - scripts/assemble.py: SHA-256 e55ed538d3662133724b9d1154ee8f6f9419253636388fbb9d8a54c280528048 - scripts/make_bgm.py: SHA-256 f02581b6d77422767b839f0c3b8a1475f74e9910e7a5efc817b71ba97eb5783e - scripts/make_subs.py: SHA-256 8c8e9208e5dee5db0f92ed3e5fc9850f99896be5ca02792d79b5f35b26f89cef - scripts/tts_edge.py: SHA-256 f3263ce63fa29e106cc38be0cec2daf564e9609e37c99c3709eef0136c0a9d76 If a file does not match, it changed since the listing was prepared: do not install it yet, tell me what you found and let me decide. 2. Read SKILL.md in full and read all four scripts in scripts/ (assemble.py, make_bgm.py, make_subs.py, tts_edge.py), and tell me in plain words: what the skill does when used, which services it connects to, whether it reads or sends any personal information or keys, and anything that seems unusual. Stop on any red flag and tell me before going further. Confirm these points from the files: - The skill folder holds 5 files only: SKILL.md (5,576 bytes) and four Python scripts in scripts/ (assemble.py 14,821 bytes, make_bgm.py 2,909 bytes, make_subs.py 5,751 bytes, tts_edge.py 4,628 bytes). The four scripts are byte-identical copies of the same-named scripts at the repository root (scripts/), kept in sync by tools/sync_scripts.py (whose map assigns exactly these four scripts to image-to-video-shots; the same four copies also sit in skills/ffmpeg-auto-assemble/scripts/): the skill is self-contained in its own folder — assemble.py imports make_subs, make_bgm and tts_edge from its own folder only, and needs no file from elsewhere in the repository — not the other 12 skills, not the root scripts/, not the README, and not the repository requirements.txt at install time. SKILL.md's one bundled-script command calls the assemble.py sitting next to it (python scripts/assemble.py storyboard.json …, relative to the skill folder). - Nothing is sent anywhere during installation itself; the only download at install time is the skill folder from GitHub at the pinned commit. No script is run during installation, no key is asked for, and there is no telemetry in the folder. The folder reads no API keys, no environment variables and no credential files — confirmed in all four scripts. - What leaves this machine at use time, disclosed here before it ever happens — using the skill is a separate step that only starts when I ask for shots or a video, and there are two distinct sends, on two different routes; do not merge them: (a) The SKILL.md prompt route — the main route: SKILL.md itself contains no API client, no URL for a video service and no key handling, and it sends nothing by itself; its prompts are text written locally, between you and me. A send happens only if and when I take a finished prompt to an external image-to-video model or service I choose myself (SKILL.md names Seedance / Kling (可灵) / Veo / Runway / Hailuo / Wan as examples, not as endpoints this folder contacts): then I — or you, only if I explicitly ask you to on that service — submit the reference product image itself (first frame, and a second image as last frame in first/last-frame mode) plus the prompt text, which includes the PRODUCT LOCK describing my product's shape, colour, logo/text, material and accessories, its action, camera move, lighting, duration and aspect, to that provider, under that provider's own account, key, pricing and terms, and the generated video comes back from that provider. Choosing no external model sends nothing on this route. (b) The bundled fallback's default voice-over: scripts/tts_edge.py (called by assemble.py unless I pass --tts none) hands each narration line — the text of the storyboard's line field (or the localised field I choose, e.g. line_en), one line per shot — together with the voice name (default zh-CN-YunxiNeural, or the storyboard's / my chosen voice), rate and pitch, to the edge-tts library (imported lazily in tts_edge.py as edge_tts; its calls are edge_tts.Communicate(text, voice, rate=rate, pitch=pitch).save(mp3) and, for --list, edge_tts.list_voices()), which sends them to Microsoft's Edge online text-to-speech service and downloads the synthesised MP3 audio back; tts_edge.py's own docstring states it needs network access to the Edge TTS service. No API key, account or payment is involved on this route, and nothing else is sent by it: not my product images, not my video clips, not the storyboard file itself — only the narration text in the line fields, the voice name, the rate and the pitch, one request per line, retried up to 3 times on network failure. Results are cached locally under a hash of (text, voice, rate, pitch), so re-running the same line makes no network call for it. The standalone tts_edge.py --list <locale> mode also queries that same Microsoft service for its voice list, sending no narration text. With assemble.py --tts none, this route sends nothing at all: shot durations are estimated from the narration's character count and the render is a silent, fully offline preview. - The local-only parts at use time: the PRODUCT LOCK, the shot-role choices, the prompt templates (Chinese and English), the first/last-frame wording, the negative constraints (deformed product, melting, extra logos, changed colour, warped text, extra fingers, flicker, watermark), the checklist and the failure-fix table in SKILL.md all stay local, between you and me, until I decide to submit a prompt under route (a) above. The fallback render itself is local: assemble.py drives the locally installed ffmpeg/ffprobe (Ken Burns motion on stills or trimmed video clips, xfade transitions, audio decode, two-pass loudness normalisation to about -14 LUFS) and Pillow/NumPy (still preparation, blurred-fill backgrounds); make_bgm.py synthesises the default background music locally with NumPy (a royalty-free bed, no download), or assemble.py loops a music file I supply locally; make_subs.py builds the ASS/SRT subtitles locally (it only runs the local fc-list command to detect a CJK font). SKILL.md's link to the sister repository ecommerce-image-skills (for making a white-background/scene/selling-point base image first) is a plain GitHub link that nothing opens during installation or use. Rules from SKILL.md: every prompt carries the PRODUCT LOCK, one main action per shot and as little product movement as possible, text/selling-point images get static or extremely slow moves only, aspect matches the platform (main-image video usually 1:1 / 3:4, feed 9:16), and no model parameters the chosen model does not support. - Do not install Pillow, NumPy, edge-tts or ffmpeg during this install, do not run any of the four scripts, do not submit any image or prompt to any video-generation model, and do not render any video: setup of the use-time dependencies and any decision to use an external video model are my decisions, later, when I actually ask for shots. 3. When I say "yes, install", install it as a skill: copy the whole image-to-video-shots folder into the agent's skills directory, in a folder named "image-to-video-shots", keeping all 5 files (SKILL.md at its root and the four scripts in its scripts/ subfolder). A manual clone followed by copying the skills/image-to-video-shots folder into ~/.claude/skills/ is the route described here; any other route is fine only as long as every installed file matches its fingerprint. 4. Verify with no network calls: frontmatter valid (name: image-to-video-shots), all 5 files in place with matching fingerprints. Do not run assemble.py, make_bgm.py, make_subs.py or tts_edge.py to verify. 5. Report what was installed, where, and what I still need to do myself (for example: provide 1–6 product images (clearer is better, 1000px or more recommended in SKILL.md) and the platform, and optionally up to 3 selling points, a target duration, a style and which video model I have available; install Python 3 with Pillow, NumPy and edge-tts and have ffmpeg (with libass) and ffprobe on PATH, and a CJK font available, if I want the local fallback render; decide myself whether to submit a reference image plus prompt to an external video-generation provider under its own account/key/pricing, and whether the fallback voice-over may send my narration lines to Microsoft's Edge TTS service or should run with --tts none instead; using the skill is a separate step that only starts when I ask for it, and the use-time sends disclosed above happen only then, on the route I choose). GitHub is optional: if I have a GitHub account or the gh CLI, you may use it; otherwise public access is fine. Never require it unless it's in the prerequisites above. Rules: don't touch anything outside the temp folder and the install target. If anything looks off, stop and ask me.
Saved to your recent installs. Find it anytime on /connect.
Questions
How do I install a build?
Every product page includes a copy-paste install prompt. Paste it into your Muse and it sets the build up for you — no manual configuration.
Where does my money go?
Straight to the seller. Skill Harbor never processes payments: checkout happens on the seller’s own page, usually Stripe.
What does the ✓ next to a creator’s name mean?
It means we confirmed the identity of the person behind the listing. It says nothing about the code itself — always check a build before installing it.