How we measure

How the Essence 2 and Expression 2 frame rates are measured, which releases they were measured on, memory per render, time to a finished video, and the raw data.

Method

Measured in September 2026 on CLI 2.8.1, bithuman 2.11.12, bithuman 2.11.13, Swift package 2.15.0, Swift package 2.17.3, Swift package 2.18.0, essence2-android 0.7.0, expression2-android 0.4.10, the hosted web viewer and the cloud API.

Frames per second from speech audio in to finished video frame out, for one avatar session, rendering as fast as the hardware allows on a reference speech clip. × real time is fps divided by the model’s playback rate (Essence 2 25 fps, Expression 2 20 fps); at 1.0× or more the avatar keeps up with a live conversation. Every figure is re-measured at least every 30 days on the releases listed above. Raw records, including the clip, per-run dates and memory: performance.json.

Memory

Runs onHardwareEssence 2Expression 2Measured on
macOS · CLIApple M41.0 GB0.9 GBCLI 2.7.8
macOS · PythonApple M41.2 GB0.8 GBbithuman 2.11.12
Linux · CLIIntel Core i7-13700F (x86_64)2.2 GB1.6 GBCLI 2.7.8
Linux · PythonIntel Core i7-13700F (x86_64)1.0 GB1.5 GBbithuman 2.11.12
iPhone · Swift packageiPhone 150.9 GB0.5 GBSwift engine 1.10.0, Swift package 2.14.1
AndroidSamsung Galaxy S25+1.0 GB2.3 GBessence2-android 0.7.0, expression2-android 0.5.0
Web browser (WebGPU)Chrome on Apple M43.0 GB (Chrome tab memory footprint)1.8 GB (Chrome tab memory footprint)—

Peak memory (RAM) of one render, or of one session on a phone, on the release in the last column. Cloud API: nothing to provision.

Time to a finished video

Runs onHardwareEssence 2, first runEssence 2, after that
macOS · CLIApple M44.0 s4.8 s

Seconds from starting the command to a finished MP4 of a 10-second clip, for the whole process: loading, rendering, encoding and exit, timed on CLI 2.7.8. Each number is the slowest of three runs. “First run” is a fresh install with the model files already downloaded. “After that” is every later render on the same machine. Lip sync is checked on every run: no run published here plays more than 40 ms off the audio.

Later renders are not faster: the model files are already downloaded on the first run, so both columns measure the same work, within run-to-run variation.

Raw data

performance.json holds every published cell: frame rate, × real time, release, date, the speech clip it was measured on, and memory. The pages under Performance are generated from it.