---
name: one-take-five-worlds
description: Turn one locked-off take of a person talking to camera into a beat-synced vertical reel where the room around them changes on every downbeat (for example a jazz bar, a snowy cabin, a neon motel, an arcade and an aquarium) and the light on the person changes with each room. A cut-out matte, a re-light taken from a re-lit still, animated room plates, a glowing scan-line wipe, room labels, a strobe cold open, a recap, a room picker and a comment-to-get ending, all timed to the music. Use when asked to "put me in five different rooms", "same take, different worlds", "one take, many places", or when given the one-take-five-worlds prompt.
---

# One take, five worlds

The idea: film one take of someone talking on a fixed camera, then move them through five rooms, one per bar of the
music, while the light on their face and body changes to match each room. It works because it is honest. The
person's pixels are filmed once, and only the room and the light on them change. Several takes are fine, as long as
every join hides under a wipe that lands on a downbeat.

Work through the steps in order. Show the user the storyboard (step 2) and wait for their OK before you generate
anything.

## 0. Tools

**You need a code environment** (for example Claude Code, or Claude with code execution) with Node 20+, ffmpeg and
Python 3.10+ with numpy, scipy, pillow, mediapipe, torch and torchaudio. The graphics and the final render are a
[Remotion](https://www.remotion.dev) project that you write (React, rendered to MP4). Renders you make with this
skill are covered by HYVIRAL's Remotion license, so you don't need a Remotion license of your own.

Every library named here allows this use: MediaPipe (Apache-2.0) for the matte and the face, torchaudio's wav2vec2
base model for word timing, and torchaudio's Hybrid Demucs for music stems.

**For the take, the room images, the music and the sound effects, use whatever the user prefers.** If the user
hasn't said, ask which tools they want, or use what is already set up. Two common routes:

- **Your own providers.** The take can be the user's own phone video on a tripod (the best case), or an
  image-to-video model that also makes speech (for example Veo, Kling or Runway), started from a photo of the
  presenter. Rooms come from any image model that edits photos (for example Nano Banana, GPT Image or Flux Kontext),
  or from photos of real rooms. Music can come from a music model (for example Lyria) or a licensed library track.
  Effects can come from a sound library or a generator (for example ElevenLabs Sound Effects). No AI media at all is
  fine too: real rooms, your own footage, a library track.
- **HYVIRAL (optional).** If the user has it connected (hyviral.com), one connection covers the media steps:

| You need | HYVIRAL tool |
|----------|--------------|
| AI presenter takes (image to video, with speech) | `generate_video` |
| Re-lit stills and empty rooms | `edit_image`, `generate_image` |
| A music track | `generate_music` |
| Captions, sound placement, review, final render | `video_captions`, `video_audio`, `video_review`, `video_export` |
| Long jobs | `get_job_status` (poll until delivered) |

With HYVIRAL connected, start with `get_connection_info`. To connect it: in Claude.ai or Claude Desktop, Customize →
Connectors → add a custom connector with the URL `https://api.hyviral.com/mcp`; in Claude Code,
`claude mcp add --transport http hyviral https://api.hyviral.com/mcp`, then `/mcp` to sign in.

You can mix routes. Nothing below depends on any one provider.

## 1. The line and the rooms

Write the words first, then decide what each bar must prove on screen. A shape that works, at about 120 BPM
(a bar is 2 seconds, about 23 seconds in all):

| Bar | Picture | Line (example) |
|-----|---------|----------------|
| 1 | Strobe through all five rooms, one 8th note each, then a tape-stop back to the real place | "I filmed this once, |
| 2-3 | The real place, a "1 TAKE" stamp, a REC readout, the build | on my roof. Then I asked my Claude for five more rooms." |
| 4-8 | One room per bar, each entered by the wipe | "Same take. Same spot." / "Same outfit. Same smile." / "Five different worlds." / "And the light on me changes too." / "I never even left the roof." |
| 9 | Recap: the five rooms as vertical strips, two title slams | "One take. Five worlds." |
| 10 | A room picker, the room behind changing on every beat | "Now Claude can make these for you." |
| 11 + 2 beats | The ending over the real place, the last beat matching frame 1 | "Comment [KEYWORD] and I'll send you the skill." |

**Pick rooms whose light contrasts**: warm tungsten, firelight, neon at dusk, screen glow, blue water. Give each a
label with one specific detail ("JAZZ BAR · 1962", "CABIN · −12°C", "MOTEL · MILE 88", "ARCADE · LVL 99",
"AQUARIUM · 12 M"). Keep each spoken line inside its bar, and keep every gap between lines at 1 second or less.

## 2. Storyboard (before generating anything)

Build one page: per bar, a concept frame, the line, the on-screen text, the motion, every sound, and which part of
the music plays. List the exact prompt for every generated asset. Show it to the user and wait for their OK.

## 3. The take

- **The camera never moves.** A phone on a tripod, chest height, the same framing for every take, and the person
  on one spot with clear space around the head and arms. The matte and the plates depend on it.
- Soft, even light on the real take makes the re-light easier. Strong backlight makes hair edges harder.
- Say short sentences with a half-second pause between them: every pause is a cut point.
- **With an AI presenter:** start every take from the same approved photo, and keep one prompt template: the voice
  (accent, pace, mood), "a vertical phone on a tripod, completely still", "she says only this line and nothing
  else", and an audio sentence (only her voice, no music, no clicks, nobody else speaks). Two traps:
  - A keyword in capitals gets spelled out letter by letter. Write it in lowercase in the line and add "the word
    [keyword] is said once as one ordinary word, never spelled out".
  - Takes often add words after the line. Cut at the last scripted word.
  - Check every take against its first frame (face similarity) and the voice across takes, and retake an outlier.
- **Word timings:** force-align the known line on each take (torchaudio `WAV2VEC2_ASR_BASE_960H` plus
  `forced_align`). That model is trained on English speech, so it fits English lines only. For another
  language, use a wav2vec2 alignment model for that language whose license allows your use, or your speech-to-text
  tool's word stamps, and check the first word of each line by ear. Not torchaudio's `MMS_FA`: its license is
  non-commercial. Plain speech-to-text word stamps are often wrong on the first word.

## 4. The rooms: a re-lit still and an empty room each

1. **Re-lit still.** Edit the take's first frame: "Keep the person exactly as they are: the same face and features,
   expression, pose, position and size in the frame, hair and clothes, the same framing and camera height. Replace
   the place around them with [ROOM], and relight them so they look truly photographed there: [LIGHT]". Describe the
   light concretely: where the key comes from, its color, which side gets a rim. Add a reference image of the room
   if you have one.
2. **Check the pose:** matte the first frame and the re-lit still, and compare the masks. Overlap (IoU) under 0.9
   means the edit moved the person. Regenerate it.
3. **Empty room.** Edit the re-lit still: "Remove the person completely and continue the room behind them, the same
   framing, perspective and light. No people." Making the empty room from the re-lit still keeps the room's light
   and the light on the person in agreement. If the person survives, add a reference image of the empty room and
   say so.
4. Image models may return a slightly different aspect ratio than the video. Check by correlation whether the video
   model stretched or cropped the first frame, and map every still the same way.

## 5. The matte

- Per frame: MediaPipe's selfie multiclass segmenter (`selfie_multiclass_256x256`), person confidence = 1 minus the
  background confidence, upscaled. Then `smoothstep(0.3, 0.7)` removes background haze, and a guided filter on the
  frame's luminance (radius 6 at half resolution, eps 0.001) snaps the soft mask to real edges.
- **Dark rooms show every edge mistake.** Replace semi-transparent edge pixels with the person's own interior color
  spread outward (a normalized blur of the pixels where alpha > 0.92), and firm the core (`smoothstep(0.26, 0.78)`).
  A sliver of the original background trapped between an arm and the body will glow once re-lit, so look for it.
- Look at a contact sheet of composites on a dark room before you go on.

## 6. Re-light every frame (the core trick)

The re-lit still says how each part of the person changes in this room. Turn that into a fixed light map, like a real
lamp, and multiply every frame by it:

- In linear light (`x ** 2.2`), over the pixels where both masks are above 0.6:
  `gain = blur(relit · m) / blur(first_frame · m)`, per color channel, at two blur sizes (about 22 px and 110 px at
  1080 wide). Use the fine one where the mask covers enough and the coarse one elsewhere, so moving arms still get a
  gain. Clip to 0.02..1.6.
- Each frame: `out = (frame_lin × gain) ** (1 / 2.2)`. Then add a thin **rim** on the edges facing the room's light,
  in the room's highlight color, and a **light wrap** (about 35 % of the blurred room at the outer edge).
- **Move the room's light on the beat, and move the same light on the person.** Jazz lamps pulse on the claps (beats
  2 and 4). Firelight flickers on a few mixed sine waves, and the warm side of her body flickers with it. Neon drops
  out on the "and" of beat 3 and buzzes back on 4, her neon rim with it. Arcade screens shimmer per 16th note. Water
  caustics run one cycle per beat, on the floor and on her.

## 7. The timeline on the music

- **Music:** a steady-tempo track (house or disco at about 120 BPM suits this). Measure the tempo, then **check the
  bar line**: beat trackers often get the downbeat wrong by one or two beats. The beat phase where the chords change
  (spectral flux of the non-drum stem) is the bar line.
- **Arrange it from stems** (Hybrid Demucs: drums, bass, other), bar by bar, so the music tells the story: the drop
  under the strobe, a tape-stop as it pulls back, the groove low-passed under the talking, a filter sweep with a riser
  and a snare roll into the first room, the full groove for the rooms, one "underwater" low-passed bar, a breakdown of
  keys only for the recap, full again for the ending, and a last chord ringing out.
- **Place each spoken phrase in its bar** and cut between phrases. Hide every join under the wipe (beat 4 into the
  downbeat) or under a small punch-in on a beat. A tiny time stretch (about 5 %) is invisible. A frozen frame under a
  wipe is invisible too.

## 8. The picture (Remotion)

Render the photographic layers in Python first, one room image and one re-lit person image per frame, with wipes and
strips already split. Remotion renders frames out of order, so keep anything with state out of it. Then stack:

room → person → front particles → wipe line → readouts and labels → captions → ending → film grain.

- **Strobe cold open:** the five rooms, one 8th note each, with an RGB split that decays within each slot and a short
  flash on each change. Then a tape-stop: squash, blur and fade the color over a quarter second, back to the real
  place.
- **The wipe:** a 10 px vertical line in a three-color gradient with a wide blurred glow and a few trailing sparks.
  The new room appears behind it. It crosses the frame in exactly one beat (ease in and out) and finishes on the
  downbeat.
- **Labels and readout:** the room's name tracks in on the downbeat (letter spacing from 0.34em to 0.06em) above the
  captions, with an underline that draws. A "WORLD n / 5" readout with the digit rolling up when the line crosses
  the middle, and a progress bar under it.
- **Front particles per room**, drawn as a function of the frame number: snow with a gust on beat 3, warm dust motes,
  pixel squares in the screen colors, bubbles, and a school of fish crossing in front.
- **Recap:** the five rooms as vertical strips arriving on 8ths with glowing seams, and two title slams on the spoken
  words, each with a short shake.
- **Room picker:** a row of thumbnails, the highlight hopping on each beat while the room behind changes with it.
- **Captions:** the current phrase in a dark pill at the bottom, the spoken word highlighted, the bottom edge no lower
  than y 1480 of 1920. Keep the top 250 px, the bottom 440 px and the right 130 px free of anything that must be read.
- **Type never covers the face.** A stamp goes beside the head.
- **Ending:** over the real place with its background defocused, "COMMENT", the keyword in a bold chip, and "and I'll
  send you the skill", each landing on a beat. The last beat matches the first frame, so the loop restarts cleanly.
- **Camera:** a slow push, a small punch on each downbeat and jump cut, a light pulse on every kick while the person
  talks, a short shake on each slam.

## 9. Sound

- One quiet sound per move on screen, and a sting per room on its downbeat: a muted trumpet stab, a fire flaring up,
  a neon buzz and clunk, a soft coin drop, a deep underwater whoosh. Under each room, its own bed: vinyl crackle,
  fire crackle, cicadas, an arcade hum, an underwater rumble. A soft zip for every wipe.
- Synthesize the small tonal sounds (pops, ticks, thocks) instead of generating them.
- Voice first: music about 16 LU under the voice while she talks, the loudest effect about 6.5 to 10 LU under. Keep
  effects warm and dark (low-pass them): bright effects sound harsh next to a voice. Master at -14 LUFS, true peak at -1.5 dBTP
  or lower.

## 10. QA gates (all must pass)

- A transcript of the final mix matches the script, and every word shown on screen is actually heard.
- A contact sheet at 2 fps: no halos, no see-through limbs, no text on the face, no jumpy joins.
- Render twice and compare the two files frame by frame (PSNR). A single outlier frame means a flicker.
- Loudness and true peak are on target. No gap between spoken lines is longer than 1 second.
- A second opinion is useful: have another model review the finished video, and treat its notes as a list to check,
  not as orders.

## Appendix: the light map (Python)

```python
import numpy as np
from scipy.ndimage import gaussian_filter

lin = lambda x: np.clip(x, 0, 1) ** 2.2

def light_map(first, relit, a_first, a_relit, fine=22, coarse=110, k=0.95):
    """first, relit: HxWx3 floats 0..1 (the same size as the video); a_*: HxW mattes. Returns an HxWx3 gain."""
    m = (gaussian_filter(((a_first > 0.6) & (a_relit > 0.6)).astype(np.float32), 2) > 0.9).astype(np.float32)
    def at(sig):
        num = np.stack([gaussian_filter(lin(relit[..., c]) * m, sig) for c in range(3)], -1)
        den = np.stack([gaussian_filter(lin(first[..., c]) * m, sig) for c in range(3)], -1)
        return num / np.maximum(den, 1e-4), gaussian_filter(m, sig)
    g1, cover = at(fine); g2, _ = at(coarse)
    t = np.clip(cover / 0.25, 0, 1)[..., None]
    return np.clip(t * g1 + (1 - t) * g2, 0.02, 1.6) ** k

def relight(frame, gain):
    return np.clip(lin(frame) * gain, 0, 1) ** (1 / 2.2)
```
