Voice to face motion
This stage makes two things: a 3D face of the creator that can be moved like a puppet, and a small model that listens to speech and works the puppet's strings the way this creator's face moves. Its output is a moving 3D face with no colour or skin; the next stage paints it.
The parts, in plain words
| part | what it is | where it comes from |
|---|---|---|
| a MetaHuman rig | Epic Games' professional face puppet: a detailed face mesh of 24,049 points, moved by 263 named controls (jaw open, left lip corner up, brow lower, ...). Setting the controls poses the face | you supply one (setup); it is someone else's face |
| their rig | that same puppet, its resting face reshaped to the creator's head. Same 263 controls | built here from the head shape tracked in face clips |
| Audio2Face-3D | NVIDIA's model that turns speech into those 263 control values. Trained on eight other people | you supply its two model files |
| the correction | a small network trained here: it adjusts Audio2Face's controls to fit this creator | trained here, about 40 minutes |
How speech becomes a moving face
How the correction is trained
From stage 3 we know what the creator's face actually did in every frame of every clip. That is the answer key. The model is scored on where the face's points end up, never on the control values themselves (many control settings give the same face, so the values are not a fair target).
The clips are split once, for every stage
How good it is
The score is how much of the creator's real face movement the predicted face reproduces on test clips it never saw: 0% is their plain resting face, 100% is exact. Dr K's deployed model, beside what it is compared with:
How it is built
Commands
./alive build <creator> --stage motion runs it. By hand, from engines/audio2face/:
~/miniconda3/envs/stavatar/bin/python rigfit/recipes/audio-to-mesh/tools/status.py --profile <name>
It prints what is done and the next command, with the right Python in it.
A new creator starts as a copy of rigfit/recipes/audio-to-mesh/profiles/_template.py: their name,
and which tracked video goes with which soundtrack. The full recipe is
engines/audio2face/rigfit/recipes/audio-to-mesh/RECIPE.md; how a rig is reshaped to a person is in
engines/audio2face/identity/README.md.
Where the decisions are kept
| decision | stored in |
|---|---|
| the timing sheet was looked at, and what the reader said | creators/<id>/build/motion/joins_acked.json (Dr K only; Huberman's was never signed off) |
| which run to keep, and what is still wrong with it | creators/<id>/build.json, motion.run and motion.wrong |
Things that go wrong
| you see | why, and the fix |
|---|---|
| a decent score but the mouth moves early or late | the lag. Look at the timing sheet; never type a lag in by hand, it differs per video (Dr K +110 ms, Huberman −105 ms) |
| every score is low, the mouth looks fine | the rig is still the stock face; the identity check flags it. Rebuild step 1 |
| the lips never quite shut | known on both creators (Dr K about 4 mm open). The closure penalty helps a little; more clips help more |
| the face upstream looks fine, the next stage's mesh is torn | a model handed on without its 16 extra shapes; promote copies them, never copy a model by hand |