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.9-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.9-cp314-cp314-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.14macOS 26.0+ ARM64

bithuman-2.3.9-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.9-cp313-cp313-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.13macOS 26.0+ ARM64

bithuman-2.3.9-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.9-cp312-cp312-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.12macOS 26.0+ ARM64

bithuman-2.3.9-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.9-cp311-cp311-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.11macOS 26.0+ ARM64

bithuman-2.3.9-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.9-cp310-cp310-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

bithuman-2.3.9-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.9-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-2.3.9-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 725899f409bc6a85ec214c5dd6cd5af740c02ce1cdc2357d49de30b379b202ae
MD5 c0dc1cb0ba1139e10f62c89b5d36e4c2
BLAKE2b-256 378c1d524f9841a6e84e1197fabdce8a6365d4fd6b046407969dafbe70ba1447

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 408f758ac02c4323e63abbecc91fbea30374bb7809e386fdf7e6b7c68340f644
MD5 07f82422b4d2c6f97d031749aceb1102
BLAKE2b-256 951c8f003e02131184a0f7aacfc907441ae3a314d189464764e01af0e72720b1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp314-cp314-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 48d263a228630be131de2d316e1af206bf3c57fe8d599951fc804bd8a3b668dc
MD5 d9dc51b73c7045e2fc4caeec36dca9a3
BLAKE2b-256 48bd4491055c4b50debd085b55ee993da504ff6fe56c365934d7da5b4d3a8bb9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1eb729103b779521d5d15efc80ce42a2ab2fd71b1bb60c563c516d1a1674fdba
MD5 bc0328217e487aaf0a8c9beb045266d0
BLAKE2b-256 c1f072aff39477dc87d86fcfbfb3d87c14fdc3cab1a1398bf7f48d96d3e0b409

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c99d66e0b35fe4d96ea1b6033acbbad7e32dec6f3608a2c4e0fa46659aadd08e
MD5 f3f7bf7784e2c40c8bf8c0cdd69c9f34
BLAKE2b-256 79f8f9a1199f09f941c4fbdff74021f60fe015af806a45dbc2aa78a677d4dd3d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp313-cp313-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 1a7d246f5e349fb0dd8b3f35b764130a35596888cf3a3488041111d2b7c82f5a
MD5 b6ed94b208ee405dfd01047e58989b25
BLAKE2b-256 71dfd9db3cb147cf577e0b525bc3aeb806aa810b191f598040d97573b3a33450

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 67837873e747ab08bb11bf19048f42b1d77146332aa59c600edec379a68f2caf
MD5 cab5fcdb9c6a948f4dd51ccbe9c6fe5c
BLAKE2b-256 1e6260f9ed5b1567776c6ceb1bd93f108f90b171090c2b90bcf33932349b9c5b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 39de369dade352120c2aa1117b07aa5a55f4a769cbc2f534e01c6b41925c822b
MD5 6f8ace9c61b1a0d06e18a99424c5950b
BLAKE2b-256 d02f5c37acf950fbbb0682d6bcec0f61a43d06ad028ef8de83bf9917cd2df00d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp312-cp312-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 533b986d3f1efaed406c9fb0b14e8429c994eb50d5a117b5d15da31657bbf29d
MD5 cb118a58dd3dcac5250117a94481f3ca
BLAKE2b-256 e49f1b39d15514c13178964b92fc6cbac27455527b052ca9cb2d558e8ed70ad3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 25ff1dd79a8fec2620730f2e0cb3ffdad34ecef2a300f01e7c832376f0793beb
MD5 87eef70b98e16a78f25ed89f3c345922
BLAKE2b-256 bef9e265b6180c6b62decb66d446008cb434e533f562cf7befe4736ac9a51eda

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c381d458bab3505198019d9b4134071eec67fba59328d683eadd92c752aa82ca
MD5 e5dfe87c99f975720b6b58a85d445a86
BLAKE2b-256 f5c8ca14ea9a058b759f32c40e9c8bdd3591d6975f0e7641b2cc990f6a726450

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp311-cp311-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 cbed2d92e84e179fff3862cc97f269f33702073258f079776a0c5971134209f8
MD5 74dce1003d07713e8161c800b5a3d27d
BLAKE2b-256 b7dbc86cdd45cc8b61b7e49ff38eedd53566e51d54b424ce200b5338b672af25

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 005e6328d2dd4477f650c94eeb04ca9aabf42d2a26ecab4581b4a097f667b2e1
MD5 d78474c89953d9cb5b882d8ba4f6314c
BLAKE2b-256 fdb4eb9b2a70c71456a08dd7874144496ee4579d51f7feb15f02e5225105d33e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f44d52e3465a3512f0703e241e7a0aea64c937ce1a878c9dccd7e097fbaa5418
MD5 90f689ca1a8a9e944127e13aefdbbe9c
BLAKE2b-256 43bd9ff696febe93619b1ff7ae3f6e2d6d62e15a1510325b160ad0c8a0054748

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.9-cp310-cp310-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 e9420cd1fd58a1bc971b632cea51ff8facb789323f5872fa9c5b54d38d0c8a28
MD5 df1ef110b30b4cdfce0b4e80e0fb1ed6
BLAKE2b-256 88a06c22320789d4386304bdfc7e2c0387efb7460729b01d02b0daa0f00127c4

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