---
title: "Local-food Short — one dish, one language, one 30s native-language food short"
reliability: 3.6 # img gen .3 + i2v .6 + tts .2 + music .2, 8 stages (−.6), proven E2E showcase (mapo-tofu) +.5
showcases: ["/chapters/mapo-tofu-example.html"]
---

# Local-food short — agent playbook ⭐ flagship

> Paste this whole file (with the BRIEF filled in) into Claude cowork, chat, or Code. **One famous local dish. One language. Thirty seconds. Voice-over + captions + music — all native.** Build a YouTube-Short / TikTok / Reels-ready vertical food short in any language: pick a dish, pick a target audience language, the agent writes the script in that language, generates the visuals, narrates with native-language TTS, burns in captions, mixes a culture-appropriate music bed, and stitches the whole thing into a single shareable 9:16 MP4.

## What you'll get

A 30-second (default) native-language food short with the production values of a streaming-platform food documentary:

- **6 cinematic food shots** (default — 5s each = 30s) showing the dish across its narrative arc: hero bowl → ingredients → cooking action → key technique → finished detail → tasting moment. Keyframes via `gpt-image` (best stylization), animated with `seedance-i2v` (or `ltx-q-i2v`, `resolution:"auto"`).
- **Native-language voice-over** generated via `gemini-tts` (best multilingual TTS on BYOC, supports Mandarin / Cantonese / Spanish / French / German / Japanese / Korean / Hindi / Italian / Portuguese / Russian / Arabic / etc. with natural prosody).
- **On-screen captions** in the same language, burned-in by `ffmpeg-burn-subtitles` with proper CJK / Latin / CJK-vertical font support — readable at thumbnail scale.
- **Culture-appropriate instrumental music bed** — `music` (minimax) with `lyrics_prompt:"[Instrumental]"` and a brief that matches the dish's regional aesthetic (Chinese plucked-string for Chinese dishes, accordion-bossa for Latin dishes, shamisen for Japanese, etc.). It runs the **full reel** — the mux step uses `audio_fill:"loop"` so a short bed never cuts out mid-reel.
- **Voice + music mix** — voice at 0.85, music ducked to 0.20 so the narration carries clearly, both covering every second of the reel.
- **Showcase HTML page** — single shareable page with the embedded reel, dish background, ingredient list, voice-over transcript with translation, and pipeline trace.

**Time**: ~8–12 minutes wall clock. **Your attention**: ~5 minutes across 2 gates (script approval, mid-render check). **Cost**: $4–6 end-to-end. *This is the social-share flagship* — the playbook for a single shareable artifact that's ready to upload to TikTok / YouTube Shorts / Instagram Reels with no further editing.

## Tell the agent about the dish

```yaml
language:           # ISO code: zh-CN / en-US / es-ES / ja-JP / ko-KR / fr-FR / hi-IN / etc.
                    # Determines the script language, TTS voice, and caption language.
dish_name:          # e.g. "麻婆豆腐" / "Carbonara" / "Pho Bo" / "Bibimbap"
                    # Native name in the target language.
dish_name_en:       # Romanized / English name for filenames and the showcase page meta.
origin:             # Brief origin string. e.g. "Chengdu, 1862" / "Rome, late 19th century" / "Hanoi, early 20th century"
key_flavors:        # 5-7 single-word flavor descriptors that define the dish.
                    # For Mapo Tofu: 麻 (numbing), 辣 (spicy), 烫 (hot), 鲜 (umami), 嫩 (tender), 酥 (crispy)
key_ingredients:    # 5-8 hero ingredients to feature in the flat-lay shot.
duration_sec:       # 30 (default) / 45 / 60. Voice-over script will be word-budgeted to fit.
voice_brief:        # e.g. "warm female narrator, slight Chengdu inflection, conversational food-documentary pace"
music_brief:        # e.g. "light Chinese plucked-string (guzheng / pipa) bed with wood-block percussion,
                    #       contemplative food-documentary, no vocals"
scene_count:        # 6 (default — 5s each for 30s) / 9 (for 45s) / 12 (for 60s).
                    # Always include the 6-shot narrative arc; longer reels add detail/variation shots.
dish_slug:          # kebab-case for output filenames + showcase page. e.g. mapo-tofu / carbonara / pho-bo.
```

---

## Quality controls (auto-applied)

The closed quality loop that separates this from "an AI food generator that misspells dish names":

- **Native script first.** The agent writes the voice-over script in the target language directly — NOT translated from English. Idiomatic, conversational, food-documentary tone. Surfaced for your review before Wave 1 fires. Length budgeted to fit `duration_sec` at natural reading pace.
- **Captions match the script.** On-screen captions reinforce the voice-over rhythm, displayed in 5-second blocks. CJK / RTL / Latin font selection happens at ffmpeg stage with explicit font specification — no font substitution failures.
- **No readable text in generated keyframes.** Every gpt-image prompt explicitly forbids signs / labels / wordmarks because text-rendering is the hardest AI failure mode and a misspelled fake-Chinese sign breaks the cultural authenticity. Captions are burned in at the ffmpeg stage with proper Unicode + CJK fonts.
- **Same camera grammar across shots.** Overhead 90° for hero / ingredients / wok shots; close-up macro for tofu / chopsticks; three-quarter for tasting. The visual rhythm reads as documentary not slideshow.
- **Same key-light direction.** Warm directional from upper-left at 30° across every shot. The lighting continuity is what makes the reel feel like a single piece, not 6 unrelated stock images.
- **Cultural authenticity in ingredients.** Every flat-lay calls out *specific authentic ingredients* (e.g. "doubanjiang fermented broad-bean chili paste" not "chili paste") — the agent does brief research per dish if needed.
- **Voice-direction prompt.** `gemini-tts` prompt includes pace / tone / inflection direction (e.g. "warm female narrator, slight Chengdu inflection"). Generic TTS sounds robotic; directed TTS sounds like a documentary host.
- **Music brief matches the cuisine region.** Chinese plucked-string for Chinese dishes; Italian guitar for Italian; shamisen for Japanese; not "generic upbeat food music".
- **Voice + music mix discipline.** Voice always carries — score ducks to 0.20 when voice is present. afade in/out on both. The bed is muxed with `audio_fill:"loop"` so it covers the FULL reel; final audio sums to a single AAC track for compatibility with all upload platforms.
- **Mid-render contact-sheet check.** After Wave 1 (6 keyframes) lands, the agent surfaces all 6 stills for your review. You can re-fire any off-cultural / off-cuisine cell before the more-expensive i2v wave fires.

> **Why the same dish in different languages reads differently.** A Mapo Tofu short voiced in Chinese for a Chinese audience emphasizes the history and the six characters of flavor (麻辣烫鲜嫩酥) — cultural shorthand that needs no explanation. The same dish voiced in English for a global audience needs to TEACH those six concepts. The playbook's `language` parameter doesn't just translate — it adapts the script's *register and emphasis* to what the target audience already knows.

## How the agent should run this (interaction contract)

1. **CONFIRM first (one message).** Restate the brief — "30s Mandarin Mapo Tofu short, 6 scenes, documentary VO + guzheng bed, ~$4–6, ~10 min" — plus 2–3 real choices (duration 30/45/60 · seedance vs ltx-q-i2v motion · voice gender/tone). Ask at most ONE question; otherwise state assumptions and start.
2. **PREVIEW CHECKPOINTS (both cheap).** (a) The native-language script + caption blocks BEFORE any render — a wrong register wastes everything downstream. (b) The 6-keyframe contact sheet BEFORE the i2v wave (the expensive stage) — invite "re-fire #N, more steam / tighter angle" redirects.
3. **NARRATE every step.** One line + ETA: "Animating 6 clips in one wave of ≤5, ~2–4 min — job_ids posted, polling `get_create_media` every ~15s." Post a heartbeat with elapsed/remaining if any poll passes 2 min; never go silent.
4. **FAIL GRACEFULLY (WHAT/WHY/fallback in one line, ≤2 retries per stage).** seedance-i2v hangs or "fetch failed" → `ltx-q-i2v` `resolution:"auto"` (`num_frames:241` for ~10s) → Ken-Burns zoompan on the still. gpt-image 422 → soften the prompt (drop fire/knife verbs) → `nano-banana`. gemini-tts fails → `chatterbox-tts` / `inworld-tts` (note the voice-direction loss). music fails → retry once → `mirelo-sfx` ambient bed. A reel with one fallback clip beats no reel.
5. **DELIVER.** Final MP4 + viewer URL, one honest quality line ("captions are block-synced, not word-synced; shot 4 used the Ken-Burns fallback"), and ONE next step (45s cut, or the same dish in another language).

## What can disappoint (cap ceilings)

- **Stray in-frame text.** Keyframe prompts forbid signage, but gpt-image sometimes adds it anyway — garbled fake-hanzi on a wall breaks authenticity. Re-fire that cell at the contact-sheet gate.
- **i2v deforms hands and chopsticks.** Tasting-moment shots are the highest-drift cells; steam/dust/light motion is far safer than hand motion.
- **TTS prosody varies by language.** gemini-tts is strong in major languages; less-common locales sound flatter than the voice_brief promises.
- **Music genre fidelity is approximate.** "guzheng + wood block" may come back as generic East-Asian-flavored strings. One retry, then accept or swap to a `mirelo-sfx` ambient bed.

## Reproduce via MCP

```
1. generate_project  aspect_ratio:"9:16", scenes: scene_count, style: visual_style
   → 6 × create_media action:"generate" model_override:"gpt-image"
        prompt = visual_style + camera grammar + key-light + SHOT_DETAIL + "no signs/labels/wordmarks"
   AUDIT GATE — contact sheet of all 6 stills; re-fire any off-cuisine cell.
2. 6 × create_media action:"animate" model_override:"seedance-i2v"
        source_url:<keyframe>, duration:5, resolution:"auto"   # fire in waves of ≤4–5
3. create_media action:"tts" model_override:"gemini-tts"
        prompt:<native-language script>, voice:<voice_brief direction>
4. create_media action:"music"
        prompt:<music_brief, region-appropriate, no vocals>, lyrics_prompt:"[Instrumental]"
5. ffmpeg-concat            # stitch the 6 clips → silent base reel
6. create_media model_override:"ffmpeg-burn-subtitles"   # captions.srt, explicit CJK/Latin font
7. create_media model_override:"ffmpeg-mux"  audio_fill:"loop"
        voice 0.85 + music ducked 0.20, afade in/out → audio covers the FULL reel
8. create_media model_override:"ffmpeg-export"   # finalize 9:16, 1080×1920
```

## Output structure

```
public/chapters/<dish_slug>/
  scene-01-hero.png                ← 6 keyframe stills (9:16)
  scene-02-ingredients.png
  ... × scene_count ...
  scene-01.mp4                     ← 6 i2v animated clips
  scene-02.mp4
  ...
  voiceover.mp3                    ← native-language TTS narration
  music.mp3                        ← culture-appropriate score
  captions.srt                     ← timed caption file (UTF-8, language-tagged)
  <dish_slug>-short.mp4            ← final 9:16 vertical short with VO + captions + music
public/chapters/<dish_slug>-example.html  ← OPTIONAL showcase page (skip unless publishing)
public/case-studies/<dish_slug>.html      ← OPTIONAL case-study entry
```

The example for this playbook is **麻婆豆腐 (Mapo Tofu)** — a 30-second Mandarin food short voiced in natural Chengdu-inflected Mandarin, shipped at [`/chapters/mapo-tofu-example.html`](/chapters/mapo-tofu-example.html).
