Stage 6 · app/ and creators/<id>/live.env

The live app

Nothing is trained here. The app wires the five models together for one creator, and needs one settings file and one decision: what the creator does while waiting.

The settings file

Every creator has creators/<id>/live.env. Nothing in the code names a person; this file does.

# creators/huberman/live.env DISPLAY="Huberman" STYLE_CREATOR=huberman VOICE_PROFILE=huberman FACE_PROFILE=huberman FACE_RUN=huberman_G4_teeth FACE_BODY=random WPS=2.9 SAMPLES="Why should I get ..." REST="..._c001@228" → which answer archive and persona note → which voice in checkpoints/<id>/voice → which motion model and rig (via the profile) → which renderer in checkpoints/<id>/face/render → real body: any front-facing clip, or one set → their speaking rate: how many words fit 75 s → the example questions under the picture → the resting pose: chunk @ start frame
A creator filmed in several rooms gets FACE_BODY="random:<recording>", so the resting loop and the answers come from the same room and the background does not jump.

What the viewer does between answers

resting loop resting (thinking) speaking: new head on real body resting loop question asked first frame ready The resting loop is 4 s of their real footage with the generated head on it, played forward and crossfaded at the seam, so it blinks and breathes. Playing it back and forth read as head-shaking.

Picking the resting pose (a person, or Claude, looks)

Raised hands, a lean or a look away read as the creator doing something, not waiting. A stillness scan cannot tell a hand held up and still from a hand at rest, so the scan proposes and someone chooses by looking.

  1. ./alive up <id>, then ask the face server for the six stillest 4-second windows:
    curl 'http://127.0.0.1:8730/calm?seconds=4&k=6'
    Each result has a clip (a chunk name) and a start frame, not seconds. Every window is already front-facing.
  2. Draw each one as a sheet of 8 frames and look at all of them:
    curl -o c.jpg 'http://127.0.0.1:8730/calm_sheet?clip=<clip>&start=<start>&seconds=4'
  3. Choose the one that reads as listening: hands down or out of frame, upright, facing camera, nothing moving but breathing. The mouth does not matter; it is replaced. Rule out burned-in text.
  4. Write REST="<chunk>@<start frame>" in live.env, with the reason and the runner-up in a comment. ./alive restart app.
  5. If none qualifies, pick a single front-facing, hands-down frame and set REST_HOLD=1: the body holds still and only the face moves. Dr K needed this: all 26 candidate windows had him gesturing.
  6. Look at the built loop at http://127.0.0.1:8800/idle before calling it done.

Claude Code can do this step: it can fetch the sheets, view them, and write the choice. That is how both creators' poses were picked.

Until REST is set, the app uses the stillest window it finds, so ./alive check and ./alive up both work without it.

Where the decisions are kept

decisionstored in
everything on this pagecreators/<id>/live.env, with the reason in a comment beside each choice

The AI-generated label

The page always marks the picture AI-generated, and says under it: "The face, the voice and the answer are made by models from <name>'s public videos. <name> did not say this." Keep it. Someone who sees a clip of this cannot otherwise tell.

Speed

parttypicalnote
writing the answer20-80 sthe LLM; most of the wait
first sound~1 s after the answerthe voice streams
first frame~10 s after the answerthe face waits for the whole voice, then starts in about 3 s
framesabout 2.7× faster than real timeon one RTX 5080, head on real body

The bar under the picture shows these for every question.