
**Open-source digital humans, ready to deploy.**
Realtime voice conversation on a published channel: ask, it answers with lip-synced video; interrupt it any time.
FlashHead with the built-in Luna half-body preset: one portrait, the whole head is rendered by the engine and pasted back onto a head-to-waist canvas; idle breathing and gesture clips (shy, laugh, shake, wink) are baked from the same canvas, and the instinct layer picks a gesture while the brain is still composing. Ships as a built-in preset; publish it as a channel from the console.
A self-hosted digital human you can actually hand to a customer: realtime voice
conversation, admin console, knowledge base, channel publishing — all open source.
One GPU, or none.
Stream a talking avatar over WebRTC — voice in, lip-synced video out — with
swappable avatar / TTS / ASR / LLM engines, avatar training from a video,
voice cloning, and a one-command setup wizard.
[](LICENSE)
[-green)](LICENSING.md)
· [Quickstart](#quickstart) · [Architecture](#architecture) · [Integration API](#integration--api) · [Licensing](LICENSING.md) · [Commercial support](#commercial-support)
> **Hardware, up front:** the default FlashHead avatar engine needs an
> **NVIDIA GPU (4090-class)**; the lighter wav2lipLS profile runs on more
> modest GPUs. **One avatar worker serves one live session at a time** — see
> [Capacity & scaling](#capacity--scaling) before planning a deployment.
> No GPU at all? Every component can be a remote endpoint.
---
## What it is
Mynah is a Go realtime core (**`cored`**) that streams synchronized
video + audio from a Python avatar worker to a browser over **WebRTC**. It
receives a WebRTC offer, opens a bidirectional gRPC session to the avatar
engine, feeds it **TTS audio** (from text, or from an **LLM** chat turn), and
paces the encoded VP8/H.264 + Opus frames back to the browser. Optional **voice
input** (ASR worker) and **semantic turn-taking** (a turn-detector worker that
decides when the user has actually finished speaking) make it a full
voice-to-voice loop. An optional control plane (`--db`) adds an admin API,
config hot-apply, a knowledge base (RAG), and publishable visitor "channels".
It is engine-agnostic by design: avatar, TTS, ASR, LLM and turn-detection are
**pluggable** behind small contracts (a gRPC streaming contract for workers, an
OpenAI-compatible HTTP surface for TTS/LLM). The default engines are chosen to
be **commercially usable** out of the box.
## Highlights
- **Realtime, not rendered video** — the cloud brain answers within ~0.2 s of
the user's last word and lip-synced video starts under a second; barge-in
stops it mid-sentence. A bundled audio end-of-turn model (Smart Turn v3.2,
BSD-2) decides when the user has actually finished speaking. Numbers in
[Performance](#performance).
- **One portrait, a half-body presenter** — FlashHead renders the whole head
and pastes it onto a 720×1280 head-to-waist canvas; idle breathing and
gesture clips (shy, laugh, shake, wink) are baked from the same canvas.
**Luna** and **Nova** ship as built-in presets; your own portrait takes one
prepare step.
- **Instinct, not just answers** — an instinct layer picks an expression or
gesture while the brain is still composing and plays it the moment the reply
ends. Backed by the Jev cognition model, with a zero-dependency rules
provider as the offline fallback. See `docs/guide/instinct.md`.
- **A console, not a script** — avatars, voices, knowledge base (pgvector RAG
with optional reranking), channel publishing with access control and
concurrency quotas, an engine pool with a VRAM budget, one-click avatar swap
per channel, session monitor.
- **Avatar training from a video** — upload a talking video, the pipeline
picks the best speaking-base frame (MediaPipe, no InsightFace), and the new
likeness becomes selectable with a baked living-standby idle loop.
Consent-gated (see `docs/compliance.md`).
- **Plugs into your stack** — brain options: local LLM, Qwen Realtime
speech-to-speech, or any **Pipecat** pipeline; avatar / TTS / ASR behind gRPC
and OpenAI-compatible contracts; Python SDK (`mynah`), `pipecat-ai-mynah`,
and a DeepSeek Harness plugin.
- **Commercially-clean defaults** — FlashHead (Apache-2.0) and MuseTalk 1.5
(MIT) avatar engines, a self-trained wav2lipLS lightweight profile. See
[LICENSING.md](LICENSING.md).
## Quickstart
**What you need.** One NVIDIA GPU for the avatar engine (6 GB for the
wav2lipLS profile, 12 GB for MuseTalk or FlashHead, 24 GB to run both side by
side), an LLM endpoint (local ollama/vLLM or any OpenAI-compatible API), and a
TTS. The stack starts with **EdgeTTS** (free Edge voices, CPU only, needs
internet) so the first conversation does not wait on a TTS model; switch to
Qwen3-TTS (voice cloning) or a cloud voice from the console without a restart.
**No GPU on this machine?** Every component is a network endpoint: run the
avatar worker on a GPU box and cored on anything. See the docs:
https://honwee.github.io/mynah/ (中文: /zh/)
**One-click cloud image (single-node trial).** On AutoDL, start a 24 GB
instance from the [Mynah community image](https://www.codewithgpu.com/i/honwee/mynah/Mynah), run
`~/mynah/mynahctl start`, open an SSH tunnel — see
[Cloud images](https://honwee.github.io/mynah/guide/cloud-images).
### Quickstart (original)
The fastest path is the **setup wizard** — it provisions LLM / TTS / ASR / avatar
for you (download + start, mirror-aware), then launches the stack:
```bash
python3 deploy/setup/helper.py # → http://127.0.0.1:9500
```
Open it in a browser, click **一键安装 / Install** on each component (or point it
at an existing endpoint), then **启动 / Launch**.
Prefer Docker Compose by hand? See **[deploy/compose/README.md](deploy/compose/README.md)**:
```bash
cd deploy/compose
cp .env.example .env && $EDITOR .env # set GPU index, ports, voice
bash setup-flashhead.sh # fetch FlashHead engine + weights
docker compose up -d --build # start cored + flashhead
# open https://