render-food-product-sizzle
Assemble a wordless macro-tabletop food-product sizzle ad from a config — normalize fps and SAR across ~4 photorealistic macro clips (hands tearing, flat lay, bite, box hero), concat them, apply a global anti-AI grain pass (eq plus hqdn3d plus noise), composite the audio (a non-d
Install
npx skills add https://github.com/gooseworks-ai/goose-skills/tree/main/skills/ads/capabilities/render-food-product-sizzle
claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install gooseworks-ai-goose-skills@llmmart
git clone https://github.com/gooseworks-ai/goose-skills.git
The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole gooseworks-ai/goose-skills collection as a plugin from our marketplace. Git is the plain clone.
Skill manifest
render-food-product-sizzle
Assemble a food-product sizzle ad from a config: a wordless macro-tabletop photorealistic sizzle for a physical food / CPG product — tactile sunlit tabletop photography in a warm tungsten kitchen register, ~4 dynamic macro scenes (hands tearing, a flat lay, a partial-face bite, a box / pack hero) flowing into a static end card, carried by a non-diegetic acoustic music bed + a few diegetic SFX with NO voiceover. This capability is the FREE, deterministic assembly — normalized concat, the anti-AI grain pass, the audio (music bed + SFX) composite, the PIL end card, and the optional serif stat-callout pills.
scripts/config.example.json is the worked example (Lineage Provisions "Beef Sticks Sizzle", ~14s
1080×1920 9:16, ~4 macro scenes + a static end card); scripts/PIPELINE.md maps every config block
to its source step and scripts/README.md documents the free assembly.
Run
This is the FREE, deterministic assembly stage — it spends nothing. The paid inputs are separate
capabilities: ~4 photographic macro keyframes (create-image-fal, Nano Banana; the box / pack hero
grounds on the real product PNG); one locked-off, anti-shake i2v clip per keyframe (create-video-fal,
Seedance); and a non-diegetic acoustic / bluegrass bed (create-music-elevenlabs). Given the ~4
clips + the music bed + the diegetic SFX + the real logo PNG + the real product PNG,
render-food-product-sizzle normalizes fps / SAR, concats the body clips, applies the anti-AI grain
pass, composites the audio (bed + SFX at their cue points), composites the static PIL end card, burns
the optional serif callout pills, and muxes → the master. Re-cuts reuse the existing keyframes /
clips / music and cost $0.
Contract (the free assembly)
- Wordless — the music bed is the audio, no VO. A non-diegetic acoustic bed (no vocals) IS the bed; do not add a spoken voiceover. The brand name + claim land on the STATIC end card, never in the body.
- ~4 macro scenes, concat in order. Normalize fps / SAR across the body clips and concat them in their scene order (tear → flat-lay → bite → box-hero by default); the box / pack hero shows the REAL label (grounded on the product PNG upstream — the assembly must not re-render it).
- Anti-AI grain pass, applied globally. Apply
eq=contrast=1.06:saturation=0.93,hqdn3d=1.5:1.5:3:3,noise=alls=8:allf=t+uacross the whole video — the noise on a food macro is load-bearing for the tactile / photographic read, otherwise the sizzle looks AI-smooth. - Diegetic SFX on the tactile beats. Mix a crisp ~120ms snap on the fiber tear and a ~180ms tear on the box-open at their measured cue points — a couple of short hits, not a wall of sound. Time each to its beat, not a round number.
- Music bed with no sparse intro. The supplied / generated bed opens sparse — the upstream step trims the ~2.5s intro so it kicks in from frame 0; the assembly loudnorms + fades in / out to the master length.
- Static end card via PIL from the real logo + product PNG — never AI-render brand text. Solid /
ivory bg + the real logo PNG (upper third) + the real product PNG (centered, soft shadow) + a serif
heritage headline + a CTA, held ~3s WITH the music still playing under it (fade the tail — no silent
tail). A diffusion model garbles a wordmark and the packaging. On macOS pick a serif with the
middle-dot glyph (use
·). - Optional serif stat-callout pills at beats. Ivory-or-brand-color pill + serif type at
choreographed windows. Write any
%string to a textfile and use ffmpegdrawtexttextfile=+expansion=none— a raw%is read as a strftime spec and renders garbage. - FFmpeg composite, deterministic, FREE. Concat the body clips, grain-pass, composite the audio
(bed + SFX), append the PIL end card, burn the callouts, mux with a fade tail,
loudnorm→ a 1080×1920 h264+aac master (~14s). No paid calls, no keys.
Files (goose-skills)
-
scripts
-
config.example.json 10.6 KB
{ "_comment": "Lineage Provisions 'Beef Sticks Sizzle' food-product sizzle — THE WORKED EXAMPLE. Copy to config.json and edit. A ~14s warm-tungsten macro-tabletop 9:16 sizzle for a physical grass-fed beef-stick product: WORDLESS (no VO), driven by a non-diegetic bluegrass bed + diegetic snap/tear SFX. Pipeline: (1) ~4 photographic macro keyframes via create-image-fal (the box hero grounds on the REAL product PNG); (2) one locked-off anti-shake create-video-fal i2v clip per keyframe (tear / flat-lay / bite / box-hero); (3) an ElevenLabs Music ~22s bluegrass bed trimmed of its 2.5s sparse intro + two ffmpeg-lavfi diegetic SFX; (4) a STATIC PIL end card (real Lineage logo PNG + real product PNG + serif headline + CTA) + ffmpeg filter_complex concat + anti-AI grain pass + audio composite + 5 serif stat-callout pills. Master 1080x1920 h264+aac, ~14.04s (24fps). See scripts/PIPELINE.md for the source scripts.", "brand_name": "Lineage Provisions", "campaign": "Beef Sticks Sizzle", "title": "Grass-fed. Air-dried. Nothing else.", "width": 1080, "height": 1920, "fps": 24, "aspect_ratio": "9:16", "duration_sec": 14.04, "look_pack": { "name": "WARM_TUNGSTEN_KITCHEN", "palette_anchors": [ "ivory #F6F1E7 background tone", "ranch brown #3B2A1E shadows", "dried-blood red #7A1F1F on the beef", "honey-gold highlights", "warm tungsten window daylight, slightly desaturated" ], "style_descriptor": "Tactile macro-tabletop food photography, warm tungsten kitchen register, linen + wood + butcher paper + cast iron surfaces, warm window daylight raking from camera-left, slight 35mm film grain. Photographic, NOT cinematic, NOT smooth. iPhone-shot daytime kitchen feel, NOT studio polish. Sharp focus on the product. 1080x1920 vertical.", "negative_tail": "NO studio polish, NO bokeh, NOT shallow DOF, NO smooth digital 3D render, NO AI-illustration look. NO invented label text, NO captions, NO brand wordmarks rendered by the model (the brand appears only on the composited end card). NO faces beyond a partial jaw / hands crop. Vertical 9:16 composition.", "_note": "ONE look pack drives all 4 keyframes so the sizzle reads as one spot. Palette sampled from the Lineage packaging + site (brand-research/visual-identity.md). The 'no invented label text' negative is load-bearing — the box hero grounds on the real product PNG so the label is real." }, "keyframe_engine": { "atom": "create-image-fal", "aspect_ratio": "9:16", "product_ref": "S04 (box hero) passes the real meat-sticks-classic.png (+ the variety pack) as media[role=image] with 'reproduce the label EXACTLY, invent no text'; S01/S02/S03 pass no product ref", "_note": "See scripts/.hf_S04.json — it threaded the real box + variety-pack PNGs as media_input and instructed the model to reproduce the label exactly. NEVER include readable brand text in a prompt — the model garbles it into typos." }, "clip_engine": { "atom": "create-video-fal", "duration_sec": 4, "resolution": "720p", "aspect_ratio": "9:16", "submission": "sequential", "anti_shake_tail": "Camera is locked off, tripod-stable. NO shake, NO wobble, NO earthquake. Slow, deliberate motion only.", "_note": "Locked-off, anti-shake. Submitted SEQUENTIALLY (gen_clips_hf.sh) to avoid the burst-credit reserve gate. Per-scene durations match tStart/tEnd — S01/S02 3s, S03/S04 4s." }, "music": { "atom": "create-music-elevenlabs", "provider": "elevenlabs", "model": "music_v1", "request_length_ms": 22000, "trim_intro_sec": 2.5, "target_length_sec": 17.04, "fade_in_sec": 0.4, "fade_out_sec": 1.0, "loudnorm_i": -16, "prompt": "Upbeat warm bluegrass instrumental. Picked banjo as the lead voice with a supportive flat-picked acoustic guitar and very light brush percussion. Friendly Americana, ranch-honest, heritage food-brand register. NO vocals, NO fiddle solo, NO heavy drums. Mid-tempo, major key, walking forward groove. The banjo and guitar should start IMMEDIATELY with a clear rolling phrase — do NOT begin with silence or a long sparse intro. Builds slightly in energy toward the end with one tasteful banjo flourish around the 16-second mark.", "force_instrumental": true, "outputs": { "raw": "audio/music_raw_v2.mp3", "bed": "audio/music-bed-v2.mp3" }, "_note": "gen_music_v2.py requested 22s to allow the 2.5s sparse-intro trim; build_master_v2.sh step 1 trims start=2.5, loudnorm I=-16, fade in 0.4s + fade out 1.0s, clamps -t to the FULL master length. target_length_sec MUST equal duration_sec (body, 14.04) + end_card.hold_sec (3.0) = 17.04 so the bed plays under the end card and fades on the tail — audio_mix.music_over_end_card is true, so a 14.04 bed would leave the 3s end card silent. No artist names (ElevenLabs Music ToS filter)." }, "sfx": { "engine": "ffmpeg-lavfi-anoisesrc", "script": "make_sfx.sh", "cues": [ { "name": "snap", "wav": "audio/snap.wav", "dur_ms": 120, "cue_t": 1.5, "note": "crisp white-noise crack at the fiber tear (S01), highpass 900 / lowpass 5500, acompressor" }, { "name": "tear", "wav": "audio/tear.wav", "dur_ms": 180, "cue_t": 11.0, "note": "pink-noise pull at the box-open / hand reach (S04), highpass 350 / lowpass 4000" } ], "_note": "Two short diegetic hits synthesized with ffmpeg lavfi anoisesrc (make_sfx.sh) at measured cue points." }, "scenes": [ { "id": "S01", "role": "MACRO_TEAR", "t_start": 0.0, "t_end": 3.0, "uses_product_ref": false, "keyframe_prompt": "Slow-motion macro: two weathered hands hold a dark grass-fed beef stick at a break line on butcher paper, coarse meat fibers visible, a few crumbs. Warm window daylight from camera-left.", "motion_hint": "The two weathered hands tear the dark grass-fed beef stick apart; real coarse meat fibers stretch and separate at the break line; a few crumbs fall straight down with gravity; hands stay in frame, daylight steady from camera-left." }, { "id": "S02", "role": "FLAT_LAY", "t_start": 3.0, "t_end": 6.0, "uses_product_ref": false, "keyframe_prompt": "Top-down flat lay of three beef sticks fanned on butcher paper next to a single sprig of rosemary and flaky salt. Warm daylight, slight film grain.", "motion_hint": "Gentle slow 2% top-down push-in on the flat lay; a tiny breath of air moves one rosemary leaf slightly; salt grains catch the light; otherwise still life." }, { "id": "S03", "role": "BITE", "t_start": 6.0, "t_end": 10.0, "uses_product_ref": false, "keyframe_prompt": "Side profile, ONLY the jaw and lower lip in frame (eyes and forehead cropped OUT), a man about to bite a beef stick. Background defocused warm ivory-brown, consistent stubble shadow.", "motion_hint": "The man bites cleanly into the beef stick — a clean tear, then a slow chew; background stays defocused warm ivory-brown; stubble shadow stays consistent." }, { "id": "S04", "role": "BOX_HERO", "t_start": 10.0, "t_end": 14.04, "uses_product_ref": true, "keyframe_prompt": "Locked medium shot. The EXACT Lineage Provisions 100% Grass-Fed Beef Sticks Original box (from the reference PNG) stands upright on a light oak kitchen counter with a linen runner. A man's hand enters from the right edge, fingers reaching to lift one beef stick out. A second variety pack box (from the reference) sits in soft focus behind. Reproduce the box label EXACTLY as in the reference — invent no text, no captions, no stickers.", "motion_hint": "The hand enters from the right, fingers gently grasp one beef stick and lift it slowly straight up out of the box; the box itself stays put; the variety pack stays still in soft focus behind; daylight from camera-left holds steady." } ], "end_card": { "engine": "pil", "script": "make_end_card.py", "background": "#F6F1E7", "brand_logo_png": "brand-assets/logo/lineage-logo.png", "product_png": "brand-assets/products/meat-sticks-classic.png", "logo_scale": 0.62, "product_scale": 0.62, "headline": "Grass-fed. Air-dried. Nothing else.", "headline_font": "Times New Roman / Georgia (serif heritage)", "cta": "30% off your first subscription · lineageprovisions.com", "hold_sec": 3.0, "_note": "make_end_card.py composes scene-S05.png entirely in PIL — ivory #F6F1E7 bg + the real Lineage wordmark PNG (upper third) + the real meat-sticks-classic product PNG (centered, soft shadow) + the serif headline + the CTA. NEVER AI-rendered. The demo's Memorial-Day promo added the '30% off' tag. Uses a middle dot ' · ' (macOS serif em-dash gap)." }, "stat_callouts": { "enabled": true, "style": "serif-pill", "font": "Georgia Bold / Big Caslon (serif)", "_note": "The demo burned 5 serif stat-callout pills (ivory or dried-blood-red pill, serif type) at choreographed beats via build_master_v2.sh drawtext. % strings ('100% GRASS-FED', '30% OFF') were written to textfiles (c1.txt / c5.txt) with expansion=none — drawtext reads a raw % as a strftime spec.", "callouts": [ { "text": "100% GRASS-FED + GRASS-FINISHED", "t_start": 0.6, "t_end": 2.4, "pill": "ivory" }, { "text": "20G PROTEIN", "t_start": 2.7, "t_end": 4.7, "pill": "dried-blood-red" }, { "text": "0 SEED OILS · 0 FILLERS", "t_start": 5.0, "t_end": 7.0, "pill": "ivory" }, { "text": "ANCESTRAL RECIPE / 54 iterations · 2 years", "t_start": 7.5, "t_end": 9.5, "pill": "ivory" }, { "text": "30% OFF FIRST SUBSCRIPTION", "t_start": 13.5, "t_end": 14.04, "pill": "dried-blood-red" } ] }, "grain_pass": { "enabled": true, "filter": "eq=contrast=1.06:saturation=0.93,hqdn3d=1.5:1.5:3:3,noise=alls=8:allf=t+u", "_note": "Anti-AI-look grain applied globally in build_master_v2.sh so the sizzle doesn't read AI-smooth." }, "audio_mix": { "loudness_lufs": -16, "duck_under_vo": false, "music_over_end_card": true, "audio_fade_out_sec": 1.0, "_note": "The bluegrass bed is the full audio bed — no VO to duck under. snap.wav (~1.5s) + tear.wav (~11s) mix in at their cue points. The bed plays UNDER the end card and fades out over the tail — no trailing silence." }, "post_production": { "music": { "default": "on", "note": "non-diegetic bluegrass bed (no vocals), sparse intro trimmed, loudnorm + fades" }, "sfx": { "default": "on", "note": "diegetic snap (fiber tear) + tear (box-open) at measured cue points" }, "grain": { "default": "on", "note": "anti-AI-look grain (eq + hqdn3d + noise) applied globally" }, "stat_callouts": { "default": "on", "note": "5 serif stat-callout pills at beats (protein / ingredients / provenance / promo)" }, "end_card": { "default": "on", "note": "static PIL end card (real logo PNG + real product PNG + serif headline + CTA), music under it" } } } -
PIPELINE.md 5.1 KB
# Pipeline — food-product sizzle How `config.example.json` maps to the real production steps. This ships a **config + this map**, not a bundled runner: the worked example (Lineage Provisions "Beef Sticks Sizzle") was produced by per-project scripts (`gen_keyframes` / `.hf_S0*.json`, `gen_clips_hf.sh`, `gen_music_v2.py`, `make_sfx.sh`, `make_end_card.py`, `build_master_v2.sh`). Drive the whole run via a control-plane video orchestrator, or reference those steps directly. The five steps run **in order** because each depends on the last: the photographic keyframes seed the i2v clips, the clips set the body length, the music bed + SFX are cut to the master, the PIL end card composites from the real logo + product PNG, and assembly stitches all of it with the grain pass + audio composite + optional callouts. ## Field → source-step map | Config field | Phase | Source step / script | Paid? | |---|---|---|---| | `look_pack.style_descriptor`, `look_pack.negative_tail`, `look_pack.palette_anchors` | 1 Keyframes | threaded verbatim into every keyframe prompt | (defines cost) | | `scenes[].keyframe_prompt`, `scenes[].uses_product_ref`, `keyframe_engine` | 1 Keyframes | `create-image-fal` macro stills, 9:16 (box hero grounds on the real product PNG) | **PAID** | | `scenes[].motion_hint`, `clip_engine` | 2 Clips | `create-video-fal` i2v, locked-off anti-shake, 3–4s | **PAID** | | `music.prompt`, `music.request_length_ms`, `music.model` | 3 Music | ElevenLabs Music ~22s acoustic bluegrass | **PAID** | | `music.trim_intro_sec`, `music.target_length_sec`, `music.fade_in_sec`/`.fade_out_sec`, `music.loudnorm_i` | 3 Music | trim the 2.5s sparse intro, loudnorm, fades | free | | `sfx.cues` | 3 SFX | ffmpeg lavfi `anoisesrc` → `snap.wav` / `tear.wav` at cue points | free | | `end_card` | 4 End card | PIL — bg + real logo PNG + real product PNG + serif headline / CTA | free | | `stat_callouts` | 4 Assembly | ffmpeg `drawtext` serif pill callouts at beats | free | | `grain_pass`, `scenes[].t_start/t_end`, `audio_mix` | 4 Assembly | ffmpeg `filter_complex` concat + grain + audio composite + end card | free | ## 1. Keyframes → `create-image-fal` (config: `scenes[].keyframe_prompt`, `look_pack`, `keyframe_engine`) [PAID] Per scene, build the prompt as `look_pack.style_descriptor` + `scenes[i].keyframe_prompt` + `look_pack.negative_tail`, at 9:16. The box / pack hero (`uses_product_ref: true`) passes the REAL product PNG as `media[role=image]` with "reproduce the box label EXACTLY, invent no text". Texture-only shots (tear, flat-lay, bite) pass no product ref. The "NO studio polish, NO bokeh, NO invented label text" negative is load-bearing. Review all before step 2. ## 2. Clips → `create-video-fal` i2v (config: `scenes[].motion_hint`, `clip_engine`) [PAID] Per keyframe, build the prompt as `scenes[i].motion_hint` + `clip_engine.anti_shake_tail` and call image-to-video off the clean keyframe, 9:16, at the scene's duration (3–4s). **Locked-off, anti-shake** — every prompt ends with "Camera is locked off, tripod-stable. NO shake, NO wobble. Slow, deliberate motion only." Submit **sequentially** (burst-credit reserve). The motion IS the tactile beat: the tear parts the fibers, a gentle push-in on the flat lay, a clean jaw-line bite, a hand lifting one stick straight out of the box. ## 3. Music + SFX → ElevenLabs Music + ffmpeg lavfi (config: `music`, `sfx`) [PAID music] ElevenLabs Music requests ~22s of upbeat acoustic bluegrass (banjo + guitar + light brush percussion, NO vocals, no artist names). Then **trim the ~2.5s sparse intro** (`atrim=start=2.5`), `loudnorm`, and fade in / out to the master length. `make_sfx.sh` synthesizes two diegetic hits with ffmpeg lavfi `anoisesrc` — a crisp ~120ms `snap.wav` (white noise, fast envelope) at the fiber-tear cue (~1.5s) and a ~180ms `tear.wav` (pink noise) at the box-open cue (~11s). Time each to its beat. ## 4. End card + assembly → `make_end_card.py` + `build_master_v2.sh` (config: `end_card`, `stat_callouts`, `grain_pass`, `audio_mix`) - `make_end_card.py`: composes the STATIC end card entirely in PIL (NO AI) — the ivory (or brand-color) bg + the real logo PNG (upper third, ~62% width) + the real product PNG (centered, soft shadow) + a serif heritage headline + a smaller CTA line. **Never AI-render the lockup.** On macOS pick a serif with the middle-dot glyph (use ` · `). - Assembly (`build_master_v2.sh`): normalize fps / SAR, concat the ~4 body clips, apply the anti-AI grain pass GLOBALLY (`eq=contrast=1.06:saturation=0.93,hqdn3d=1.5:1.5:3:3,noise=alls=8:allf=t+u`), composite the audio (music bed + `snap.wav` + `tear.wav` at their cue points, loudnorm), append the static end card holding ~3s WITH the music under it (fade the tail — no silent tail), and burn the OPTIONAL serif stat-callout pills at their beats → `edits/master-final.mp4` (1080×1920, 24fps, h264 + aac, ~14s). **Write `%` strings to a textfile and use `textfile=` + `expansion=none`** — ffmpeg `drawtext` reads a raw `%` as a strftime spec. Re-cuts (new callout timing, swapped end card, re-timed SFX cues, grain-pass toggle) reuse the existing keyframes / clips / music and cost **$0** — only steps 1–3 spend. -
README.md 3.2 KB
# render-food-product-sizzle scripts — the FREE assembly `render-food-product-sizzle` is the **deterministic, $0 assembly stage** of the food-product sizzle format. The paid stages (the ~4 photographic macro keyframes, the ~4 locked-off i2v clips, the non-diegetic music bed) are separate capabilities — `create-image-fal`, `create-video-fal`, `create-music-elevenlabs`. This capability spends nothing: it takes the ~4 clips + the music bed + the diegetic SFX + the real logo PNG + the real product PNG and stitches the finished master. Re-cuts (new callout timing, a swapped end card, re-timed SFX cues, a grain-pass toggle) reuse the existing keyframes / clips / music and cost **$0**. `config.example.json` is the worked example (Lineage Provisions "Beef Sticks Sizzle", ~14s 1080×1920). `PIPELINE.md` maps every config block to its source step. This README documents the FREE assembly pieces that `render-food-product-sizzle` owns. ## 1. Static end card — PIL from the real logo + product PNG, no AI text The end card is composed **entirely in PIL** (NO AI): the ivory (or brand-color) bg + the real logo PNG (upper third, ~62% width) + the real product PNG (centered, with a soft shadow) + a serif heritage headline + a smaller CTA line. The brand text is **never** AI-rendered — a diffusion model garbles a wordmark and the packaging. On macOS pick a serif with the em-dash / middle-dot glyph (use ` · `). It holds ~3s after the body with the music still playing under it. ## 2. Diegetic SFX — ffmpeg lavfi, on the tactile beats Two short diegetic hits are synthesized with ffmpeg lavfi `anoisesrc` (NO AI): a crisp ~120ms snap (white noise, fast envelope, highpass / lowpass, `acompressor`) on the fiber tear, and a ~180ms tear (pink noise, low-end roll) on the box-open. They mix in at their **measured cue points** (~1.5s and ~11s in the demo), not round numbers — a couple of hits, not a wall of sound. ## 3. Music bed — no vocals, no sparse intro The supplied / generated acoustic-bluegrass bed (no vocals — no VO to duck under) opens sparse; the upstream step trims the ~2.5s intro so it kicks in from frame 0. The assembly `loudnorm`s it and fades it in / out to the master length, playing it UNDER the end card with a fade tail (no silent tail). ## 4. FFmpeg composite FFmpeg stitches the master: normalize fps / SAR across the ~4 body clips, concat them in scene order, apply the anti-AI grain pass GLOBALLY (`eq=contrast=1.06:saturation=0.93,hqdn3d=1.5:1.5:3:3,noise=alls=8:allf=t+u` — load-bearing for the tactile / photographic read), composite the audio (music bed + `snap.wav` + `tear.wav` at their cues), append the PIL end card, burn the OPTIONAL serif stat-callout pills at their beats, mux with a fade tail, and `loudnorm`. Output is a 1080×1920 h264 + aac master (~14s). Deterministic, no paid calls, no keys. **`%` in a callout** — ffmpeg `drawtext` reads a raw `%` as a strftime spec; write the callout string to a textfile and use `textfile=` + `expansion=none` (see the source `build_master_v2.sh` `c1.txt` / `c5.txt`). **No libass needed** — the sizzle body carries no burned captions (it is wordless); the stat-callout pills are `drawtext` / `drawbox` overlays, not subtitle events.
-
-
tests
-
smoke-test.md 1.6 KB
# Smoke Test Given the ~4 macro-scene i2v clips (locked-off, anti-shake — hands tearing, a flat lay, a bite, a box / pack hero, the hero showing the REAL label), a non-diegetic acoustic music bed, a couple of diegetic SFX (snap, tear), and the real logo + product PNG, `render-food-product-sizzle` assembles the master: normalize fps / SAR, concat the clips in scene order, apply the anti-AI grain pass, composite the audio (bed + SFX at their cue points), append a static PIL end card, burn the optional serif stat-callout pills, and mux → 1080×1920 h264+aac (~14s). Pass when the assembly runs to a valid MP4 and: - ~4 macro scenes concat in order; the box / pack hero shows the REAL label (no invented packaging text — grounded on the product PNG upstream, not re-rendered here); - the anti-AI grain pass is applied globally (the sizzle does not read AI-smooth); - the diegetic SFX land on their tactile beats (snap on the tear, tear on the box-open); - the music bed carries under the whole video with no sparse dead intro and a fade tail (no silent tail); it is the entire audio bed — NO separate VO; - the optional serif stat-callout pills burn at their beats (`%` strings via `textfile=` + `expansion=none`); - the end card is a static PIL composite (real logo PNG + real product PNG + a serif headline + CTA) — never AI-rendered text; - **no paid call is made** — the keyframes, clips, and music come from the paid capabilities (create-image-fal / create-video-fal / create-music-elevenlabs); this assembly is $0 and a re-cut reuses the existing assets.
-
-
SKILL.md 4.9 KB
--- name: render-food-product-sizzle description: Assemble a wordless macro-tabletop food-product sizzle ad from a config — normalize fps and SAR across ~4 photorealistic macro clips (hands tearing, flat lay, bite, box hero), concat them, apply a global anti-AI grain pass (eq plus hqdn3d plus noise), composite the audio (a non-diegetic acoustic music bed plus a couple of short diegetic SFX like a snap and a tear placed at measured cue points, loudnorm), composite a STATIC end card entirely in PIL (real logo PNG plus real product PNG plus a serif heritage headline plus a CTA — never AI-rendered text), and burn optional serif stat-callout pills at beats. This is the FREE deterministic assembly stage (normalized concat plus grain plus music and SFX mix plus PIL end card plus callouts); the macro keyframes, i2v clips, and music bed come from create-image-fal, create-video-fal, and create-music-elevenlabs. Use for the food-product-sizzle format. status: active --- # render-food-product-sizzle Assemble a **food-product sizzle** ad from a config: a wordless macro-tabletop photorealistic sizzle for a physical food / CPG product — tactile sunlit tabletop photography in a warm tungsten kitchen register, ~4 dynamic macro scenes (hands tearing, a flat lay, a partial-face bite, a box / pack hero) flowing into a static end card, carried by a non-diegetic acoustic music bed + a few diegetic SFX with NO voiceover. This capability is the **FREE, deterministic assembly** — normalized concat, the anti-AI grain pass, the audio (music bed + SFX) composite, the PIL end card, and the optional serif stat-callout pills. `scripts/config.example.json` is the worked example (Lineage Provisions "Beef Sticks Sizzle", ~14s 1080×1920 9:16, ~4 macro scenes + a static end card); `scripts/PIPELINE.md` maps every config block to its source step and `scripts/README.md` documents the free assembly. ## Run This is the **FREE, deterministic** assembly stage — it spends nothing. The paid inputs are separate capabilities: ~4 photographic macro keyframes (`create-image-fal`, Nano Banana; the box / pack hero grounds on the real product PNG); one locked-off, anti-shake i2v clip per keyframe (`create-video-fal`, Seedance); and a non-diegetic acoustic / bluegrass bed (`create-music-elevenlabs`). Given the ~4 clips + the music bed + the diegetic SFX + the real logo PNG + the real product PNG, `render-food-product-sizzle` normalizes fps / SAR, concats the body clips, applies the anti-AI grain pass, composites the audio (bed + SFX at their cue points), composites the static PIL end card, burns the optional serif callout pills, and muxes → the master. Re-cuts reuse the existing keyframes / clips / music and cost **$0**. ## Contract (the free assembly) - **Wordless — the music bed is the audio, no VO.** A non-diegetic acoustic bed (no vocals) IS the bed; do not add a spoken voiceover. The brand name + claim land on the STATIC end card, never in the body. - **~4 macro scenes, concat in order.** Normalize fps / SAR across the body clips and concat them in their scene order (tear → flat-lay → bite → box-hero by default); the box / pack hero shows the REAL label (grounded on the product PNG upstream — the assembly must not re-render it). - **Anti-AI grain pass, applied globally.** Apply `eq=contrast=1.06:saturation=0.93,hqdn3d=1.5:1.5:3:3,noise=alls=8:allf=t+u` across the whole video — the noise on a food macro is load-bearing for the tactile / photographic read, otherwise the sizzle looks AI-smooth. - **Diegetic SFX on the tactile beats.** Mix a crisp ~120ms snap on the fiber tear and a ~180ms tear on the box-open at their measured cue points — a couple of short hits, not a wall of sound. Time each to its beat, not a round number. - **Music bed with no sparse intro.** The supplied / generated bed opens sparse — the upstream step trims the ~2.5s intro so it kicks in from frame 0; the assembly loudnorms + fades in / out to the master length. - **Static end card via PIL from the real logo + product PNG — never AI-render brand text.** Solid / ivory bg + the real logo PNG (upper third) + the real product PNG (centered, soft shadow) + a serif heritage headline + a CTA, held ~3s WITH the music still playing under it (fade the tail — no silent tail). A diffusion model garbles a wordmark and the packaging. On macOS pick a serif with the middle-dot glyph (use ` · `). - **Optional serif stat-callout pills at beats.** Ivory-or-brand-color pill + serif type at choreographed windows. Write any `%` string to a textfile and use ffmpeg `drawtext` `textfile=` + `expansion=none` — a raw `%` is read as a strftime spec and renders garbage. - **FFmpeg composite, deterministic, FREE.** Concat the body clips, grain-pass, composite the audio (bed + SFX), append the PIL end card, burn the callouts, mux with a fade tail, `loudnorm` → a 1080×1920 h264+aac master (~14s). No paid calls, no keys. -
skill.meta.json 329 B
{ "slug": "render-food-product-sizzle", "category": "capabilities", "domain": "ads", "tags": [ "ads" ], "installation": { "base_command": "npx goose-skills install render-food-product-sizzle", "supports": [ "claude", "cursor", "codex" ] }, "requires_skills": [ "watch" ] }
Comments (0)
Sign in to join the conversation.
Reviews (0)
No reviews yet.
No comments yet.