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.17.4-cp313-cp313-manylinux_2_28_x86_64.whl (14.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

bithuman-1.17.4-cp313-cp313-macosx_26_0_arm64.whl (204.6 kB view details)

Uploaded CPython 3.13macOS 26.0+ ARM64

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

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

bithuman-1.17.4-cp312-cp312-macosx_26_0_arm64.whl (204.5 kB view details)

Uploaded CPython 3.12macOS 26.0+ ARM64

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

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

bithuman-1.17.4-cp311-cp311-macosx_26_0_arm64.whl (203.6 kB view details)

Uploaded CPython 3.11macOS 26.0+ ARM64

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

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

bithuman-1.17.4-cp310-cp310-macosx_26_0_arm64.whl (202.2 kB view details)

Uploaded CPython 3.10macOS 26.0+ ARM64

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

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64

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

Uploaded CPython 3.9manylinux: glibc 2.28+ ARM64

bithuman-1.17.4-cp39-cp39-macosx_26_0_arm64.whl (202.3 kB view details)

Uploaded CPython 3.9macOS 26.0+ ARM64

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5ec3afdf49d3a4a1a1b0903b620f7796e715445e61ba3c942d508cde494dd173
MD5 313f6bf14679af91b4137bfb1d270681
BLAKE2b-256 8efd091d1b5b945de90c52a536f504161acf432cbca75e33ad4896ac94af8776

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c41044bb39919b58e8ae74cae4e2ff802c1efde6c44df09351c707248e967397
MD5 8b0c153b767b3be24fe66f017ce4f657
BLAKE2b-256 332de3830099805b3fd5d150ce59f3b1ad29f0f85aca459af83ccf553255adaf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp313-cp313-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 1b94b028ecb3512a18df2654acb526770fa57b90fbc5e6e9f938dc84e6a2776e
MD5 d5f921019dd95ba1ee1ae8f2caac17bb
BLAKE2b-256 46a785c9f576954bf195795aa73cb06a1c2ed16ba55b1438657bc653cec1ed6d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b74631f276ec0acf69fe9cfa7af28952811849327292e57f8e38d375779b4c76
MD5 331a55901575b03959b92b4fe4ef717a
BLAKE2b-256 b67c4dd813c85b670b83c7390887bcde7bac2855499b3cfefee336f365bd9567

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 499ab4e1ec56e569ceb5d84b4db8a27996a77310d886519a81728f29f73a9509
MD5 6d305bddb615069e49ba44053f4c24e2
BLAKE2b-256 e2cba0f0e06427a478a4a3599e18cf304396309567f7bdb4e5c56a0ee3372bc2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp312-cp312-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 070f7ce8202e94eeaa588d8f703131d3ce2f2359c38b0926db6758de24c3b627
MD5 f5d9fcf2ad5d440b4da7bc121ac943f2
BLAKE2b-256 834fce2b22d09178edd8373dad1995b6cd92d9deaa1f8bf7747db2e35c7558d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 751be9850848c8af0749d71746f454adcf36bcb38a8031ef67e69a127a00515e
MD5 499f471fe64462c500973c2a32ebc693
BLAKE2b-256 a8273cd982d102c38d6ef77d826fbf58d65adb990a7e3a4f87233b7edfcbd367

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 12fde2e71e1e7bcb9dad73918cc3cee44a4eaa2191ed04dd9ce6ee9c39a3079f
MD5 7d6e91e2230c25698ecffd7f441c6fa4
BLAKE2b-256 718cae5c6cfe4648f93dfa73e167631c40ed9b11ebe39c5f6f55fcdcc62d9175

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp311-cp311-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 0c129e0c19e2d2c5ba24d1d9b8c8c73e4e50161c51878d20d6b7d73bf3d30c57
MD5 a692172cd2a4c5800941a57881efe5c1
BLAKE2b-256 dbdddc7e5f434078ad6ac0d260bc62527c7fc3ea3f1a616834e75e701b4e690e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 93b26fbfcd5a16c4a0f56f594ef9aad5c47364b65b08ab8fea77112d32997582
MD5 fa424a9332049da5ea09fb7d789387a3
BLAKE2b-256 d5d19f7cbee35f2347107caa130d947e39f817a9cc796d97a8f40eddebabbd57

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 d1dadb284faf060d8151e1c62737677c783b99775cd9554ca0cb392f27856e88
MD5 868a8ae4f5c2b425515ca6913ba2473b
BLAKE2b-256 c842389c5f27583c82d49ad07f49b3938ad283fc4bd5d948b686218a5a0e13d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp310-cp310-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 85095c8dfe8ff37ac0277c3e4f0621c166a1f0902061b07d5d05abf8efb6f552
MD5 4f788f200e387e6b97a01b58ad21bea3
BLAKE2b-256 1f8492efa536f7aaabfbef4cf01224c91a80044d44def714c95001a66dced81d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp39-cp39-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e628e5fd1a415a0d12d9e326b4df1cfff7e516709c070f943be0915a38619f64
MD5 bc2f38a32408fb08855d64186eec3c80
BLAKE2b-256 50f4d0254a2fa8c1739a47d00e66e25313f859492a5d051c71cca343f5928886

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp39-cp39-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b6a53457e9529da7e6f6749d3e42676edf55385bac51b342ba0e15556bc2b7c4
MD5 834a9129de1cb9e35f2adbfd84fc511e
BLAKE2b-256 185426db7d6ffb0483b8122e80a2f894d47d703b8ffdace742201d072f7afb36

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-1.17.4-cp39-cp39-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 16701b6ca666095923742aa4ac7bd328c97472f7bd4cff4f462156a2d7f1c086
MD5 7debc6eb6e57539cbc82e89e0db7490e
BLAKE2b-256 bf7b15eea256093a817f95d3ab89673f703346ce7249816bec762f42f96fb877

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