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 sdk/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/sdk/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.11-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.11-cp313-cp313-manylinux_2_28_aarch64.whl (16.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

bithuman-2.3.11-cp313-cp313-macosx_14_0_arm64.whl (27.2 MB view details)

Uploaded CPython 3.13macOS 14.0+ ARM64

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

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

bithuman-2.3.11-cp312-cp312-macosx_14_0_arm64.whl (27.2 MB view details)

Uploaded CPython 3.12macOS 14.0+ ARM64

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

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

bithuman-2.3.11-cp311-cp311-macosx_14_0_arm64.whl (27.2 MB view details)

Uploaded CPython 3.11macOS 14.0+ ARM64

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.11-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 212ddca6301585f38b0835e1b768020991f08fc58b9e8771fc650994a7e76899
MD5 7ec134f74872d4f24f83cceffb407002
BLAKE2b-256 adbd9ba4103026ea401daed801112d57bc0fe6a451a1ad8d67a59e98cd51d4e1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.11-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c439f8b0e302b2528162b6a5845e952bfce7862dcff17f1d5b6bc5623d538e05
MD5 5c2c6490f869260ae5b47ae0a05c1c1e
BLAKE2b-256 b8aa69e1aafd2a64ef99e4d9c3080394441c846c8532b0a65f53112d8e5d46fb

See more details on using hashes here.

File details

Details for the file bithuman-2.3.11-cp313-cp313-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-2.3.11-cp313-cp313-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 ce890f88a0655f4c57bb9c3a844f1a37da9c7463e2b7561aece2ab7a658b6f88
MD5 b19fe81155507a3ed3b98eedb2a878f6
BLAKE2b-256 b0f019001f382fc892e719739687f1802ef063d5c0392abf72fcf89856b78c7b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.11-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 03373306f50f2704fc8f873c1abbb550ff51b924df9b4c978e26f1ff974de62d
MD5 4000d70ec4cfbb5a370209d0d0274172
BLAKE2b-256 6fee204fa38fabbd19b670a68a7006cde607d6ccc4941898a58cfe5b9231fec2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.11-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ab1f17f73365ba9873d387e2e64c59d91333179adc3569a0e1524af1f7077faf
MD5 d5090365bf6b90f96ec19ef707724daa
BLAKE2b-256 c5bf1ed9cb2879c02ff005c10eebaadb3e202d846cc8de1e434dd411c0fb9e22

See more details on using hashes here.

File details

Details for the file bithuman-2.3.11-cp312-cp312-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-2.3.11-cp312-cp312-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 1f06b0d3a2ffb0a50da5258c3d0b0f3a8a89e04a148978cf9fd274c62b58ec37
MD5 4aad061fb680e0869b016685f6fdaba2
BLAKE2b-256 002a748476d4f315822ebcbf38df46df72f5e4ddb4dc1f6b61f907ef72866f9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.11-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b0a199b838f229ea961836f9a992c3dd339d95061a49630523d1cf9c1430594a
MD5 16601433cf3aa729a960bc2e27c43d04
BLAKE2b-256 b2779a3d8129f97edaf55f5e2527f9403893f8c94bdb0e8c7153289cb5977e67

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.11-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bf3aeb4ff647d51dc3a1f425cb0348f5346eb2586a8eb17451b0aea3856da3be
MD5 a17ff3d1c12de494064c12c2420a22d8
BLAKE2b-256 3f93e19723e1be396a2a0f53f657f31abcee0d72413f907c5308349e74e41741

See more details on using hashes here.

File details

Details for the file bithuman-2.3.11-cp311-cp311-macosx_14_0_arm64.whl.

File metadata

File hashes

Hashes for bithuman-2.3.11-cp311-cp311-macosx_14_0_arm64.whl
Algorithm Hash digest
SHA256 7a9b5e8b21a65a0e09aa88f0622b580f11c1d18866f299338f86b79d481ae9c3
MD5 bd0826526aee3e0472fa5b6bce588247
BLAKE2b-256 97025cf5e586dff4cd7835ea89d4d7ca63336b24851170174c887fd50ce8946c

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