Private, on-device visual agents
Lifelike avatars that see, hear, and respond — live. Build them in a few lines of code, then run them fully on-device — CPU, Apple Silicon, the browser, or the edge — so no data leaves your hardware.
Let us host it, or run it yourself
That's the only real decision — and you can switch later. Not sure? Start here →
Cloud API
We host the GPU — call simple REST endpoints to generate, host, and drive avatars. No infrastructure to run. Move the same avatars on-device whenever privacy or cost calls for it.
Start with the API →SDK — run it yourself
Run avatars on your own hardware — iOS, Android, Python, macOS, the browser, or one CLI command. Private by design: inference stays on-device, so no data leaves your hardware. Self-host, deploy on-prem, or run air-gapped, from 1 credit/min.
Get the SDK →Your first agent in two minutes
Install once, then drive a live agent from the CLI, Python, Kotlin or Swift. On a phone, the first frame is free — both Android (the whole project) and iOS (the whole app) render a public showcase avatar with no account, no API key and no credits. Android is arm64 only; iOS needs Xcode 26+, an Apple Developer team and a physical iPhone. What each platform needs →
Start here →curl -fsSL https://raw.githubusercontent.com/bithuman-product/homebrew-bithuman/main/install.sh | sh
bithuman login # opens your browser; stores a per-device key on this machine
bithuman pull wise-pup # prints ~/.cache/bithuman/showcase/wise-pup.imx
bithuman run "$(bithuman pull wise-pup)" # live avatar in your browser # pip install "bithuman[expression-2]"
# hello.py
import bithuman
with bithuman.open("A23WJF0199.imx") as avatar: # an Essence 2 .imx or an Expression 2 .avatar — one call
for image in avatar.render("demo_sample.wav"): # (height, width, 3) uint8, RGB, at the avatar's own frame rate
print(image.shape) # hand it to your display — OpenCV wants image[:, :, ::-1] // build.gradle.kts: implementation("ai.bithuman:expression2-android:0.4.7")
import ai.bithuman.expression2.Expression2Avatar
import ai.bithuman.expression2.Expression2ModelStore
import ai.bithuman.expression2.Expression2Options
import android.content.Context
import android.graphics.Bitmap
/** [pcm16k] is 16 kHz mono float32 in [-1, 1] — one float per sample, not ShortArray. */
fun render(context: Context, agentCode: String, pcm16k: FloatArray, show: (Bitmap) -> Unit) {
// Downloads the model the first time (~158 MB). Never on the main thread.
val model = Expression2ModelStore(context).fetch(agentCode)
Expression2Avatar.create(context, model, Expression2Options()).use { avatar ->
val frame = avatar.newFrameBitmap() // ARGB_8888, 416 x 720 — allocate once
avatar.feed(pcm16k) // renders each complete 1.6 s chunk
avatar.flushTail() // the padded tail is the last sentence
while (true) {
if (avatar.pull(frame) != null) { show(frame); continue }
if (!avatar.hasPendingTail && avatar.queuedFrames == 0) break
}
}
} // Package.swift: .package(url: "https://github.com/bithuman-product/homebrew-bithuman.git", from: "2.11.0")
import Expression2
let engine = try Expression2Engine.create(modelPath: avatarDirectory, // the unpacked .avatar
sharedEngineDir: sharedEngineDirectory)
engine.feed(samples) // [Float] PCM, 16 kHz mono
engine.flushTail() // at the end of an utterance
// Generation is asynchronous: pull() returns nil until a chunk lands, so poll.
var idleTicks = 0
while idleTicks < 100 { // 100 x 50 ms with nothing = done
var got = false
while let (frame, _) = engine.pull() { // frame: [UInt8], BGR, engine.width * engine.height * 3
got = true
show(frame)
}
if got { idleTicks = 0 } else { idleTicks += 1; try await Task.sleep(nanoseconds: 50_000_000) }
} Drop an agent into any site
One line of HTML adds a live agent — pick a corner gadget or a full chat widget, then try both right here.
<!-- Corner gadget — one line -->
<script
src="https://www.bithuman.ai/bithuman-web-gadget.js"
data-agent-url="https://bithuman.ai/embed/A74NWD9723">
</script>
ChatA draggable, resizable avatar bubble in the corner — tap to talk (voice & video). Best for a quick, ambient presence.
<!-- Chat widget — one line -->
<script
src="https://www.bithuman.ai/bithuman-chat-widget-v5.js"
data-agent-url="https://bithuman.ai/A78WKV4515">
</script>
AI assistantA full support-chat experience (the Ivoclar style) — text, voice, and video, with suggested questions and a welcome message. Best for help & sales.
Copy-paste starting points
Android app, end to end (Kotlin)
The whole project — no account, no API key, no credits; a frame on an arm64 handset.
Open →iOS app, end to end (Swift)
The whole SwiftUI app — a public showcase identity, no account and no key. Needs Xcode 26+, an Apple Developer team and a physical iPhone.
Open →Hello, avatar (Python)
Stream audio and render frames in ~20 lines.
Open →Voice agent + avatar
A real-time conversational agent with a live face.
Open →REST in any language
Generate and drive an agent over plain HTTP.
Open →Run it from the CLI
One binary, one command, a talking agent in your browser.
Open →Built with bitHuman
Real teams shipping real-time visual agents into the world.
MINT Museum Leaps Ahead in Visitor Engagement with bitHuman's AI Ambassador
MINT Museum launched 'The Little Prince', billed as the world's first museum AI ambassador, powered by bitHuman to give visitors personalized, multilingual guidance and ticketing. The avatar runs on-premise on a single Mac Mini for low latency and data privacy.
Ivoclar Transforms Customer Care with Virtual Einstein's Multilingual Expertise
Ivoclar, a global dental-solutions leader, deployed bitHuman's interactive 'Virtual Einstein' avatar to deliver 24/7 customer care across tradeshows, events, and online platforms, speaking 50+ languages and trained on Ivoclar's full product catalog.
NRF Transforms Conference Experience with 10 Virtual AI Guides at Retail's Big Show
At NRF: Retail's Big Show in the Jacob K. Javits Convention Center, bitHuman deployed 10 AI-powered virtual conference guides as interactive information kiosks, helping thousands of attendees navigate the venue, find exhibitor booths, and get real-time session info.
Ship your first visual agent today
Free tier — 99 credits a month, no card required.