Drive the face.
Every control here maps to one direct() call — the same call your app
makes. Replay a scene, re-read a line as a different intent, or type your own.
The scene.
Every control here maps to one direct()
call. Type your own line, pick a tone and a voice, and watch the call that produced it.
Same words, same voice — only the intent changes. Each intent is a complete performance, so it looks the same whatever came before it.
This demo uses a real neural voice where enabled (your browser otherwise). Rosto animates the face; you bring the voice. Adding voice →
rig.setState("idle")
Same words. Any intent.
The oldest exercise in acting: one line, read many ways. Tap an intent — the words and the voice actor never change, only what your app said the line is.
“So, about your order.”
Every reading below is the same recording session — same voice, same words. Watch the timing change: surprised waits a beat before it speaks.
rig.direct({ intent: "greet", say: "So, about your order." })








Eight looping reactions, rendered from your avatar at no extra cost, in both GIF and sticker-tray formats — with an optional caption that types out in sync. See them move →
Now make it your face.
That was a demo avatar. Yours is the same engine with your own face — or a wholly fictional one, if you would rather not upload a photo.
One avatar is free to make. It then runs in any browser at no cost, forever — and you can download it and host it yourself.
Looking for the motion instrument (A/B against the legacy engine, the frame-true page timeline)? That is an engineering tool, not a demo: /motion-lab.