$npx -y skills add gooseworks-ai/goose-skills --skill render-cartoon-music-videoAssemble a cartoon / animated / hand-crafted music-video ad from a config — a sung song carries the whole narrative while N per-bar i2v clips (one recurring animated character, one look pack) are each cut to their BAR window from librosa beat-tracking and hard-concatenated on the
| 1 | # render-cartoon-music-video |
| 2 | |
| 3 | Assemble a **cartoon music-video** ad from a config: an animated / illustrated / hand-crafted |
| 4 | story (stop-motion felt-and-foam, claymation, 2D toon, cut-out) where a sung song is the entire |
| 5 | script and one recurring animated character carries every shot, cut to the bar with the climax |
| 6 | line on the drop. This capability is the **FREE, deterministic assembly** — cut-to-bar, |
| 7 | hard-concat, the logo bug + captions burn, and the solid-color end card. |
| 8 | |
| 9 | `scripts/config.example.json` is the worked example (Coinbase "Bet on anything", ~55s 1080×1920 |
| 10 | 9:16, 16 body bars + a 3s end card); `scripts/PIPELINE.md` maps every config block to its source |
| 11 | step and `scripts/README.md` documents the free assembly. |
| 12 | |
| 13 | ## Run |
| 14 | |
| 15 | This is the **FREE, deterministic** assembly stage — it spends nothing. The paid inputs are |
| 16 | separate capabilities: the sung song (`create-music-elevenlabs`, or a user-supplied mp3 + Whisper |
| 17 | word timings) beat-tracked with librosa so the BAR GRID sets the timeline; one locked recurring |
| 18 | character + one keyframe per bar in one look pack (`create-image-fal`, Nano Banana); and one |
| 19 | Seedance i2v clip per bar (`create-video-fal`). Given the song + `word-timestamps.json` + |
| 20 | `bars.json` + one clip per bar + the brand wordmark SVG, `render-cartoon-music-video` cuts each |
| 21 | clip to its bar window, hard-concats on the bar, burns the logo bug + captions, appends the |
| 22 | solid-color end card, and muxes the song under it → the master. Re-cuts reuse the existing song / |
| 23 | keyframes / clips and cost **$0**. |
| 24 | |
| 25 | ## Contract (the free assembly) |
| 26 | |
| 27 | - **The sung song carries the narrative — no separate VO.** The generated/supplied track IS the |
| 28 | bed (no VO to duck under); do not add a spoken voiceover or a second bed. |
| 29 | - **Plan the timeline AROUND the delivered song's BAR GRID.** Beat-track the song with librosa |
| 30 | (assume 4/4); one bar = one shot (default). Snap every tableau window to the bar boundaries — |
| 31 | never trim the song to a pre-planned grid. |
| 32 | - **Captions from the song's word timings, re-spelled against the locked lyrics.** Whisper |
| 33 | mishears shouted accents ("BETS" → "Hearts"); re-spell the timed tokens against the locked |
| 34 | lyric file (never edit lyrics to match Whisper). VEED-whisper white **bold sans** in the |
| 35 | **BOTTOM third** (Alignment 2, `margin_v` above the bottom-left logo bug), ~4–5 words per cue, |
| 36 | NO background pill; captions STOP at the end-card boundary. Never mid-frame — it covers the |
| 37 | character (fixed 2026-07). If the host ffmpeg lacks libass, render the cues as timed PIL PNG |
| 38 | overlays (ffmpeg `overlay=…:enable='between(t,st,en)'`) at the same bottom placement. |
| 39 | - **Land the climax line on the drop.** The climax tableau is timed so the payoff line sits on |
| 40 | the sub-bass drop; accent that line. |
| 41 | - **Persistent logo bug, suppressed on the end card.** Burn a white brand wordmark bottom-left |
| 42 | over the body bars (cairosvg → PIL from the real SVG), suppressed on the end card where the big |
| 43 | wordmark dominates. |
| 44 | - **End card via cairosvg + PIL from the real wordmark — never AI-render brand text.** Solid |
| 45 | brand-color card + white wordmark + subhead, holding ~3s WITH the song still playing under it |
| 46 | (afade-out over the tail — no silent tail). A diffusion model garbles a wordmark. |
| 47 | - **FFmpeg composite, deterministic, FREE.** Cut each clip to its bar window, hard-concat, burn |
| 48 | the logo bug + captions, append the end card, mux the song over the whole video with a 0.5s |
| 49 | afade tail, `loudnorm I=-14` → a 1080×1920 h264+aac master. No paid calls, no keys. When the host |
| 50 | ffmpeg lacks libass/drawtext, BOTH the captions and the logo bug are timed **PIL PNG overlays** |
| 51 | (`overlay=x:y:enable='between(t,st,en)'`), not an ASS burn. |
| 52 | - **QC PER SCENE, never just the master — the two failure modes are content, not assembly.** The |
| 53 | upstream keyframe/i2v steps can (a) drift the character **felt → smooth-3D "man"** partway |
| 54 | through and (b) hallucinate hands — realistic fingers in a hand macro, a **pointing finger** on a |
| 55 | "tap the phone" shot, or a |