Skip to main content

Portable C++ avatar runtime — Python bindings via pybind11. Powers the bitHuman Essence pipeline cross-platform.

Reason this release was yanked:

bug identified

Project description

bithuman

This is the Python flavor of Layer 3: a platform-specific library for app developers. It wraps the Layer 1 libessence engine. For the CLI tool see docs/CLI.md.

┌─────────────────────────────────────────────────────────────┐
│ Layer 3: Platform-specific libraries (app developers)       │
│   - Python wheel       pip install bithuman    ◄──── you are here
│   - Swift package      SwiftPM Bithuman                     │
│   - Kotlin AAR         ai.bithuman:sdk                      │
│   - (future) Rust crate, JS/TS, Go, ...                     │
└─────────────────────────────────────────────────────────────┘
                          ▼ embeds
┌─────────────────────────────────────────────────────────────┐
│ Layer 2: bithuman CLI (end-user tool)                       │
│   - one cross-platform binary on macOS / Linux / Windows    │
│   - brew install bithuman · curl-pipe installer             │
└─────────────────────────────────────────────────────────────┘
                          ▼ links
┌─────────────────────────────────────────────────────────────┐
│ Layer 1: libessence engine (cross-platform C++ core)        │
│   - portable C ABI, same source on every target             │
│   - macOS · iOS · Android · Linux · Windows                 │
│   - never imported directly by app developers               │
└─────────────────────────────────────────────────────────────┘

Python bindings for the bitHuman SDK — the portable C++ avatar engine (libessence) that powers our cross-platform lipsync pipeline. The wheel ships a native pybind11 module that talks directly to libessence, so you get the same per-frame cost as our Swift and Kotlin clients with none of the GIL noise.

On an Apple M5 with 24 GB unified memory we measure ~640 FPS sustained compose (1.56 ms/frame mean, 2.03 ms p99) for a 1248×704 avatar, with ~206 MB peak RSS end-to-end. Cold load is ~14 ms for the fixture and ~400 ms for the first compose tick (lazy ONNX init).

This package is namespace-isolated from the v0 bithuman SDK; you can install both side-by-side.

Install

pip install bithuman

Status — Python wheel lags the rest of the SDK. The PyPI bithuman wheel is v1.12.4 (ABI v4), built from the legacy python/ tree at the root of bithuman-sdk. The new ABI-v6 streaming surface (be_runtime_push_audio / be_runtime_pull_frame / …) is C-level only in this binding tree until the Rust PyO3 wheel at cpp/bindings/rust/crates/bithuman-py ships to PyPI as the canonical replacement. Today's PyPI users keep the legacy AsyncBithuman.push_audio + async for ... in runtime.run() shape — see the legacy quickstart.

Compatibility

  • Platforms: macOS arm64, Linux x86_64, Linux arm64 — all ship as wheels. Windows is tracked for a follow-up.
  • Python: 3.10 – 3.13 (cp310, cp311, cp312, cp313). CPython only.
  • ABI: the published wheel wraps libessence ABI v4. The libessence engine itself is on ABI v6 — that surface is currently exposed via the Swift / Kotlin / Rust bindings only. PyO3 wheel migration in flight.
  • Auth: ships with live heartbeat against api.bithuman.ai baked into libessence. Avatar.load(api_secret=...) is the entry point; BITHUMAN_API_SECRET env var works too. Set BITHUMAN_UNMETERED=1 for dev / parity-test runs.

What you get

The package exposes three API tiers (all importable from bithuman):

Tier Types Use when…
Async AsyncAvatar, AudioChunk, VideoControl, VideoFrame Hosting a service / parity with legacy AsyncBithuman
Sync facade Avatar, ComposedFrame, EP Offline / batch / CLI rendering
Low-level Fixture, Runtime, EP_CPU/EP_AUTO/EP_COREML/EP_NNAPI/EP_QNN Direct C ABI access, custom audio pipeline

Error types: BithumanError (base), TokenError / TokenExpiredError / TokenValidationError / TokenRequestError / AccountStatusError (auth), ModelError / ModelNotFoundError / ModelLoadError / ModelSecurityError / ExpressionModelNotSupported (fixture), RuntimeNotReadyError.

Version info: bithuman.__version__ (Python package), bithuman.__core_version__ (linked libessence), bithuman.__abi_version__.

Quickstart (legacy AsyncBithuman — PyPI)

This is the shape of the current published wheel. It ports directly from the v0 bithuman SDK: feed PCM with push_audio, drain frames from the runtime.run() async generator.

import asyncio
from bithuman import AsyncBithuman

async def main():
    runtime = await AsyncBithuman(
        model_path="model.imx",
        api_secret="...",  # or BITHUMAN_API_SECRET env var
    ).start()

    await runtime.push_audio(pcm_16k_mono_int16_bytes,
                             sample_rate=16000, last_chunk=True)

    async for frame in runtime.run():
        # frame.bgr_image is (H, W, 3) uint8 in BGR order
        ...

asyncio.run(main())

PCM accepted is int16 little-endian bytes at 16 kHz mono. WAV / MP3 / FLAC / OGG decoding is the caller's responsibility (use soundfile).

Quickstart (low-level, C-level streaming surface)

The Rust PyO3 wheel will expose the ABI-v6 streaming pair (runtime.push_audio + runtime.pull_frame) on the same shape as the Swift / Kotlin bindings. Until it ships to PyPI, the snippet below uses the legacy Fixture / Runtime types in the published wheel.

CLI

A essence-render console script ships with the wheel:

pip install 'bithuman[cli]'

essence-render \
  --model ~/.cache/bithuman/models/sample-avatar.imx \
  --audio speech.wav \
  --output out.mp4

Pass --output - to stream raw BGR24 frames to stdout (handy for piping into a separate ffmpeg pipeline or a custom encoder). Other flags:

Flag Default Description
--fps 25 Output FPS for the MP4 container.
--quality 80 libx264 quality 1..100 (higher = better).
--ep cpu Execution provider hint (cpu/auto/coreml/…).
--threads 1 ORT intra-op thread count.
--no-audio Skip audio muxing; produce a silent video.

Example end-to-end run (5 s sine sweep):

essence-render 0.1.0: model=sample-avatar.imx audio=sine_sweep_5s.wav ep=cpu threads=1
essence-render: loaded fixture in 14.9 ms — 1248x704 @ 25 fps, 183 clusters, 202 src frames
essence-render: composed 122 frames in 1.83s (14.96 ms/frame, 66.8 fps)
essence-render: wrote /tmp/sine_sweep_5s.mp4

(Throughput here is bounded by H.264 encode, not Essence inference. Use --output - if you want to measure raw compose speed.)

Low-level API

If you need finer control or want to swap in a custom audio pipeline, the C ABI is exposed directly:

import numpy as np
from bithuman import Fixture, Runtime, EP_CPU

fx = Fixture("model.imx", preferred_ep=EP_CPU, intra_op_threads=1)
rt = Runtime(fx)
pcm = np.fromfile("speech.f32", dtype=np.float32)  # 16 kHz mono float32
cluster_idx, bgr = rt.tick_compose(pcm, frame_idx_hint=-1)
# bgr.shape == (fx.frame_height, fx.frame_width, 3), dtype uint8

Pass the entire pcm buffer to each tick_compose call; the runtime maintains an internal cursor and advances one tick per call until the audio is exhausted.

Zero-alloc hot path (since 1.12.4)

For tight render loops, pre-allocate the BGR buffer once and pass it via out=. The runtime writes into it in place and returns just the cluster_idx. This drops wrapper overhead to within ~3 % of raw libessence (vs ~8 % for the alloc-per-tick path):

out = np.empty((fx.frame_height, fx.frame_width, 3), dtype=np.uint8)
for _ in range(num_ticks):
    cluster_idx = rt.tick_compose(pcm, -1, out=out)
    # `out` now holds this tick's frame; read it before the next call.

The same out= keyword works on tick_compose_to_size. See docs/ARCHITECTURE.md §9 for the cross-wrapper perf table.

Build from source

You need the prebuilt parent C++ archive at cpp/build/libessence.a (run the parent CMake build first), plus the runtime deps from Homebrew (onnxruntime, webp, ffmpeg, hdf5, jpeg-turbo).

cd cpp/bindings/python
uv pip install -e '.[cli,test]' --no-build-isolation

The CMake glue links the prebuilt static archive directly — it does NOT re-run the parent build, so iterate on bindings without paying the C++ rebuild cost.

Performance

Measured with tests/bench.py against the v1 compose path (audio → composited BGR frame) on Apple M5 24 GB, libessence 1.16.0:

Metric Alloc per tick out= reuse buffer
Steady-state mean 1.53 ms / frame 1.45 ms / frame
p99 1.66 ms 1.53 ms
Sustained throughput 655 FPS 692 FPS
Overhead vs raw libessence +8.3 % +2.6 %
Peak RSS (proc) 192 MB 182 MB

Wrapper overhead is within 5 % of raw libessence on the out= path; see docs/ARCHITECTURE.md §9 for the apples-to-apples methodology and the cross-wrapper comparison. Reproduce with:

scripts/bench-wrappers.sh

Linux wheels

Pre-built manylinux_2_28 wheels ship for x86_64 + aarch64 across cp310 through cp313 — 8 wheels in total, all auditwheel-repaired with the full dep tree bundled (ORT, FFmpeg, HDF5, libjpeg-turbo, libwebp, libcurl, OpenSSL).

To rebuild them locally:

# One-time: build the dep-baked Docker images (~10 min each).
docker build --platform linux/amd64 -t libessence/manylinux-x86_64:0.1 \
    -f scripts/Dockerfile.manylinux-x86_64 scripts/
docker build --platform linux/arm64/v8 -t libessence/manylinux-aarch64:0.1 \
    -f scripts/Dockerfile.manylinux-aarch64 scripts/

# Per wheel build (~2 min):
docker run --rm --platform linux/amd64 -v "$REPO":/src \
    -e PYTAG=cp311 -e ARCH_INSIDE=x86_64 \
    libessence/manylinux-x86_64:0.1 \
    bash /src/cpp/bindings/python/scripts/build-wheel-in-container.sh

Limitations

  • Windows wheels not yet built — tracked for v0.2.
  • The CLI's output framerate is fixed at 25 fps to match the model's internal rate. Pass --output - and pipe to your own encoder if you need temporal resampling.
  • preferred_ep=COREML/NNAPI/QNN is accepted but currently no-ops to CPU in the v0.1 build.

License

Commercial. Contact hello@bithuman.ai.

See also

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

bithuman-1.18.1-cp313-cp313-manylinux_2_28_x86_64.whl (14.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bithuman-1.18.1-cp313-cp313-manylinux_2_28_aarch64.whl (13.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

bithuman-1.18.1-cp313-cp313-macosx_26_0_arm64.whl (23.3 MB view details)

Uploaded CPython 3.13macOS 26.0+ ARM64

bithuman-1.18.1-cp312-cp312-manylinux_2_28_x86_64.whl (14.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bithuman-1.18.1-cp312-cp312-manylinux_2_28_aarch64.whl (13.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

bithuman-1.18.1-cp312-cp312-macosx_26_0_arm64.whl (23.3 MB view details)

Uploaded CPython 3.12macOS 26.0+ ARM64

bithuman-1.18.1-cp311-cp311-manylinux_2_28_x86_64.whl (14.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bithuman-1.18.1-cp311-cp311-manylinux_2_28_aarch64.whl (13.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

bithuman-1.18.1-cp311-cp311-macosx_26_0_arm64.whl (23.3 MB view details)

Uploaded CPython 3.11macOS 26.0+ ARM64

bithuman-1.18.1-cp310-cp310-manylinux_2_28_x86_64.whl (14.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bithuman-1.18.1-cp310-cp310-manylinux_2_28_aarch64.whl (13.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

bithuman-1.18.1-cp310-cp310-macosx_26_0_arm64.whl (23.3 MB view details)

Uploaded CPython 3.10macOS 26.0+ ARM64

bithuman-1.18.1-cp39-cp39-manylinux_2_28_x86_64.whl (14.5 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

bithuman-1.18.1-cp39-cp39-manylinux_2_28_aarch64.whl (13.4 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

bithuman-1.18.1-cp39-cp39-macosx_26_0_arm64.whl (23.3 MB view details)

Uploaded CPython 3.9macOS 26.0+ ARM64

File details

Details for the file bithuman-1.18.1-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 145ea66bd19120cbc1416296db1414a1f7a56bf09ddd5d8b1bba812dd6587700
MD5 8561064a0c5c06f0435a74d575014344
BLAKE2b-256 4ad4e5ec77fe702152385078d79203525f3c00ab87455907a29e4870d83e85ab

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp313-cp313-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 758846000b06b6ae4092316171c898cd47a6a137d553b7d112156c789e34e77b
MD5 433a71487337317bc32b4988d0721697
BLAKE2b-256 f61b8b67abb83051a0f9ee9fc682b4a878327b4c64b8743b57422049776c0803

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp313-cp313-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp313-cp313-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 a085d64b16f2cdcf8dad078909ad24bc991b8fb716e990e899b77be16da9aac0
MD5 18cccf1ce44ba06c511478cc7c854433
BLAKE2b-256 7ab60e42f09fddfb6d7fb98559d188089f90ce640a1eb31d8505f65ca0cb63f8

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 9f861d56b85fcc0fded882895315dd36cd2fadb71025d98a28e34fa27771848f
MD5 c29dcd11bcff056d156a0b2737a00e2e
BLAKE2b-256 65ce52aec858a2d36a172826f8fc278dd4bbc017b95449ad505f90d490eec13d

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp312-cp312-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 829a163df7cddf5097fe4cd396a8654ac94dd42f5d039415f0a262ad2d5931f7
MD5 a167f5d3e728b4c62ead51a6896a5a84
BLAKE2b-256 4a7fe7091ef919a1d3766c4019deed015dac52145e4a69c1d8539106c59a86cd

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp312-cp312-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp312-cp312-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 4ee2f4dbc095ba58cfa94cf087fac8a2a0b70ac41a2ab1371aa064135e18d4bb
MD5 4ce46b6c183e48a88d76fec58e4ff14c
BLAKE2b-256 0fdd95d41e239f5f5516f42fc75126357b48e38cbff277e70c9dbef69594ffc5

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 bd5eda3aca9d8ac20dc0c367eafc8be929fa133318a4f92bb8d47f47e33e818b
MD5 498c01fff4fe7df4d8a4cd35aca2cb85
BLAKE2b-256 7ed7dddd6fd3afccf39011e2f49b471326fcaff63e047061c43f3b6c97b33915

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp311-cp311-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5ed3bb6a97858492e5801badc05b09b3ce64e4718d28bed0413b8902abf852af
MD5 510da462668a4c755948870a4b8d8ff8
BLAKE2b-256 50167da1e83b5f0e86446a97863d8b9f8fbeb5589b850b4cfcd79243bd26aaf2

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp311-cp311-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp311-cp311-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 4cfc1fa6f94be01270bb940863ca0c03677dedccfb31e3bebc97fc241f015526
MD5 a0a1082ab51954d4c5dfc6a7751c76a3
BLAKE2b-256 acba19763dd2635d70893cb1bd5f04b238995992e07f563b99285331ece92581

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp310-cp310-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 14a25aa77c3be3909dab6d02cb3e5ebb0a7cdb6c493ce2b2e20282588a7cf0f2
MD5 f536e94106b14b52499088b4b7b164ae
BLAKE2b-256 9d1c15bcf83d6a66b5c27f9faccb2876c481b71b1f587360ca373e8f539c56a6

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp310-cp310-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 52952ad3f93d840ce65246671e91b33633886c5c68f8f016f3ecd8b2e32b2890
MD5 2add26745a8e67e657bc34b5eb398b74
BLAKE2b-256 bdc4f7181b6684b023f3f5f8ed4ff2595faa5281ca2697c440402117532914c9

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp310-cp310-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp310-cp310-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 a2699713085e8acc93be87f888205131ac44bcb739e0c52271c517b771c479c4
MD5 9f6c2ad8c97581cddef95552b1dceb83
BLAKE2b-256 2962b874d323633889cd2b6bb9e2863ec5d70572911d2c111c1800fb0de6292e

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp39-cp39-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e87ecfd42712e5322772e9af441dc896f75026a1f14eddb64ef15ced73b198cc
MD5 9f6b5fa2f85bb4b80d837820b6172d30
BLAKE2b-256 4d513e0106fc9a0ee19ba116a3ef4b7149afdec38b542ec65cc49b2839c2c7e9

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp39-cp39-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f9814e73821f7fe72f2c65e1d01e88397dd9a2fa73aa901ae4584e7a8e1341e2
MD5 0b7a479c36e1a0d556352651df9c2a1f
BLAKE2b-256 d131d797c455c6d95731c0bb1d6c4799fd6fd573ae3e01cbe98f881038f07b23

See more details on using hashes here.

File details

Details for the file bithuman-1.18.1-cp39-cp39-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-1.18.1-cp39-cp39-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 524bef453956b269d5e59bb1ddea7c4f68998a6bdc4d7ba562a4bbf075bc63a2
MD5 76c76a8501ec136b1daca627c6601d8c
BLAKE2b-256 da2178efece95693b1a56638ff6c5909ad5a8a9b7670fa6dd1e3cf4d0820392e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page