Skip to main content

bitHuman Python SDK — libessence-backed avatar runtime. `from bithuman import AsyncBithuman`.

Project description

bithuman

This is the Python flavor of L2: a platform-specific SDK for app developers. It wraps the L1 libessence engine. For the CLI tool — an L3 app — see the CLI docs.

┌─────────────────────────────────────────────────────────────┐
│ L3: Apps (bithuman-apps — separate repo)                    │
│   - bithuman CLI       brew / pip install bithuman-cli      │
│   - Flutter plugin · Mac/iPad reference apps                │
└─────────────────────────────────────────────────────────────┘
                          ▼ consumes
┌─────────────────────────────────────────────────────────────┐
│ L2: Platform SDKs (app developers)                          │
│   - Python wheel       pip install bithuman    ◄──── you are here
│   - Swift package      SwiftPM Bithuman                     │
│   - Kotlin AAR         ai.bithuman:sdk                      │
│   - Rust crate (in-tree)                                    │
└─────────────────────────────────────────────────────────────┘
                          ▼ wraps
┌─────────────────────────────────────────────────────────────┐
│ L1: 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               │
└─────────────────────────────────────────────────────────────┘

Library only — the CLI moved out

This wheel ships the library only. The bithuman command-line tool (bithuman run model.imx, bithuman render, bithuman doctor) lives in the sibling bithuman-cli PyPI wheel (an L3 app); bithuman-cli depends on this bithuman wheel for the in-process avatar runtime, and both share the same libessence native engine.

# Library — embed the runtime in your own app
from bithuman import AsyncBithuman
avatar = await AsyncBithuman.create(model_path="model.imx", api_secret="bh-...")
# CLI — separate wheel
pip install bithuman-cli
bithuman run model.imx

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                 # the library (slim wheel — no CLI, no brain)

Status. As of 2.3, the PyPI bithuman wheel is a slim library-only wheel. The bundled Rust CLI and conversation brain that 2.0–2.2.x shipped have been extracted into the sibling bithuman-cli wheel (pip install bithuman-cli, with bithuman-cli[local] for the on-device brain). This wheel exports the avatar runtime only: AsyncBithuman (streaming) and Bithuman (sync single-shot).

Compatibility

  • Platforms: macOS arm64, Linux x86_64, Linux arm64 — all ship as wheels. Windows is tracked for a follow-up.
  • Python: 3.10 – 3.14 (cp310 through cp314). CPython only.
  • ABI: wraps the libessence engine core (2.3.6, ABI v7) via pybind11.
  • Auth: ships with live heartbeat against api.bithuman.ai baked into libessence. Bithuman.load(api_secret=...) / AsyncBithuman.create(api_secret=...) is the entry point; BITHUMAN_API_SECRET env var works too.

What you get

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

Tier Types Use when…
Async AsyncBithuman (alias AsyncAvatar), AudioChunk, VideoControl, VideoFrame Streaming a live conversation / hosting a service
Sync facade Bithuman (alias Avatar), ComposedFrame, EP Offline / batch single-shot 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 (async streaming — AsyncBithuman)

Build the runtime with AsyncBithuman.create(...), feed PCM with push_audio, mark end-of-speech with flush(), and drain composed frames from the run() async iterator.

import asyncio
from bithuman import AsyncBithuman

async def main():
    avatar = await AsyncBithuman.create(
        model_path="model.imx",
        api_secret="bh-...",  # or BITHUMAN_API_SECRET env var
    )

    await avatar.push_audio(pcm_16k_mono_int16_bytes,
                            sample_rate=16000, last_chunk=True)
    await avatar.flush()      # end-of-speech marker

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

    await avatar.stop()

asyncio.run(main())

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

Quickstart (sync single-shot — Bithuman)

For offline / batch rendering, Bithuman.load(...) then iterate compose(audio), which yields one ComposedFrame per 40 ms (25 fps) of input:

from bithuman import Bithuman

avatar = Bithuman.load("model.imx", api_secret="bh-...")
for frame in avatar.compose("speech.wav"):   # ndarray or WAV/MP3/FLAC path
    # frame.bgr is (H, W, 3) uint8 BGR; frame.frame_idx / frame.cluster_idx
    ...

Live avatar / CLI — bithuman-cli (separate wheel)

The bithuman run / bithuman render command-line tool and the conversation brain (bithuman-cli[local] for the fully on-device whisper.cpp + llama.cpp + Supertonic stack) are no longer bundled in this wheel. They ship as the sibling bithuman-cli PyPI wheel, which depends on this bithuman runtime:

pip install bithuman-cli            # cloud brain (OpenAI Realtime)
pip install 'bithuman-cli[local]'   # fully on-device brain

bithuman run avatar.imx             # live avatar (browser-to-talk)

See the CLI docs and the bithuman-cli README for the full command surface and brain modes. Both wheels share the same libessence native engine.

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 engine/essence/build/libessence.a (run the parent CMake build first), plus the runtime deps from Homebrew (onnxruntime, webp, ffmpeg, hdf5, jpeg-turbo).

cd sdks/python
uv pip install -e '.[test]' --no-build-isolation   # only the `test` extra ships

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 cp314 — 10 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/sdks/python/scripts/build-wheel-in-container.sh

Limitations

  • Windows wheels not yet built — tracked for a follow-up.
  • compose() emits a fixed 25 fps frame stream to match the model's internal rate; resample downstream if you need a different cadence.
  • preferred_ep=COREML/NNAPI/QNN is accepted but currently no-ops to CPU in the current 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-2.3.10-cp314-cp314-manylinux_2_28_x86_64.whl (18.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64

bithuman-2.3.10-cp314-cp314-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

bithuman-2.3.10-cp314-cp314-macosx_26_0_arm64.whl (26.8 MB view details)

Uploaded CPython 3.14macOS 26.0+ ARM64

bithuman-2.3.10-cp313-cp313-manylinux_2_28_x86_64.whl (18.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

bithuman-2.3.10-cp313-cp313-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

bithuman-2.3.10-cp313-cp313-macosx_26_0_arm64.whl (26.8 MB view details)

Uploaded CPython 3.13macOS 26.0+ ARM64

bithuman-2.3.10-cp312-cp312-manylinux_2_28_x86_64.whl (18.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

bithuman-2.3.10-cp312-cp312-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

bithuman-2.3.10-cp312-cp312-macosx_26_0_arm64.whl (26.8 MB view details)

Uploaded CPython 3.12macOS 26.0+ ARM64

bithuman-2.3.10-cp311-cp311-manylinux_2_28_x86_64.whl (18.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

bithuman-2.3.10-cp311-cp311-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

bithuman-2.3.10-cp311-cp311-macosx_26_0_arm64.whl (26.8 MB view details)

Uploaded CPython 3.11macOS 26.0+ ARM64

bithuman-2.3.10-cp310-cp310-manylinux_2_28_x86_64.whl (18.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64

bithuman-2.3.10-cp310-cp310-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

bithuman-2.3.10-cp310-cp310-macosx_26_0_arm64.whl (26.8 MB view details)

Uploaded CPython 3.10macOS 26.0+ ARM64

File details

Details for the file bithuman-2.3.10-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-2.3.10-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8e1cb0510a190261e630d860eab80890cf718f697c940703e2875d76145b99b5
MD5 3c8191b7a9fdc71d5cca9b16b0947d66
BLAKE2b-256 4f1ec312530417faa6f81a9761e562d4722d97f9133a3f864a89e96b1e2461c4

See more details on using hashes here.

File details

Details for the file bithuman-2.3.10-cp314-cp314-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for bithuman-2.3.10-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 55109bbf48a2d5f308517ab20431ad8cd10609ff7c772d81c4e0f04507ee34d3
MD5 68f3b0b399ff14b2718c6f153548f131
BLAKE2b-256 b280d3bc9c1baf1b08f07bbd7f57e1d3f9c047423358988a47f990502efad82b

See more details on using hashes here.

File details

Details for the file bithuman-2.3.10-cp314-cp314-macosx_26_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-2.3.10-cp314-cp314-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 23a06c6bbfc9363edafedd6f79cc352d1b52797b9a9e7b625357fecc48eec17b
MD5 0fbaaa0880c478b44c987c91c1bb0453
BLAKE2b-256 f9220633e6fd018689412af7c10e014cad666b78cdd14fe07915c815cb4c355f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 10c3fd85a08d054f869d1e02b5216da5c9a512b73ec161765a39558f16f13cc9
MD5 3fbe2c728d1e3d76b0de58f8435fbe29
BLAKE2b-256 598cc33d77fd51faba9d44e76c076078e6e157114f8b064cd1df7fcb1fe1a1d1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 df2e66820e6a26cc6f30751a4ba9052e554268c318571a61ceefa52c6aa4381c
MD5 d903e361ca922a2ba19559e0440ef33c
BLAKE2b-256 91d92991fe1b2d11a8af914704d4c10b80fd4b708a093aeaaadc9b91c7d646a3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp313-cp313-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 dcb2d19df84339ce42350e3e73127a34400d87190c2a18274e8c2c1a4c3a38a0
MD5 7c0919ceafcc4577c2208e7c56e2d42d
BLAKE2b-256 c12885caf6f2a85d7be37e96242f239b8188fa972818ae531ec0740e426a900f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6bc61e7492bb2fe3506ab9f2185cc1c1d51c16c127102987285db933a7c5d812
MD5 1266435ad5c6e42c410c47e7459e9a7c
BLAKE2b-256 e49d89913fc10c0fb06df45696b3153db06b0365b25ab22a1443ac0d81b72953

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5c83599b48e678a29c3a4de0c4d210c0bb31d2cc246072adffffcaa3a712d06d
MD5 de16f884b58d40cdc7db9bb8de3ab674
BLAKE2b-256 5d34d63a7d8c88166d7b89b1f05170b7e76a000554779b3800f1b996d8de7507

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp312-cp312-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 a46b271a5d1bd50b5feced1fd6de10fb2b5b1e405b4214b65f6e496f8bdc6006
MD5 155b6c750a287c1f22f358cf24bdc1f9
BLAKE2b-256 7ddb46704e1490b79eb81ae88b4e77c1276ea0f0b3cfa55089a9c6ac6b89f72d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5b12f6cdc95844754031a02304518dc901cd69a69a9e59509a26efd1a3a6c469
MD5 265b63f3d1471800210dc0272b3f3b7b
BLAKE2b-256 891351b549b16c65eb9788f7869e6a527c537a8ad5b5ab10b3df44d7698d9fa1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2cedf99e725b867a90937478b2700f7fd3e26f90fe7d7e7cfeccc3ea4549f2ef
MD5 28169bafe5032186e2ffc57b7aa1820a
BLAKE2b-256 832429e0033f65fc31a262de9f160c301cb7a40a2081db27568c6adaaec2a351

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp311-cp311-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 8611e8394ac777cef7646d545dd67ed3d9fdfb4c42d3b4cf22a68c9e8e095514
MD5 b4ee316b0c63dac57d02750624873e2b
BLAKE2b-256 6f1b0540e71a6d20828ebe1a8f685a0b80d1817c3a57a4d80e3af6cc733563cc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b80b2d1568dbd7fe891219baf8a1dcb4f8eec642769e7036489cba3dc19760c2
MD5 d36d269a799c1c1f7d6ae12842d90f69
BLAKE2b-256 41ca557763ffedaace1e01fb3d813f67fb8dad44027f37fdb57e7f349bdf3883

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9934451bf12313c07a7a093be3f9249ece8286333e54d0dde50f34cdc12cf2cb
MD5 73c9d980cef6bdea018e0c13fbfdc8e5
BLAKE2b-256 4d739edae63b77fa453b320f063da1ebd40caad608485c3335b7b357ece98841

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.10-cp310-cp310-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 c7311d08ba956e15212b6484ed75008fab27707a3f767ba556dc882c0247d8d0
MD5 544f21ecf4ff89e1da35ea396126a2c9
BLAKE2b-256 6eef9b8f54cb14aac4ce1239ccf5730a80a9f895b1f76bebe0230393c6d99264

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