Real-time Avatar Platform

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.

iPhone
Raspberry Pi
Mac mini
Browser
Cloud
25 fpsreal-time lip-sync
On-deviceprivate — data stays local
From 1 credit/minself-hosted, air-gap ready
Energetic Audio Story Buddy
Press Launch to talk to a live agent
Trusted by teams shipping live agents
ShopifyUberAllbirdsIvoclarMINT MuseumNRF
Quickstart

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) }
}
Embed anywhere

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.

index.html
<!-- Corner gadget — one line -->
<script
  src="https://www.bithuman.ai/bithuman-web-gadget.js"
  data-agent-url="https://bithuman.ai/embed/A74NWD9723">
</script>
your site
Chat

A draggable, resizable avatar bubble in the corner — tap to talk (voice & video). Best for a quick, ambient presence.

index.html
<!-- Chat widget — one line -->
<script
  src="https://www.bithuman.ai/bithuman-chat-widget-v5.js"
  data-agent-url="https://bithuman.ai/A78WKV4515">
</script>
your site
AI assistant
Hi! How can I help you today?
What can bitHuman do?Get started
Ask our AI assistant

A full support-chat experience (the Ivoclar style) — text, voice, and video, with suggested questions and a welcome message. Best for help & sales.

Ship your first visual agent today

Free tier — 99 credits a month, no card required.