§ 01

The Pipeline

four hops, under 800ms
end-to-end runtime · single utterance
01 · STTDeepgram
02 · LLMDeepSeek V3.2
03 · TTSQwen 3 TTS
04 · AvatarLive2D + LiveKit
Transport
LiveKit (WebRTC)
sub-300ms RTT
Speech-to-Text
Deepgram
multilingual stream
Reasoning
DeepSeek V3.2
via OpenRouter
Text-to-Speech
Qwen 3 TTS
expressive, low-latency
Avatar
Live2D Cubism
emotion-driven rig
Backend
Python · FastAPI
single-binary deploy
Emotion classifier
prompt-based · per-turn
5 discrete states
§ 02

Demo

v0.1.1 · live voice loop
v0.1.1 demoopen on YouTube
§ 03

The Emotion System

five poses, blended over Live2D parameters
§ 04

Avatar Rendering

browser-native, zero external software
rendering stack · bottom → top
TransportLiveKit + Web Audio
WebRTC data channel + AnalyserNode
Model RuntimeCubism 4 Core
WASM · parametric model engine
Live2D Bridgepixi-live2d-display
v0.4 · Cubism 4 subpackage
Browser LayerPIXI Application
WebGL canvas · full-viewport

The avatar runs entirely in the browser, with no VTube Studio and no external process. The animation loop is monkey-patched into coreModel.update() so every frame gets injected parameters right before GPU commit.

01 · blink fsm

Organic Blink

A finite state machine fires random timers for the blinks. Probability and cooldown both vary, so the pattern never repeats exactly.

→ ParamEyeLOpen / ParamEyeROpen
02 · saccades

Eye Saccades

Every frame adds a little randomization to gaze direction via Math.random(), so the eyes drift the way real eyes do and never sit perfectly still.

→ ParamEyeBallX / ParamEyeBallY
03 · lip sync

RMS Lip Sync

AnalyserNode computes Root Mean Square amplitude from the LiveKit audio track in a requestAnimationFrame loop and maps it directly to mouth open.

→ ParamMouthOpenY
§ 05

AI Memory & RAG

reads documents, recalls on demand
ingestion pipeline

Teaching AURA

Upload any document. AURA chunks and embeds it, and the contents are searchable in the middle of a live conversation.

01
UploadPOST /api/v1/memory · PDF, TXT, MD
02
Chunking500-char overlapping chunks via PDF parser
03
EmbeddingSentence-Transformers → dense vector
04
StorageSupabase pgvector · vector + metadata
retrieval · per turn

AURA Remembers

Every utterance triggers a semantic search. Matching chunks get injected into the LLM context with no visible step, so AURA just seems to know.

01
User speaksDeepgram transcription → query text
02
Semantic searchVector similarity vs. memories table
03
Top chunksBest-match text retrieved from pgvector
04
Context injectChunks injected into LLM system prompt
supabase schema · 4 tables
conversationsMetadata — id, title, user_id
messagesChat history — content, role, emotion, timestamp
memoriesKnowledge base — content, embedding vector, metadata
personality_settingsSystem prompts, voice, emotional baselines
§ 06

The Interface

the avatar plus the whole control surface
§ 07

What I built · what's next

What's in v0.1.1

  • ✦End-to-end voice loop under 800ms from speech end to TTS start.
  • ✦Multilingual in and out. Deepgram and Qwen 3 handle EN/ID switching mid-sentence.
  • ✦Five-state emotion system with prompt-based classification per turn.
  • ✦Live2D rig driven by emotion vectors, lip-sync from TTS phonemes.
  • ✦Hot-reload model swap to change LLM provider or model live from the control center.
  • ✦Per-context memory so every chat keeps its own personality, history, and creativity dial.

What's next

  • →Tool use via function-calling for calendar, search, and code execution.
  • →Long-term memory with vector recall across contexts.
  • →Vision input from webcam frames, so AURA can see what you're working on.
  • →Avatar marketplace with pluggable Live2D rigs and rig-aware emotion mapping.
  • →Mobile client for the conversation loop.
  • →v1.0 when emotion classification moves on-device.
§ 08 · talk to me about AURA

Building real-time AI? Let's compare notes.

I'm always up for swapping notes on Live2D rigging, sub-second voice pipelines, or emotion classification prompts. And if you want AURA's roadmap to head somewhere specific, tell me.

currently in South Tangerang, Indonesia, async-friendly across timezones