# bitHuman — documentation for agents > Real-time talking avatars from one portrait. Index: https://docs.bithuman.ai/llms.txt · every page is also served as markdown at .md · OpenAPI: https://docs.bithuman.ai/api/openapi.yaml ## Instructions for AI agents - Always send `model` ("essence-2" or "expression-2") when creating an agent; poll until `status` is `ready` or `failed`. - API and SDK use requires the Creator plan or higher. Never tell a user they can build on a free plan. - In a LiveKit worker, name the secret `BITHUMAN_MASTER_SECRET` and pass a minted token (https://docs.bithuman.ai/platforms/livekit.md). - Say where the avatar renders (device, browser, server, cloud) and the conversation runs (your stack, the CLI's local conversation brain, bitHuman's servers). - Quote prices only from https://docs.bithuman.ai/pricing.md and speed only from https://docs.bithuman.ai/performance.json (× real time, with the device). - Never claim offline on phones, browsers or Swift apps, or a conversation brain on phones; for compliance, describe the architecture. ## Where it runs - On the device: Essence 2 and Expression 2 render on iPhone, iPad and Mac (Swift package), Android arm64 (Android SDK), macOS and Linux (CLI, Python), Windows 11 x86_64 (Python). Android, and Essence 2 on iPhone and iPad, need a physical device. The SDKs only render your voice stack's 16 kHz mono speech (resample OpenAI Realtime's 24 kHz): https://docs.bithuman.ai/build/companion-app.md - No GPU: both models run live on a standard Linux PC (Essence 2 2.0×, Expression 2 2.2× real time on Intel Core i7-13700F (x86_64)). https://docs.bithuman.ai/deploy/cpu.md - In the browser: with render=local, WebGPU renders the avatar in the tab and never falls back to the cloud (a device that can't render it in real time shows a message); the conversation runs on bitHuman's servers. - Your servers: the CLI, the Python SDK and the LiveKit plugin on your machines; audio and video stay there. - Fully offline: Offline license is only available to Business and Enterprise clients who want to run realtime avatars completely locally, off the internet — e.g. kiosks, trade shows, ATM machines, embedded screens. Linux and macOS computers (Apple silicon); bought in the console or through sales. Essence 1 on Linux and Apple silicon Macs, Essence 2 and Expression 2 on Linux x86_64 (Python 2.11.17+, CLI 2.8.4+). https://docs.bithuman.ai/deploy/offline.md - bitHuman cloud: REST API, web embed, LiveKit; renders in the US. ## Key facts - Credential: one API secret for every surface, from the environment as `BITHUMAN_API_SECRET`. REST header `api-secret`: REST endpoints do not read `Authorization: Bearer` (`/v1/validate` answers `{"valid": false}`); only the Realtime relay and the self-hosted runtime endpoints also take Bearer. Apps fetch it from your backend; never compile it in. Get one: https://www.bithuman.ai/developer/api-keys · https://docs.bithuman.ai/start/api-secret.md - Billing: credits pay for active session time, talking or idle, by the exact second; the Video API bills whole minutes of output (minimum 1). https://docs.bithuman.ai/pricing.md - Model names: Essence 2, Expression 2 in prose; `essence-2`, `expression-2` in code. Essence 1 and Expression 1 are the first generation. · https://docs.bithuman.ai/models.md - Sample avatars (no account): Essence 2 `sofia-ramirez` (A52DHS2219), Expression 2 `wise-pup` (A23WJF0199). Sample audio: https://docs.bithuman.ai/samples/speech.wav (15 s, 24 kHz mono) - Current versions: CLI 2.8.9 · bithuman (Python) 2.11.21 · Swift package 2.20.4 · essence2-android 0.9.5 · expression2-android 0.6.1 · livekit-plugins-bithuman 1.8.5. https://docs.bithuman.ai/versions.json - Python: use a venv (`python3 -m venv .venv`); Debian/Ubuntu's system Python refuses `pip install`. ## Contents This file inlines getting started, the code, terminal and agent platform pages (Python, CLI, Windows, LiveKit, Pipecat, REST) and the REST API; the app platform pages are in /llms/apps.txt. The same text by section, and the sections not inlined here: - Get started (choose your path, your API secret, performance, FAQ, glossary): https://docs.bithuman.ai/llms/start.txt - Platforms (Python, CLI, Windows, LiveKit, Pipecat, REST): https://docs.bithuman.ai/llms/platforms.txt - App platforms (iOS & iPadOS, macOS, Android, Flutter, Web): https://docs.bithuman.ai/llms/apps.txt - Deploy (bitHuman cloud, your servers, on the device, fully offline; CPU only; privacy; pricing): https://docs.bithuman.ai/llms/deploy.txt - Models (Essence 2, Expression 2, the first generation, how it works): https://docs.bithuman.ai/llms/models.txt - Build (voice agent, companion app, kiosk, talking video, avatars, personas, voices, gestures, MCP): https://docs.bithuman.ai/llms/build.txt - Troubleshooting (symptoms and fixes, site-wide and for each platform): https://docs.bithuman.ai/llms/troubleshooting.txt - REST API (agents, realtime, video, embedding, errors, rate limits): https://docs.bithuman.ai/llms/api.txt - Quickstart — https://docs.bithuman.ai/start - Your API secret — https://docs.bithuman.ai/start/api-secret - Performance — https://docs.bithuman.ai/performance - Python — https://docs.bithuman.ai/platforms/python - Windows — https://docs.bithuman.ai/platforms/windows - Build a Python app — https://docs.bithuman.ai/platforms/python/app - CLI — https://docs.bithuman.ai/platforms/cli - Serve and script the CLI — https://docs.bithuman.ai/platforms/cli/voice - LiveKit — https://docs.bithuman.ai/platforms/livekit - Build a LiveKit agent — https://docs.bithuman.ai/platforms/livekit/app - Pipecat — https://docs.bithuman.ai/platforms/pipecat - Build a Pipecat bot — https://docs.bithuman.ai/platforms/pipecat/app - REST API — https://docs.bithuman.ai/platforms/rest - Cloud avatar in your room — https://docs.bithuman.ai/platforms/livekit/cloud-avatar - API overview — https://docs.bithuman.ai/api - Authentication — https://docs.bithuman.ai/api/authentication - Errors — https://docs.bithuman.ai/api/errors - Rate limits — https://docs.bithuman.ai/api/rate-limits - Realtime relay — https://docs.bithuman.ai/api/realtime - Agents — https://docs.bithuman.ai/api/agents - Embedding — https://docs.bithuman.ai/api/embedding - Talking video API — https://docs.bithuman.ai/api/video In https://docs.bithuman.ai/llms/apps.txt, https://docs.bithuman.ai/llms/deploy.txt, https://docs.bithuman.ai/llms/models.txt, https://docs.bithuman.ai/llms/build.txt, https://docs.bithuman.ai/llms/troubleshooting.txt (or read the .md twin): - iOS & iPadOS — https://docs.bithuman.ai/platforms/ios.md - macOS — https://docs.bithuman.ai/platforms/macos.md - Build a Swift app — https://docs.bithuman.ai/platforms/swift/app.md - Android — https://docs.bithuman.ai/platforms/android.md - Build an Android app — https://docs.bithuman.ai/platforms/android/app.md - Flutter — https://docs.bithuman.ai/platforms/flutter.md - Build a Flutter app — https://docs.bithuman.ai/platforms/flutter/app.md - Web embed — https://docs.bithuman.ai/platforms/web.md - Build a web app — https://docs.bithuman.ai/platforms/web/app.md - Render with WebGPU — https://docs.bithuman.ai/platforms/web/webgpu.md - Put an animated character in an iPhone app — https://docs.bithuman.ai/build/how-to/iphone-character.md - Give an app's voice assistant a face — https://docs.bithuman.ai/build/how-to/voice-assistant-face.md - Pricing and credits — https://docs.bithuman.ai/pricing.md - Estimate your costs — https://docs.bithuman.ai/pricing/estimate.md - Deployment options — https://docs.bithuman.ai/deploy.md - bitHuman cloud — https://docs.bithuman.ai/deploy/cloud.md - Your servers (self-hosted) — https://docs.bithuman.ai/deploy/self-hosted.md - CPU only (no GPU) — https://docs.bithuman.ai/deploy/cpu.md - On the device — https://docs.bithuman.ai/deploy/on-device.md - Fully offline — https://docs.bithuman.ai/deploy/offline.md - Data flows & privacy — https://docs.bithuman.ai/deploy/privacy.md - Security and retention — https://docs.bithuman.ai/deploy/privacy/retention.md - Use cases — https://docs.bithuman.ai/deploy/use-cases.md - Banking and ATMs — https://docs.bithuman.ai/deploy/use-cases/banking-and-atms.md - Healthcare — https://docs.bithuman.ai/deploy/use-cases/healthcare.md - Events and trade shows — https://docs.bithuman.ai/deploy/use-cases/events-and-trade-shows.md - Compare models — https://docs.bithuman.ai/models.md - Essence 2 — https://docs.bithuman.ai/models/essence-2.md - Expression 2 — https://docs.bithuman.ai/models/expression-2.md - First generation — https://docs.bithuman.ai/models/first-generation.md - How it works — https://docs.bithuman.ai/models/how-it-works.md - The avatar file — https://docs.bithuman.ai/models/avatar-file.md - Voice agent — https://docs.bithuman.ai/build/voice-agent.md - Voice agent in Python — https://docs.bithuman.ai/build/voice-agent/python.md - Barge-in — https://docs.bithuman.ai/build/barge-in.md - Create your own avatar — https://docs.bithuman.ai/build/create-avatar.md - Persona — https://docs.bithuman.ai/build/persona.md - Voices — https://docs.bithuman.ai/build/voices.md - Gestures (Essence 1) — https://docs.bithuman.ai/build/gestures.md - Website widget — https://docs.bithuman.ai/build/website-widget.md - Companion app — https://docs.bithuman.ai/build/companion-app.md - Kiosk on a Linux PC — https://docs.bithuman.ai/build/kiosk.md - Talking video — https://docs.bithuman.ai/build/talking-video.md - Claude & Cursor (MCP) — https://docs.bithuman.ai/build/mcp.md - Troubleshooting — https://docs.bithuman.ai/resources/troubleshooting.md - Swift troubleshooting — https://docs.bithuman.ai/platforms/swift/troubleshooting.md - Android troubleshooting — https://docs.bithuman.ai/platforms/android/troubleshooting.md - Flutter errors — https://docs.bithuman.ai/platforms/flutter/errors.md - Flutter troubleshooting — https://docs.bithuman.ai/platforms/flutter/troubleshooting.md - Web troubleshooting — https://docs.bithuman.ai/platforms/web/troubleshooting.md - Python troubleshooting — https://docs.bithuman.ai/platforms/python/troubleshooting.md - CLI troubleshooting — https://docs.bithuman.ai/platforms/cli/troubleshooting.md - LiveKit troubleshooting — https://docs.bithuman.ai/platforms/livekit/troubleshooting.md - Pipecat troubleshooting — https://docs.bithuman.ai/platforms/pipecat/troubleshooting.md Linked, not inlined (read the .md twin): - FAQ — https://docs.bithuman.ai/resources/faq.md - Glossary — https://docs.bithuman.ai/resources/glossary.md - How we measure — https://docs.bithuman.ai/performance/method.md - Local conversation brain — https://docs.bithuman.ai/platforms/cli/local-brain.md - Turn a drawing, mascot or pet photo into a talking character — https://docs.bithuman.ai/build/how-to/drawing-to-character.md - Webhooks — https://docs.bithuman.ai/api/webhooks.md - Runtime sessions — https://docs.bithuman.ai/api/runtime-sessions.md - Knowledge — https://docs.bithuman.ai/api/knowledge.md - Gestures API — https://docs.bithuman.ai/api/dynamics.md - Files — https://docs.bithuman.ai/api/files.md - Billing & usage — https://docs.bithuman.ai/api/billing.md - API secrets API — https://docs.bithuman.ai/api/api-keys.md - Organizations — https://docs.bithuman.ai/api/organizations.md - Providers (BYOK) — https://docs.bithuman.ai/api/providers.md - Examples: https://docs.bithuman.ai/examples.md · changelog: https://docs.bithuman.ai/changelog.md · API references: https://docs.bithuman.ai/platforms/cli/reference.md, https://docs.bithuman.ai/platforms/python/reference.md, https://docs.bithuman.ai/platforms/swift/reference.md, https://docs.bithuman.ai/platforms/android/reference.md - Renamed and retired names: https://docs.bithuman.ai/resources/renamed.md --- # Quickstart URL: https://docs.bithuman.ai/start ## Choose your platform | You want to… | Use | Needs | First command | |---|---|---|---| | Put an avatar on a website | Web embed | nothing | `` | | Call it from any backend | REST API | API secret | `curl -X POST https://api.bithuman.ai/v1/validate -H "api-secret: $BITHUMAN_API_SECRET"` | | Render or stream from Python | Python | API secret | `pip install "bithuman[expression-2]"` | | Run it from a terminal | CLI (macOS arm64, Linux x86_64 / arm64) | sign-in | `curl -fsSL https://install.bithuman.ai \| sh` | | Ship an iPhone, iPad or Mac app | iOS & iPadOS (Swift package) | Xcode 26+, API secret | `.package(url: "https://github.com/bithuman-product/homebrew-bithuman.git", from: "2.20.4")` | | Ship an Android app | Android | arm64 device, API secret | `implementation("ai.bithuman:expression2-android:0.6.1")` | | Add a face to a LiveKit voice agent | LiveKit | API secret | `pip install "livekit-agents[openai,silero]" livekit-plugins-bithuman python-dotenv` | | Add a face to a Pipecat voice bot | Pipecat | API secret | `pip install "pipecat-bithuman[expression-2]"` | | Drive it from Claude or Cursor | MCP server | sign-in | `claude mcp add bithuman -- bithuman mcp` | | Run fully offline (kiosk, trade show, ATM) | Fully offline | Business or Enterprise plan; Essence 1 on Linux or an Apple silicon Mac, Essence 2 and Expression 2 on Linux x86_64 | — ([contact sales](https://www.bithuman.ai/enterprise?topic=offline#contact)) | Fully offline: Offline license is only available to Business and Enterprise clients who want to run realtime avatars completely locally, off the internet — e.g. kiosks, trade shows, ATM machines, embedded screens. Linux and macOS computers (Apple silicon); bought in the console or through sales. ## Run it ### Put an avatar on a website: Web embed ```html ``` Expected: A live avatar in your page that listens and answers. Allow the microphone when the browser asks. ### Call it from any backend: REST API ```bash export BITHUMAN_API_SECRET="" curl -s -X POST https://api.bithuman.ai/v1/validate -H "api-secret: $BITHUMAN_API_SECRET" # → {"valid":true} ``` Expected: Your API secret works. The API quickstart continues with a talking video of a sample agent speaking your audio, in minutes, then an agent of your own. ### Render or stream from Python: Python ```bash python3 -m venv .venv && source .venv/bin/activate pip install "bithuman[expression-2]" export BITHUMAN_API_SECRET="" curl -fL -o wise-pup.imx "https://api.bithuman.ai/v1/agent/A23WJF0199/model/download?model=expression-2" curl -fsSLo speech.wav https://docs.bithuman.ai/samples/speech.wav python -c 'import bithuman with bithuman.open("wise-pup.imx") as a: print(sum(1 for _ in a.render("speech.wav")), "frames")' # → 300 frames ``` Expected: 300 frames of 416×720 video: the 15 seconds of sample speech. ### Run it from a terminal: CLI (macOS arm64, Linux x86_64 / arm64) ```bash # macOS: brew install ffmpeg · Debian/Ubuntu: sudo apt install -y ffmpeg curl -fsSL https://install.bithuman.ai | sh export PATH="$HOME/.local/bin:$PATH" bithuman login curl -fsSLo speech.wav https://docs.bithuman.ai/samples/speech.wav bithuman render wise-pup speech.wav -o out.mp4 # → out.mp4: 15 s of a talking avatar ``` Expected: out.mp4, 15 seconds of the avatar saying the sample. `bithuman run wise-pup` opens a live conversation instead. --- # Your API secret URL: https://docs.bithuman.ai/start/api-secret > The one credential for every bitHuman surface, and where each platform reads it. One API secret works for the REST API, the CLI, Python, Swift, Android and LiveKit. It needs a bitHuman account on the Creator plan or higher ([pricing](https://docs.bithuman.ai/pricing)); the live demo and the web embed need none. ## Get one Create an API secret under [Developer → API Secrets](https://www.bithuman.ai/developer/api-keys), then export it: ```bash export BITHUMAN_API_SECRET="" curl -s -X POST https://api.bithuman.ai/v1/validate -H "api-secret: $BITHUMAN_API_SECRET" # → {"valid":true} ``` ## Where each platform reads it | Platform | Environment | In code | |---|---|---| | REST API | — | header `api-secret` | | CLI | `BITHUMAN_API_SECRET` | `bithuman login` stores a credential for you | | Python | `BITHUMAN_API_SECRET` (read by `bithuman.open`) | `api_secret=` on `AsyncBithuman.create()` only; `bithuman.open()` reads the environment | | Apple | `BITHUMAN_API_SECRET` | `Essence2Credential.set` / `Expression2Credential.set` | | Android | — | `Essence2Credential.set(secret)` / `Expression2Credential.set(secret)` before `fetch()` and `create()`; fetch the secret from your backend in a shipped app | | LiveKit worker | `BITHUMAN_MASTER_SECRET`, never `BITHUMAN_API_SECRET` | a short-lived token minted from it, never the secret ([LiveKit](https://docs.bithuman.ai/platforms/livekit#authenticate)) | | Web embed | — | none for a public agent; an [embed token](https://docs.bithuman.ai/api/embedding) for a private one | ## Keep it safe - Keep the secret in the environment or a secrets manager, never in source control or on a command line. - Browsers and LiveKit rooms get short-lived tokens: an [embed token](https://docs.bithuman.ai/api/embedding) or a runtime token minted with [`POST /v1/runtime-tokens/mint`](https://docs.bithuman.ai/platforms/livekit#authenticate). - If a secret leaks, create a new one and delete the old one in the console. ## What a shipped app holds The Swift package and the Android SDK authenticate with your API secret, so every copy of an app you distribute carries it. Treat that secret as exposed: whoever extracts it can call the API as your account, spend your credits and create more secrets. - Fetch the secret from your backend when the app starts. Never compile it into a build you ship. - Give each app its own secret, so you can rotate one without touching the others ([API secrets](https://www.bithuman.ai/developer/api-keys)). - Watch your [balance](https://docs.bithuman.ai/api/billing#check-credit-balance), and rotate the secret at once if usage looks wrong. ## Next - [REST authentication](https://docs.bithuman.ai/api/authentication): the header, validation and error codes. - [Pick your platform](https://docs.bithuman.ai/start#choose-your-platform). --- # Performance URL: https://docs.bithuman.ai/performance > How fast Essence 2 and Expression 2 render on each platform. **× real time** is seconds of avatar video rendered per second. At 1.0× or more the avatar keeps up with a live conversation; higher means more headroom. Every configuration we publish renders faster than real time. The tables below list every published configuration. | Runs on | Hardware | Essence 2 fps | Essence 2 × real time | Expression 2 fps | Expression 2 × real time | |---|---|---|---|---|---| | Cloud API · GPU | NVIDIA RTX 4090 | 104 | **4.1×** real time | 340 | **17.0×** real time | | Cloud API · Apple silicon | Apple M4 Max | 71 | **2.8×** real time | 111 | **5.5×** real time | | Cloud API · CPU | x86 server CPU | 28 | **1.1×** real time | 27 | **1.3×** real time | | macOS · CLI | Apple M4 | 106 | **4.2×** real time | 168 | **8.4×** real time | | macOS · Python | Apple M4 | 174 | **6.9×** real time | 169 | **8.4×** real time | | macOS · Swift package | Apple M4 | 120 | **4.8×** real time | 177 | **8.8×** real time | | Linux · CLI | Intel Core i7-13700F (x86_64) | 50 | **2.0×** real time | 44 | **2.2×** real time | | Linux · Python | Intel Core i7-13700F (x86_64) | 49 | **1.9×** real time | 47 | **2.3×** real time | | Windows · Python | Intel Core i7-13700F (x86_64), 8 threads | 30 | **1.2×** real time | 21 | **1.0×** real time | | iPhone · Swift package | iPhone 15 | 54 | **2.1×** real time | 111 | **5.5×** real time | | Android | Samsung Galaxy S25+ | 52 | **2.0×** real time | 48 | **2.4×** real time | | Web browser (WebGPU) | Chrome on Apple M4 | 43 | **1.7×** real time | 39 | **1.9×** real time | Each figure is one avatar session rendering as fast as the hardware allows. The sections below go platform by platform, on-device first. [How we measure](https://docs.bithuman.ai/performance/method) has the method, the releases measured, memory, the time to a finished video and the raw data. ## Mobile First a short burst on each phone, then one session held for 10 minutes. | Runs on | Hardware | Essence 2 fps | Essence 2 × real time | Expression 2 fps | Expression 2 × real time | |---|---|---|---|---|---| | iPhone · Swift package | iPhone 15 | 54 | **2.1×** real time | 111 | **5.5×** real time | | Android | Samsung Galaxy S25+ | 52 | **2.0×** real time | 48 | **2.4×** real time |
Releases measured Measured in September 2026 on Swift package 2.17.3, Swift package 2.18.0, essence2-android 0.7.0 and expression2-android 0.4.10.
- The first table is one render of a speech clip on a cool phone, as fast as the phone allows. - Some phone figures use a shorter speech clip than the other platforms; each cell's clip is in [performance.json](https://docs.bithuman.ai/performance.json). - Only an iPhone 15 and a Samsung Galaxy S25+ are measured. Other phones render at other rates. Setup for each SDK: [Apple](https://docs.bithuman.ai/platforms/ios), [Android](https://docs.bithuman.ai/platforms/android). ## Held for 10 minutes | Runs on | Hardware | Essence 2 fps | Essence 2 × real time | Expression 2 fps | Expression 2 × real time | |---|---|---|---|---|---| | iPhone · Swift package | iPhone 15 | 33 | **1.3×** real time | 103 | **5.1×** real time | | Android | Samsung Galaxy S25+ | 37 | **1.4×** real time | 44 | **2.2×** real time | | Web browser (WebGPU) | Chrome on Apple M4 | 54 | **2.1×** real time | 41 | **2.0×** real time | One session held open for ten minutes from a cool start on Swift package 2.15.0, essence2-android 0.8.1, expression2-android 0.5.2 and web viewer, rendering as fast as the device allows. Each number is the median 30-second stretch of the slowest of that row's sessions (four on iPhone · Swift package, three on Android, three on Web browser (WebGPU) Essence 2, four on Web browser (WebGPU) Expression 2); the slowest single stretch was lower (iPhone · Swift package Essence 2 31 fps; iPhone · Swift package Expression 2 100 fps; Android Essence 2 32 fps; Android Expression 2 37 fps; Web browser (WebGPU) Essence 2 50 fps; Web browser (WebGPU) Expression 2 41 fps). A phone warms up over a long conversation and slows its processor to stay cool, so a kiosk or any screen that renders all day should plan on this number rather than the short-burst rate. Memory over the ten minutes (the probe's own reading at the start and the end of the held window): Android Essence 2 memory (PSS) 0.9 GB to 0.9 GB (+0 MB); Android Expression 2 memory (PSS) 0.7 GB to 0.8 GB (+34 MB); Web browser (WebGPU) Essence 2 Chrome tab memory footprint 3.1 GB to 3.0 GB (-55 MB). The Web browser row is the engine's render throughput with WebGPU in Chrome on an Apple M4, measured in a visible (headed) browser window. It is not the frame rate a visitor sees on the page, where the voice and the display share the browser with the engine. ## Web These figures are for the avatar rendering in the visitor's own tab (`render=local`). By default the avatar renders on the [cloud API](https://docs.bithuman.ai/performance#cloud) and streams to the page. | Runs on | Hardware | Essence 2 fps | Essence 2 × real time | Expression 2 fps | Expression 2 × real time | |---|---|---|---|---|---| | Web browser (WebGPU) | Chrome on Apple M4 | 43 | **1.7×** real time | 39 | **1.9×** real time |
Releases measured Measured in September 2026 on the hosted web viewer.
- Each figure is the engine's render throughput with WebGPU in Chrome on an Apple M4, measured in an automated browser. - It is not the frame rate a visitor sees on the page, where the voice and the display share the browser with the engine. - Only Chrome on an Apple M4 is measured. Other browsers, other GPUs and devices without WebGPU are not. Setup and the WebGPU check: [Web](https://docs.bithuman.ai/platforms/web). ## Desktop Pick the row for the product you use: the CLI, Python and the Swift package render at different rates on the same machine. | Runs on | Hardware | Essence 2 fps | Essence 2 × real time | Expression 2 fps | Expression 2 × real time | |---|---|---|---|---|---| | macOS · CLI | Apple M4 | 106 | **4.2×** real time | 168 | **8.4×** real time | | macOS · Python | Apple M4 | 174 | **6.9×** real time | 169 | **8.4×** real time | | macOS · Swift package | Apple M4 | 120 | **4.8×** real time | 177 | **8.8×** real time | | Linux · CLI | Intel Core i7-13700F (x86_64) | 50 | **2.0×** real time | 44 | **2.2×** real time | | Linux · Python | Intel Core i7-13700F (x86_64) | 49 | **1.9×** real time | 47 | **2.3×** real time | | Windows · Python | Intel Core i7-13700F (x86_64), 8 threads | 30 | **1.2×** real time | 21 | **1.0×** real time |
Releases measured Measured in September 2026 on CLI 2.8.1, bithuman 2.11.12, bithuman 2.11.13, bithuman 2.11.18 and Swift package 2.15.0.
- Each figure is one render of a reference speech clip, as fast as the machine allows, with nothing else running. - Only these two machines are measured: an Apple M4 Mac and an Intel Core i7-13700F desktop. Other processors render at other rates. Memory per render is on [How we measure](https://docs.bithuman.ai/performance/method#memory). Setup for each product: [CLI](https://docs.bithuman.ai/platforms/cli), [Python](https://docs.bithuman.ai/platforms/python), [Apple](https://docs.bithuman.ai/platforms/ios). ## Cloud bitHuman picks the server for each session, and every server type renders faster than real time. Each row is one server type. | Runs on | Hardware | Essence 2 fps | Essence 2 × real time | Expression 2 fps | Expression 2 × real time | |---|---|---|---|---|---| | Cloud API · GPU | NVIDIA RTX 4090 | 104 | **4.1×** real time | 340 | **17.0×** real time | | Cloud API · Apple silicon | Apple M4 Max | 71 | **2.8×** real time | 111 | **5.5×** real time | | Cloud API · CPU | x86 server CPU | 28 | **1.1×** real time | 27 | **1.3×** real time |
Releases measured Measured in September 2026 on the cloud API.
- Each figure is how fast one finished video is delivered, including encoding the video file, on a server with no other sessions. - With other sessions on the same server, a session can render more slowly than shown. - A live conversation plays at the model's own rate, 25 fps for Essence 2 and 20 fps for Expression 2. Speed above that makes a video file finish sooner; it does not put more frames on screen. --- # Python URL: https://docs.bithuman.ai/platforms/python > Render Essence 2 and Expression 2 avatars from your own Python code. A file in and frames out, or a live stream of audio in and frames out, on your own machine. ## Before you start To run an avatar without code, use the [CLI](https://docs.bithuman.ai/platforms/cli). > **Note:** On Linux and Windows, Python renders both models on the CPU alone, no GPU. On macOS it renders on Apple silicon. Windows has its own page: [Windows](https://docs.bithuman.ai/platforms/windows). See [CPU only (no GPU)](https://docs.bithuman.ai/deploy/cpu). | Detail | Expression 2 | Essence 2 | |---|---|---| | **Renders** | [any character from one portrait](https://docs.bithuman.ai/models/expression-2) | [a photoreal person from one portrait](https://docs.bithuman.ai/models/essence-2) | | **Install** | `pip install "bithuman[expression-2]"` | included in the same install | | **Frames** | RGB `numpy` arrays, `(height, width, 3)` `uint8` | the same | | You need | Check | |---|---| | Python 3.10–3.14 | `python3 --version` | | macOS 14+ on Apple silicon, Linux x86_64 or Linux arm64, or [Windows 11 x86_64](https://docs.bithuman.ai/platforms/windows) | `python3 -c "import platform; print(platform.system(), platform.machine())"` | | An API secret | [Your API secret](https://docs.bithuman.ai/start/api-secret) | | A paid plan (Creator or higher): usage bills per second while the avatar runs | [Pricing](https://docs.bithuman.ai/pricing) | | About 1 GB of disk (570 MB package, 118–190 MB per avatar) | `df -h .` | ## Install ```bash python3 -m venv .venv source .venv/bin/activate pip install "bithuman[expression-2]" ``` Install into a virtual environment: Debian and Ubuntu refuse a system-wide `pip install` (`externally-managed-environment`). If `venv` is missing, run `sudo apt install -y python3-venv` first. The package installs no command-line tool. ## Authenticate Set `BITHUMAN_API_SECRET` in the shell that runs Python (`bithuman.open` reads it), or pass `api_secret=` to `AsyncBithuman.create()`. Downloading a sample avatar needs no account. ## Run your first avatar ```bash export BITHUMAN_API_SECRET="" curl -fL -o wise-pup.imx "https://api.bithuman.ai/v1/agent/A23WJF0199/model/download?model=expression-2" curl -fsSLo speech.wav https://docs.bithuman.ai/samples/speech.wav ``` ```python import bithuman bithuman.open("wise-pup.imx").render("speech.wav", out_mp4="out.mp4") # → out.mp4: wise-pup speaking the sample, 416×720, 15 s ``` Open `out.mp4` to watch it talk. `out_mp4=` needs no `ffmpeg`, and `render` returns the number of frames written. It takes a path to an audio file (WAV, MP3 and the other common formats), or already-decoded 16 kHz mono audio (`int16` or `float32` arrays, or raw 16-bit bytes). The same call opens Essence 2 and Essence 1 `.imx` files: for a photoreal person, download the `sofia-ramirez` Essence 2 sample with `curl -fL -o sofia-ramirez.imx "https://api.bithuman.ai/v1/agent/A52DHS2219/model/download?model=essence-2"` and render it the same way (1080×1920). To process the frames yourself, iterate over `render` without `out_mp4=`: ```python import bithuman with bithuman.open("wise-pup.imx") as avatar: frames = [image for image in avatar.render("speech.wav")] print(len(frames), "frames of", frames[0].shape) # → 300 frames of (720, 416, 3) ``` Frames are RGB; OpenCV expects BGR, so write one with `cv2.imwrite("frame.png", image[:, :, ::-1])`.
*Capture: The sofia-ramirez avatar speaking in a window opened by the Python SDK on a Mac. Captured on an Apple M4 Mac (macOS) · Python SDK 2.11.6 · sofia-ramirez (Essence 2) · 2026-09-23.* (https://docs.bithuman.ai/examples/python-macos/clip.mp4) ## Performance | Configuration | Hardware | Essence 2 | Expression 2 | |---|---|---|---| | Linux · Python · CPU only (no GPU) | Intel Core i7-13700F (x86_64) | 1.9× real time | 2.3× real time | | macOS · Python | Apple M4 | 6.9× real time | 8.4× real time | × real time: seconds of video rendered per second; 1.0× or more holds a live conversation ([method](https://docs.bithuman.ai/performance#desktop)). A finished `render` logs its own rate on the `bithuman` logger at INFO. --- # Windows URL: https://docs.bithuman.ai/platforms/windows > Render Essence 2 and Expression 2 on a Windows 11 PC, with no GPU. The `bithuman` Python package: a file in and frames or an MP4 out, or a live stream in and frames out. ## Before you start Both models run on the CPU alone, with no GPU and no WSL. The [CLI](https://docs.bithuman.ai/platforms/cli) on Windows runs cloud sessions and MCP. | Detail | Expression 2 | Essence 2 | |---|---|---| | **Renders** | [any character from one portrait](https://docs.bithuman.ai/models/expression-2) | [a photoreal person from one portrait](https://docs.bithuman.ai/models/essence-2) | | **Install** | `pip install "bithuman[expression-2]"` | included in the same install | | **Frames** | RGB `numpy` arrays, `(height, width, 3)` `uint8` | the same | | You need | Check | |---|---| | Windows 11 on x86_64 (64-bit Intel or AMD) | `python -c "import platform; print(platform.system(), platform.machine())"` prints `Windows AMD64` | | 64-bit Python 3.10–3.14, from [python.org](https://www.python.org/downloads/windows/) or `winget install Python.Python.3.12` | `python --version` | | An API secret | [Your API secret](https://docs.bithuman.ai/start/api-secret) | | A paid plan (Creator or higher): usage bills per second while the avatar runs | [Pricing](https://docs.bithuman.ai/pricing) | | About 1 GB of disk (the package, 118–190 MB per avatar) | `Get-PSDrive C` | The package carries the Microsoft C++ runtime it needs, so there is nothing else to install. It is tested on Windows 11; Windows on Arm has no package yet. ## Install In PowerShell: ```powershell python -m venv .venv .venv\Scripts\Activate.ps1 pip install "bithuman[expression-2]" ``` The package installs no command-line tool. ## Authenticate Set `BITHUMAN_API_SECRET` in the PowerShell window that runs Python (`bithuman.open` reads it), or pass `api_secret=` to `AsyncBithuman.create()`. See [Your API secret](https://docs.bithuman.ai/start/api-secret). Downloading a sample avatar needs no account. ## Run your first avatar ```powershell $env:BITHUMAN_API_SECRET = "" curl.exe -fL -o wise-pup.imx "https://api.bithuman.ai/v1/agent/A23WJF0199/model/download?model=expression-2" curl.exe -fsSLo speech.wav https://docs.bithuman.ai/samples/speech.wav ``` ```python import bithuman bithuman.open("wise-pup.imx").render("speech.wav", out_mp4="out.mp4") # → out.mp4: wise-pup speaking the sample, 416×720, 15 s ``` Open `out.mp4` to watch it talk. Windows' own H.264 encoder writes it, so no `ffmpeg` install is needed. To process the frames yourself, iterate over `render` without `out_mp4=`: ```python import bithuman with bithuman.open("wise-pup.imx") as avatar: frames = [image for image in avatar.render("speech.wav")] print(len(frames), "frames of", frames[0].shape) # → 300 frames of (720, 416, 3) ``` ## Integrate into your app The Python API is the same on Windows as on macOS and Linux: `AsyncBithuman` takes audio as it arrives and yields frames and audio at the model's rate, `interrupt()` stops a reply, and the [LiveKit plugin](https://docs.bithuman.ai/platforms/livekit) renders the avatar inside a LiveKit Agents worker. The code and the calls are in [Python: Integrate into your app](https://docs.bithuman.ai/platforms/python/app#integrate-into-your-app). ## Platform notes - The first Essence 2 render downloads a shared audio encoder (about 66 MB) to `%USERPROFILE%\.bithuman\deps`, once. - `BITHUMAN_CACHE_DIR` moves the download cache from `%USERPROFILE%\.cache\bithuman`. - `python -m bithuman render