---
tier: hero
reliability: 3.6 # spokesperson .3 + EN TTS .2 + talking-head lip-sync .3 + nemotron-asr .2 + multilingual TTS/lip-sync per market .4 + assembly 0; -.2 until lip-sync quality verified per language; direct-SDK fallback for slow caps
---

# Brand Localization Studio — one ad → every market ⭐

> Paste this whole file (with the BRIEF filled in) into Claude cowork, chat, or Code with the Storyboard MCP attached. Hand it a master spot + your target markets. It transcribes, translates, **re-voices each language with lip-sync**, localizes on-screen elements, and scores it with **licensed** music — delivering a localized ad set, automatically.

## What you'll get

- Your **master spot** (a spokesperson talking-head, or your uploaded clip).
- **N market variants**, each: translated VO, **lip-synced** to the new language, optionally localized product/signage on screen, and a licensed music bed.
- A **side-by-side compare page** (EN / ES / JA / …).

**The wow:** the whole localization loop — transcription, lip-synced re-voice, on-screen edits, licensed audio — on one network, as one flow. Today that's five vendors and a week.

**Reference run (our showcase):** ≈$4 · ≈18 min end-to-end · 1 master → EN/ES/JA, 3/3 lip-synced; nemotron-asr ~2s, talking-head ~5 min/market (parallelized). See the [example](/chapters/brand-localization-studio-example.html).

## The caps

| Step | Cap |
|---|---|
| Transcribe the master VO (40 langs, punctuation) | `nemotron-asr` |
| Translate (tone-matched to brand) | LLM |
| Re-voice each language | `gemini-tts` (named voice + tone control) / `inworld-tts` — **match the talent's gender** (e.g. warm female `voice:"Sulafat"`) and set delivery with a plain-language style direction |
| Lip-sync the new VO to the face | `talking-head` (omnihuman) / `lipsync` / `kling-v3-turbo-i2v` |
| (opt) recast local talent | `face-swap-video` |
| (opt) localize on-screen product/signage | `bernini-r-ref-edit` |
| Licensed score | `sonilo-t2m` (see the licensed-sound skill) |
| Clean composites | `bria-video-bg-remove` |

Several are **heavy caps (>5 min)** — they work via `create_media` now that the slow-cap timeout fix is deployed; if any reaps, use the direct-SDK path (see the instruction-video-editing skill / docs/infra/2026-06-19-slow-cap-timeout-fix.md).

## Tell the agent about the spot

```yaml
brand:            # e.g. "AURELIA" (skincare)
script_en:        # the master English VO line(s)
spokesperson:     # OPTIONAL image URL of the talent; omit to generate one
markets:          # target locales, e.g. [es-ES, ja-JP, ar-SA]
recast_talent:    # true|false — face-swap a local presenter per market (optional)
localize_onscreen:# true|false — bernini-r-ref-edit to swap product/signage per market
music_brief:      # mood for the licensed bed
aspect:           # 9:16 | 1:1 | 16:9
launch_slug:      # e.g. aurelia-global
```

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

1. **CONFIRM (1 message).** Restate brand + script + markets + options; ask only the music/talent question, else start.
2. **MASTER.** Generate/accept the spokesperson, TTS the English script, lip-sync → the EN master. **GATE** on the master (it's the basis for every market).
3. **TRANSCRIBE.** `nemotron-asr` on the master VO → the source text (demonstrates the cap + gives the translation base). Show it.
4. **PER-MARKET (gated spend, parallel).** For each locale: translate → re-voice (multilingual TTS) → **lip-sync on 1 market first, GATE** (lip-sync quality varies by language) → then fan the rest. Optional: face-swap local talent, bernini-r-ref-edit on-screen swaps.
5. **SCORE + FINISH.** `sonilo-t2m` licensed bed (looped + faded), `bria-video-bg-remove` if compositing, burn captions per language.
6. **DELIVER.** Side-by-side compare page + per-market exports + one honest line (which languages lip-synced cleanly, which needed a retry).

## What can disappoint (cap ceilings)

- **Lip-sync quality varies by language** — phoneme coverage differs; gate on the first market, and prefer `talking-head` (omnihuman) for the closest sync. Subtitles are the safety net if a language's sync is weak.
- **Voice mismatch** — a default TTS voice is often the wrong gender for the talent (a male VO under a female spokesperson reads as broken). Pick a **named voice that matches the face** and pass a tone direction (e.g. gemini-tts `voice:"Sulafat"` + "Say warmly, with an upbeat premium-commercial tone:"). The directive is interpreted, not spoken — verify with a quick ASR pass.
- **TTS accent/naturalness** varies per locale — listen before fanning all markets.
- **On-screen text** in `bernini-r-ref-edit` can drift — restore brand wordmarks in post.
- **Heavy caps** (talking-head, kling-turbo, bernini) run minutes — parallelize per market.

## When you're done

```
✅ Localization set: public/launches/{launch_slug}-compare.html
✅ Master (EN) + N market variants (lip-synced + scored)
Total spent: $X.XX
```

## What to do next
1. **Ship per market** — each variant is platform-ready with captions.
2. **Add a market** — one more locale = one more translate→revoice→lipsync pass.
3. **Refresh the script** — re-run from step 2 with new copy; the talent + pipeline hold.

---

## Notes for the agent (only read if a step fails)

**Heavy-cap timeout.** talking-head / kling-v3-turbo / bernini run >5 min. Via `create_media` they carry the per-cap timeout now (#499). If one reaps, direct-SDK: `POST /inference` with `{"capability":"<cap>","params":{...},"timeout":700}`, Bearer auth, ~750s client timeout. Host local clips via `scripts/host-local-file.sh`.

**Lip-sync inputs.** `talking-head` takes an image/video + an audio URL → lip-synced video. TTS first (`gemini-tts` — pass `prompt` + a named `voice`; multilingual, auto-detects language from the script), then feed its audio URL as the talking-head's `audio_url`.

**Audio.** `sonilo-t2m` returns `.m4a`; mux with `audio_fill:"loop"` + `afade` out. Duck the music under the VO.
