Expression 2
Expression 2 renders any character from one portrait, live.
What it is
Expression 2 (expression-2) generates the whole avatar scene live from the
audio — expressions, mouth and head movement are synthesized each session, not
replayed from a base video. It animates the entire 416x720 frame with no
face detector or cropping step, so it works for any character: cartoons,
animals, creatures, robots, and people.
At creation the platform trains a small model of your specific identity from one photo. That per-identity model is what serves your sessions, and it is why creation takes a couple of hours.
How it is created, served and kept moving while idle: How it works.
When to choose it
- Your character is not a photorealistic human — this is the model for it,
and where
model: "auto"routes such inputs. - You want motion generated from the audio itself, not patched onto a base video.
- You only have a photo — one image is enough.
For a photorealistic person, compare Essence 2. The side-by-side is on Models.
Where it runs
| Where | Expression 2 | How |
|---|---|---|
| iPhone and iPad | Yes | Swift package, Expression2 |
| Mac | Yes | Swift package (macOS 13), CLI, Python |
| Android | Yes | expression2-android |
| Linux, no GPU | Yes | CLI, Python |
| Browser (WebGPU) | Yes | render=local |
| Your servers | Yes | CLI, Python, LiveKit plugin |
| bitHuman cloud | Yes | web embed, REST API, LiveKit |
| Fully offline | Yes | Linux x86_64 (Business & Enterprise) |
Complete apps: iOS Expression 2, macOS Expression 2 and Android Expression 2.
The file you download from
GET /v1/agent/{code}/model/download?model=expression-2
or bithuman pull <CODE> is labelled <CODE>.imx; .avatar is the legacy
extension for the same container. How fast it renders on each device is on
performance.
Limits and expectations
- Output is the full 416×720 scene, playing at 20 frames a second.
- A clear, frontal, well-lit photo gives the best result. The identity is fixed at creation — to change the face, create a new agent.
- The first session on a new agent can take longer to connect while its model is provisioned; later sessions reuse it.
- Before training completes, a launch that requests this model is refused
with
409 MODEL_NOT_GENERATED. Once ready,expression-2appears in the agent’ssupported_models.
Next steps
- Models — the four models side by side
- Agents API — create, poll, download
- Embed widget — a live session in minutes
- Video API — render an MP4 with
model: "expression-2" - Session behavior & troubleshooting
This section moved: docs.bithuman.ai/build/create-avatar#how-creation-works
This section moved: docs.bithuman.ai/performance/method#pin-a-tier-for-a-benchmark
This section moved: docs.bithuman.ai/models/how-it-works#idle-and-speaking-behavior