Wallie_main_demo.mp4 #
The open-source AI streamer that sees, hears & reacts β and actually feels alive.
Quick Start Β· Features Β· Dashboard Β· Architecture Β· Roadmap
β
If you think an AI that watchesTwo seconds, and it genuinely helps a solo dev keep shipping.and hearsyour screen should exist β give it a star.
Every AI streamer you've seen has the same problem.
It says two sentences. s. Says two more. s. Describes your YouTube homepage like a screen reader. Forgets what it said thirty seconds ago. Ends every thought with "what do you guys think?" into a chat that doesn't exist. It's not a show β it's a tech demo on loop.
Wallie is different. It's an AI that actually streams β develops thoughts across minutes, reacts to your screen like a person who's been using that computer all day, remembers what it covered an hour ago, takes opinions and sticks with them, drifts between topics the way real conversations drift, and shuts up when there's nothing worth saying.
You design the streamer. Wallie runs the show.
persona βββ
topics βββ€
chat βββ€
vision βββΌβββΊ Wallie βββΊ Voice (TTS) βββΊ OBS / virtual cable βββΊ your stream
hearing βββ€ βββΊ Live2D avatar (VTube Studio)
schedule βββ
Pick the personality. Pick the voice. Pick the LLM. Pick the platform. Everything is swappable, everything is configurable from the browser, and the whole thing runs on your machine with your keys.
Wallie doesn't just watch your screen anymore β it picks up the game and plays it. Right now that's Minecraft: it gathers, crafts, builds, fights, and explores entirely on its own, narrating every moment in character. Smooth, human-looking camera. No human at the keyboard, no script β a real playthrough with a personality.
https://www.youtube.com/shorts/NEfsmppOXJk
And here's the part that makes it believable: the commentary is grounded in what Wallie is actually doing β its real inventory, health, and current goal β not guessed from a blurry frame. So it says
*"heading down to mine diamonds"*because it is, and brings up
*"that one time I dug straight into a lava pit"*because that's its run.
It actually playsβ a planning brain sets the goal;Baritonehandles pathfinding & mining, and a custom Fabric mod handles crafting, combat, item pickup, and a buttery-smooth camera that looks human, not robotic.Grounded commentaryβ the streamer core stays in sync with the playing brain, so what itsaysmatches what itdoes.One-click setupβ the dashboard installs Fabric + every mod for you (and backs up your current ones first).** Any persona, any model**β Play is just another mode. Vision, Hearing, and Play each toggle on/off independently.
Flip on
Playin the dashboard, pick a goal, and go β or jump straight in:
python scripts/run_wallie_live.py
Because the existing ones are toys.
They work for a 2-minute demo and fall apart on a real stream. Here's what actually goes wrong after 10 minutes:
| The problem | What usually happens | What Wallie does |
|---|---|---|
| Repetition | ||
| Says "that's interesting" every 30 seconds | Dedupe engine + phrase cooldown + rolling summary that tracks everything already said | |
| Short memory | ||
| Forgets the topic from 5 minutes ago | Rolling summarizer compresses old turns into bullet notes, injected into every prompt | |
| Robotic vision | ||
| "I can see a YouTube homepage with several videos" | First-person ownership + SKIP escape hatch β narrates nothing, reacts to what matters | |
| Question loops | ||
| Every segment ends with "what do you think, chat?" | Question detector throttles after one; next prompt forces a statement ending | |
| No personality | ||
| Generic helpful assistant voice | Full persona system: energy, humor style, catchphrases, backstory, opinions, taboo topics | |
| Choppy pacing | ||
| 2 sentences β long β 2 sentences | Pipeline overlap + longer thought development eliminates dead air | |
| Broken threads | ||
| Sets up a story, never delivers it | Open-thread tracker forces the next segment to pay off teases and answer its own questions | |
| Topic whiplash | ||
| Jumps from AI to cooking to space with no bridge | Association-based topic drift with configurable style (rigid / natural / freeform) |
These aren't edge cases. They're the default behavior of most AI streamer projects. Wallie was built by hitting every one of these problems and refusing to ship until they were fixed.
Six LLM providers. Three TTS engines. Three chat platforms. Mix and match per profile.
| LLM | TTS | Chat | Avatar |
|---|---|---|---|
| OpenAI | Fish Audio | Twitch | VTube Studio (Live2D) |
| Anthropic (Claude) | ElevenLabs | YouTube | β |
| Google (Gemini) | Piper (local, free) | Kick | β |
| Groq | β | β | β |
| OpenRouter | β | β | β |
| Ollama (local, free) | β | β | β |
Swap providers without changing code. Run a fully offline stream with Ollama + Piper, or go premium with Claude + ElevenLabs.
Not just a name and a system prompt. You design a character:
Identityβ name, handle, pronouns, age range, origin, archetype, backstory** Voice**β energy level (chill β unhinged), humor style (pick multiple: ironic, deadpan, absurd, observational, roast...), profanity level, formalityFlavorβ catchphrases, running gags, banned words, favorite topics, taboo topics** Opinions**β strong opinions toggle, admit uncertainty, break the fourth wall** Extra notes**β free text for anything the structured fields miss
Save multiple personas. Switch between them with a dropdown.
The single biggest technical challenge. Most AI chatbots break down after 20 minutes because the context window fills up.
Wallie's approach:
Rolling summarizerβ every ~14 segments, a background LLM call compresses older history into tight bullet notes** Session notes**β that compressed memory is injected into every system prompt, so the streamer knows what it already said** Cross-session memory**β key facts and viewer interactions persist across streams** Dedupe engine**β paraphrase-aware similarity check (bigram + trigram Jaccard) catches the model repeating itself in different words
Real streamers don't talk at a constant rate. They get excited, they to think, they go on tangents, they settle into a flow.
Mood engineβ arousal, valence, focus, and talkativity drift slowly over the stream. High arousal = faster, warmer output. Low talkativity = silence beats. Mood state feeds into the avatar for reactive animation.Attention engineβ vision events are filtered through a probabilistic decision layer. Not every screen change gets a deep reaction. Some get a glance. Some get ignored. Some trigger a personal tangent.Silence beatsβ the streamer holds natural s when the mood says to. Dead air handled by design, not by accident.** Pipeline overlap**β next segment starts generating while current audio is still playing. No awkward 3-second gaps between thoughts.
wallie_minecraft.mp4 #
Screen reactions are the hardest part to get right. Wallie's approach:
First-person ownershipβ Wallie owns whatever is on screen. Gaming: "I just got bodied by that boss", not "the character is fighting a boss". Browsing: "let me pull this up", not "the user is browsing". Never third-person, never narration.SKIP escape hatchβ if there's nothing specific to name, the model outputsSKIP
and stays quiet. No more narrating generic UIs.Activity adaptationβ detects scrolling, typing, app-switching, video playback and adjusts reactions accordingly. Typing β ignore. App switch β react. Rapid browsing β wait until user settles. Each activity type gets context-aware prompting.Attention engineβ not every screen change gets the same treatment. DEEP reactions (22%), quick GLANCEs (28%), personal TANGENTs (5%), deliberate IGNOREs (27%), and SILENCE beats (18%). Streak fatigue prevents reacting the same way twice in a row.Scene memoryβ remembers what it last said about the current screen. Dedupe threshold at 0.65 with per-sentence comparison catches paraphrased repetition.
Wallie captures your system audio (WASAPI loopback) and reacts to it live, fused with vision into a single reaction β sight and sound, one voice. Just like you organize your senses, not two narrators talking over each other.
Speech & lyricsβ local speech-to-text (faster-whisper) transcribes videos, voice chat, and song lyrics. Auto-uses your GPU if available, clean CPU fallback if not.Real music understandingβ pure-numpy DSP, no extra ML weight. It reads** major/minor key β mood**, tempo + beat strength, instrumentation texture (bass-heavy / acoustic / airy / lo-fi), and production quality (crisp / muddy / harsh). A sad song reads as melancholy; a beat drop reads as energy. It'll call a track a banger or roast a muddy mix.Multimodal fusionβ what it hears is fused with what it sees into one coherent reaction, never two competing ones.** No self-echo**β content-based guard so Wallie never reacts to its own TTS bleeding back through the loopback.** Pure-hearing mode**β run it with vision off and it reacts to audio the way it reacts to a screen: stays quiet, listens, then reacts to what's playing.
Enable it in the dashboard's Hearing section. Needs two extra deps: pip install soundcard faster-whisper
.
Play mode hands Wallie the controls. First game: Minecraft, survival, live and unscripted.
Reliable autonomyβ a planning brain picks high-level goals; a deterministic skill library (crafting, smelting, full tool/armour sets, mining to ore depths, hunting for food & wool, beds, combat with weapon selection, dropped-item pickup) does the actual work β so even a small/free model plays competently instead of flailing.Human-like cameraβ a custom Fabric mod eases every turn at full FPS. No snapping, no teleport-cam β it reads like a person playing.** Grounded commentary**β reactions come from the agent's real game state (inventory, health, threats, current goal), fused through the same single pipeline as vision and hearing. No screen-guessing, no hallucinated "desert temples".One-click installβ Fabric + all mods straight from the dashboard's Play section. Vision/Hearing/Play toggle independently, on any persona.
Not just a mouth that opens and closes. Six animation layers run simultaneously over a single WebSocket, so the avatar feels like a person β not a puppet.
Viseme lip syncβ spectral analysis of PCM audio estimates mouth shape in real-time. Front vowels (A/E/I) spread the mouth wide, back vowels (O/U) round it. Combined with RMS amplitude for jaw openness, attack/release envelope, noise floor gating, and a speaking smile baseline. The result: the avatar's mouth actually forms different shapes per sound, not just open/close.Blinkβ periodic natural eye blinks (~3.8s interval) with random variation and occasional double-blinks. Blink rate adapts to mood: sleepy = more blinks, alert = fewerBody motionβ slow torso sway on BodyAngleX/Y/Z, lower amplitude and longer period than head movement, so the avatar breathes even when silentIdle motionβ head sway and eye darts when not speaking. Eye-dart frequency increases when the streamer's mood focus drops (scattered attention)11 expression slotsβ happy, surprised, laughing, angry, sad, thinking, smug, eyeroll, confused, hype, deadpan** Keyword-driven emotions**β sentence content automatically triggers matching expressions (21 regex patterns, first match wins)** Expression auto-mapping**β on connect, Wallie discovers VTS hotkeys and matches them to empty expression slots by name. No manual configuration needed for models with standard hotkey namesMood-reactive avatarβ the MoodEngine's arousal/valence/focus feed directly into the avatar. Arousal scales idle and body sway amplitude (0.5Γβ1.6Γ). Valence shifts brow position and adds a resting smile when the streamer is in a good mood. Focus modulates eye-dart frequencyEvent cuesβ super chat β hype face, screen change β surprised look + upward glance, thinking β thinking expression, chat message β head turn toward "the chat"
Everything is configured from the browser. No YAML files. No terminal commands after setup.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β€ WALLIE Profile: marlow βΎ β β π β LIVE Stop βΉ β
ββββββββββββ¬ββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββ€
β β β LIVE STATUS β
β Identity β Section editor β βββββββββββββββββ β
β Personal.β β β Current topic β β
β Voice β (each section has its own β β Now saying... β β
β Avatar β editor with live controls) β β Open threads β β
β Topics β β β Recent angles β β
β Vision β Test βΆ monologue / chat / visβ β Session memory β β
β Chat β Output preview + βΆ speak thisβ β Mood state β β
β Engine β β β WebSocket log β β
β API Keys β β βββββββββββββββββ β
ββββββββββββ΄ββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββ
Three columns: navigation, section editor, live status. Test any configuration change instantly with the preview buttons before going live.
No Python knowledge, no terminal, no setup steps. Download β double-click β done.
and unzip it (orDownload the ZIPgit clone https://github.com/Alradyin/wallie-V2.git
).Double-click First run installs everything it needs, then the dashboard opens atstart.bat
.http://127.0.0.1:8765
.Paste your API key in the dashboard β pick a model β hitStart.
That's the whole setup. Everything else is configured in the browser.
macOS / Linux:run./start.sh
instead (chmod +x start.sh
once).
| Path | LLM | TTS | Cost/hour | Quality |
|---|---|---|---|---|
| Free | ||||
| Gemini 2.5 Flash | Piper (local) | $0 | Good for testing | |
| Cheap & fast | ||||
| Groq (Llama 3.3 70B) | Fish Audio | ~$1.50 | Best balance | |
| Premium | ||||
| Claude Sonnet | ElevenLabs | ~$6.50 | Best quality + vision |
All configured from the dashboard. Add your API keys β pick provider β pick model β Start.
Piper (free TTS) setup
Piper runs locally β no API key needed. One extra terminal command to download a voice:
pip install piper-tts onnxruntime
python scripts/download_piper_voice.py en_US-amy-medium
Then in the dashboard: Voice β provider: piper
, path: voices/en_US-amy-medium.onnx
.
Vision setup (screen reactions)
Requires a vision-capable LLM. In the dashboard:
Engineβ toggle "Vision capable" ON- Use a vision model:
claude-sonnet-4-5
,gpt-4o
,gemini-2.5-pro
, orllama-4-scout
on Groq Vision section β toggle ON, adjust frame interval and sensitivity
The SKIP escape hatch is always active β no configuration needed.
Chat platform setup
Twitch: Add OAuth token from twitchtokengenerator.com (chat:read scope). Or leave empty for anonymous read-only.
YouTube: Drop client_secret.json
in scripts/
. First run opens browser for Google OAuth consent.
Kick: Just enter the channel slug. No auth needed (public Pusher WebSocket).
VTube Studio avatar
- Run VTube Studio with API enabled (Settings β API β Enable)
- In the dashboard: Avatar β toggle ON
- First connect triggers a plugin approval popup in VTS β click Allow
- Expression slots are
auto-mapped from your model's hotkeys on connect. Override manually if needed - Adjust lipsync gain/ceiling for your voice. Viseme lip sync (spectral mouth shape) is enabled by default β disable it in Avatar config if your model doesn't have a
ParamMouthForm
parameter - Blink, body motion, and mood-reactive behaviour are enabled by default β tweak or disable per-feature in config
Works with any Live2D model that has standard parameters (MouthOpen
, EyeOpenLeft/Right
, FaceAngleX/Y/Z
, BodyAngleX/Y/Z
).
OBS output routing
Wallie outputs audio through your system's default audio device. To route it into OBS:
Windows: Install VB-CABLE. Set CABLE Input as default playback. In OBS: Audio Input Capture β CABLE Output.
macOS: Use BlackHole the same way.
Linux: PipeWire / PulseAudio loopback (pw-loopback
).
Screen βββββΊ Vision ββββ
(mss + pHash) β
βΌ
Chat ββββββββββΊ Orchestrator βββββ Persona + Topics + Mood
(YT/Twitch/Kick) β
β intent β system prompt + user message
βΌ
LLM (streaming) β 5 providers
β
β token stream
βΌ
SentenceStreamer β splits tokens into TTS-ready sentences
β
βΌ
TTS pipeline β 3 providers, parallel pre-fire
β
β PCM16 audio
βΌ
AudioPlayer βββββββΊ VTube Studio (viseme lipsync + blink + body + expressions)
β β²
β Mood Engine (arousal/valence/focus)
β
βΌ
speakers / OBS / virtual cable
One pipeline. One conversation history. No competing buffers. This is the defining design choice. Early prototypes had parallel generation paths and went insane β the streamer would repeat itself, contradict itself, and lose all continuity. Everything goes through one orchestrator, one set of messages, one output path.
Intent priority: highlight chat (barge in) β vision event β ordinary chat β monologue. Higher-priority intents preempt lower ones.
Continuity machinery:
- Rolling summary of older turns β injected into system prompt
- Open-thread tracker β forces the next segment to resolve dangling questions and teases
- Phrase cooldown β prevents catchphrase spam
- Theme tracker β blocks repeated angles
wallie-v2/
βββ wallie.py # entrypoint
βββ config.py # pydantic models, profile management
βββ core/
β βββ orchestrator.py # the single pipeline
β βββ persona.py # prompt engineering
β βββ context.py # conversation history + rolling summary
β βββ attention.py # vision reaction decisions
β βββ mood.py # slow-evolving emotional state
β βββ memory_store.py # cross-session persistent memory
βββ llm/ # 5 LLM provider adapters
βββ tts/ # 3 TTS provider adapters
βββ audio/ # sounddevice player with alignment safety
βββ vision/ # screen capture + change detection + activity classification
βββ chat/ # YouTube, Twitch, Kick monitors
βββ avatar/ # VTube Studio WebSocket client
βββ dashboard/ # FastAPI + Alpine.js (no build step)
βββ profiles/ # saved persona profiles (YAML)
βββ scripts/ # setup utilities
| Provider | Streaming | Vision | Notes |
|---|---|---|---|
| Groq | |||
| β | β (Llama-4) | Fastest inference. Free tier. | |
| OpenAI | |||
| β | β (GPT-4o) | Strong vision. Premium pricing. | |
| OpenRouter | |||
| β | β (varies) | One key, many models. | |
| Anthropic | |||
| β | β (Claude 4) | Best character/IP recognition. | |
| Gemini | |||
| β | β (2.5 family) | Free tier (50 req/min). | |
| Ollama | |||
| β | β (llava, etc.) | Fully local. No API key. |
| Provider | Streaming | Cloning | Cost |
|---|---|---|---|
| Fish Audio | |||
| β | β | ~$15/M chars | |
| ElevenLabs | |||
| β | β | ~$30/M chars | |
| Piper | |||
| β (local) | β | $0 |
- API keys stored in
.env
with restricted permissions (chmod 600
on POSIX) - Dashboard never exposes raw keys β only masked previews (
sk-β’β’β’xyz
) - Dashboard binds to
127.0.0.1
only β not accessible from the network - Atomic writes prevent
.env
corruption - Provider error messages scrubbed of key-shaped strings before display
- Allowed env variables are hard-coded β the UI cannot write arbitrary keys
Do not expose the dashboard to a public network without a reverse proxy with authentication.
Audio becomes static
Hit the reset audio button in the dashboard top bar. If it recurs, check logs β usually a TTS provider returning non-PCM data (detected and aborted automatically in most cases).
AI describes generic UI ("I see a YouTube page")
The SKIP escape hatch depends on the model. Smaller models (Llama-4 Scout, Gemini Flash) are worse at following it. Upgrade to Claude Sonnet or GPT-4o for better vision, or set commentary density to sparse
.
AI keeps asking questions to chat
The question throttle is automatic (forces statements after one question-ending). If it persists, raise frequency penalty to 0.5β0.7 in Engine settings.
Avatar mouth doesn't move
Check that the MouthOpen
parameter name matches your model (some use ParamMouthOpen
or MouthOpenY
). Override in Avatar β Parameter mapping.
Avatar mouth moves but shape looks wrong
Viseme lip sync drives ParamMouthForm
for mouth shape (wide β round). If your model uses a different parameter name, update it in Avatar β Parameters β Mouth form. If your model doesn't support mouth form at all, disable "Spectral mouth shape" in the Viseme section β lipsync will fall back to volume-only (open/close).
Avatar doesn't blink
Check that your model has EyeOpenLeft
/ EyeOpenRight
parameters (some use ParamEyeLOpen
/ ParamEyeROpen
). Override the parameter names in Avatar config. Blink can be disabled with enable_blink: false
.
Expressions don't fire
Expression slots need to match VTS hotkey names or IDs. If auto-mapping didn't find your hotkeys (naming mismatch), map them manually in the dashboard or set expr_happy
, expr_sad
, etc. in your profile. Use the dashboard's "Discover hotkeys from VTS" to see available names.
TTS returns 401
Verify the key in API Keys β the masked preview should match your provider dashboard. Hit "test" to confirm.
What's coming next:
Streaming avatar backend (HeyGen)β realistic-looking avatars as an alternative to Live2D** First-run wizard**β guided setup that walks you through provider choice β key entry β first stream** Docker image**βdocker run wallie
with a volume for configCost meterβ running spend tally in the live drawer** OBS WebSocket integration**β scene switching tied to stream events** Voice cloning UI**β upload reference audio, create a voice from the dashboard
If any of these matter to you β open an issue, or better yet, a PR.
Issues and PRs welcome. Ground rules:
Code is English-only. Comments, logs, variables β all English. UI can be localized.Single pipeline, single history. Don't add parallel generation paths. That road has been walked.Lazy imports for optional deps. Groq users shouldn't needanthropic
installed.- Run
python scripts/_import_check.py
before submitting.
MIT. See LICENSE.
Wallie's own code is MIT. The Minecraft Play mode uses several third-party mods, which are
installed (and, for convenience, bundled under dist/mods/
) and remain under their own licenses:
| Mod | License | Source |
|---|---|---|
| Baritone (pathfinding/mining) | ||
| LGPL-3.0 | ||
Meteor Client(loads Baritone)https://github.com/MeteorDevelopment/meteor-client** Fabric API**https://github.com/FabricMC/fabric** Fabric **https://github.com/FabricMC/fabric-These mods are used unmodified and distributed as separate jars (mere aggregation); they are the property of their respective authors. Each is freely available at the source links above.
Wallie is built for people who want their AI streamer to feel like a real show, not a tech demo.
Star the repo. Try the $0 path. Tell us what broke.