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

Uploaded CPython 3.14manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.14macOS 26.0+ ARM64

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

Uploaded CPython 3.13manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.13macOS 26.0+ ARM64

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

Uploaded CPython 3.12manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.12macOS 26.0+ ARM64

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

Uploaded CPython 3.11manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.11macOS 26.0+ ARM64

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

Uploaded CPython 3.10manylinux: glibc 2.28+ ARM64

bithuman-2.3.4-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.4-cp314-cp314-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for bithuman-2.3.4-cp314-cp314-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 abf7dbf16228ec64a58c7368b13feb67da9342d99725c2deb11e6bdd9143e9dc
MD5 77fb91c9408ae9dea58d1a75f3e289e4
BLAKE2b-256 5117172cf9add8df9b9841b7e2e24ee841602b3b8cdd0c4bfc0c6e03bc7e6680

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp314-cp314-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2e79d75f5f479454a4aa7644753e5fa0724af33f8adb95a08b2a54bd4b508886
MD5 6dff95079f6647720f24f5e9c9d33a99
BLAKE2b-256 cc38cc728716aaffd009bac54dba440088a8d1255a6fe18f7bd27445c092cf16

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp314-cp314-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 35d2be99836f90315814559c9f8ca4524398cbb390af8211ebd1105d2ddfc3ac
MD5 69bb369404005668feae0f7572d867c9
BLAKE2b-256 bfc54f1c5794e73ca1daec7a3a266b74ab1b2240719d55ece1d8b1ee64af41cb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 81f1336ff5741e38e80659a3d579e2d08ff7558e2461ce9aa62bf8f6c9925e8f
MD5 d6cd34c3bad7a002f50cc6758e7a8788
BLAKE2b-256 a2d280ed1e53934931d5b678992cfee4e4a1bcf1f282c8b642dc48a1667ffe9a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp313-cp313-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ebac8129ecc72bc86549b76fa287928f41620e02496fb93aaffb149bf12148f0
MD5 96b858be382e8372db143b601aa7495a
BLAKE2b-256 b64c3143514a6eeddba2e241e3b2f492faf11fe080e7c010601d6f27f7d4f23b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp313-cp313-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 a7b2739f729053a5fc5dd0293d9b2f48dad812b21d6ed5a3f371c63a37d3256f
MD5 4197dae531efa0001b165c36e60c7608
BLAKE2b-256 51acce1e8088d368201dd9f656a688e481e84be7a5aaee48ba30ccc10e401491

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e4ab6ecac402d1b78e629c8c19c8dae473c40e8da1f0230bcc545c3741049cb3
MD5 fdf52d92b72f9d410a639d7bc7247f4b
BLAKE2b-256 0538b3c04806a857e820e4d0eba6fe6c3618a3d36a4c2b7f39399da378973ab0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp312-cp312-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 eedc4ceb0b9b70746739689b1854156b3ef2be901298e7971a2f9ccd97767fb5
MD5 e46f9c745bfcf1c722c28737d8163bc1
BLAKE2b-256 08cca59cc3f9639f29cf1304017f4a00904a226f4881373681bf5fa140715a9d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp312-cp312-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 72a8e6d8c357896ee214e194248fbd583b80e22fe338641fccd98e0f11e90af6
MD5 74f2ad2a15ea5a0eeec27ce3e1b8e901
BLAKE2b-256 e208bcc9f73060627e15bb4f566351403120bab405ad4de58284f5162066da08

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e7f8c2de2a6e498a853dc6537b93be5544516500500a2b4da8dfeb4d66472658
MD5 3496e73a2f765524e3b3177080951709
BLAKE2b-256 bdcb3ffb1ede31f0edfac83751acaef995df12fa6679e4189447d6e140ecbdff

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp311-cp311-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 92d8c3b788ffad2c0657d1e74149479d7bff78bf32959dbdafb5e6e1947dc958
MD5 c8f05ab9f50d9773d66e86778740bbb6
BLAKE2b-256 3b3f9a939dc99be87220af6b437842f68a2d8b8f2dc07d87e472cc259a58d9a0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp311-cp311-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 c46531822312148286c17592652f34b654b9341efb97c79cbf2965b8218425d7
MD5 4a7cf6999c1a3d80a3f129f662f43a15
BLAKE2b-256 4863060afc2dd14657c7fe23289a2e1d2d8be6d4dedb41563e565c865748500c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp310-cp310-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 3d0a93f8e4c77c3be4dc425c548a319f0986dffd89335568e47aa66354d13e74
MD5 97f78832bff9123f75cc5bd09ee887d4
BLAKE2b-256 151c0fe9ed735416974b25dcd90e94d55f59c5eb40a15fe834ccb9b9df13920b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp310-cp310-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3616204212e7f99195ac61ee976a1dec44bac83501f3ee13fe80a0c78ba4b47d
MD5 ed27c2c5754b43c0dc19a383af0264c0
BLAKE2b-256 e4a07c239c51ef52e1ce1433bd2a0196b8fcf9ca48c38b1fc08f9cc1e6d24e44

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for bithuman-2.3.4-cp310-cp310-macosx_26_0_arm64.whl
Algorithm Hash digest
SHA256 c49cfac6d5fc52c1bb4f65e3b1fc7fa1df1721c8dc50df443f8ca1e3dc63ebee
MD5 2dc82e9b59002d62fdd0b38b2bb269fa
BLAKE2b-256 7099c28f362ed2075c445edfa02192592364f39e1ed279b5a9e1351c146bdd63

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