{"slug": "amuse-and-spark-running-live-talking-ai-avatars-on-an-esp32", "title": "Amuse and Spark – Running Live Talking AI Avatars on an ESP32", "summary": "GeaStack released two open-source apps, Spark and Amuse, that run live talking AI avatars directly on the Waveshare ESP32-S3 Touch AMOLED 2.06 board, with source available on GitHub. Spark connects the board over WebSocket to OpenAI's Realtime API (gpt-realtime-2.1) for full-duplex voice with four characters, while Amuse renders LemonSlice video avatars with ElevenLabs voices and requires a Python 3.11+ bridge on a local computer. Setup uses npm ci, npx gea setup, npm run build and npm run flash, and the authors warn that API keys are embedded in the firmware, so .env files and built binaries should be kept private.", "body_md": "Both apps run on the\n        [Waveshare ESP32-S3 Touch AMOLED 2.06](https://www.waveshare.com/esp32-s3-touch-amoled-2.06.htm),\n        the watch-shaped board from [our first post](https://geastack.com/blog-we-taught-a-chip-to-run-css), and Amuse\n        also runs on its 1.8″ sibling. You swipe to pick a character, tap **Start**, and talk.\n        The source for both is on GitHub:\n      \n\n## Spark\n\n        Spark is a voice agent. The board opens a WebSocket to OpenAI's Realtime API\n        (`gpt-realtime-2.1`) itself, streams microphone audio up and plays the reply as it\n        arrives. There is no server or phone in between. Audio is full duplex, so you can interrupt a reply by\n        speaking, the way you would with a person.\n      \n\nIt has four characters, each with its own voice, persona and animation drawn on a Canvas:\n\n- **KITT** , a protective, dry-witted car, with a red scanner while it listens and three columns of voice lamps while it speaks.\n- **Nova** , an astronomer on an orbital observatory, with twinkling stars and planetary orbits.\n- **Echo** , a deep-sea navigator, with a sonar sweep and a speech waveform.\n- **Flora** , a mindfulness companion, with a growing leaf and a flower.\n\n        A character is one folder: a `character.ts` with its voice and instructions, a\n        `View.tsx` component, a stylesheet and an optional Canvas animation. Add a folder and\n        the build picks it up; there is nothing else to register. The conversation runs in a Worker, which\n        GeaStack compiles to native code alongside the UI.\n      \n\n## Amuse\n\n        Amuse puts a talking face on the screen. Its cast is Zuck, an awkward tech nerd; Alfred, a thoughtful\n        scholar; Felipe, an imaginative artist; Jojo, a lively optimist; and Todd, an easygoing frog. Each\n        is a [LemonSlice](https://lemonslice.com) video avatar with an\n        [ElevenLabs](https://elevenlabs.io) voice. When you tap Start, the board creates a hosted\n        session, and the character's face, lip-synced to its voice, plays on the AMOLED as you talk.\n      \n\nAmuse needs a small bridge running on a computer on the same network. The bridge joins the hosted session's call and relays the microphone, audio and video between it and the board. Several boards can connect to one bridge at once, each with its own session. On the board, echo cancellation runs natively, so the microphone stays open while the character speaks without hearing itself.\n\nSwiping to a different character ends the current conversation. Each character keeps its configuration and portraits in its own folder, prepared for both supported screen sizes.\n\n## Try them\n\n        Each repository's README covers setup. In short: `npm ci`, `npx gea setup` to\n        register the board and install ESP-IDF, fill in `.env` with your Wi-Fi and API\n        credentials, then build and flash with npm.\n      \n\n```\nnpm ci\nnpx gea setup\nnpm run build\nnpm run flash\n```\n\nSome things to know before you start:\n\n- \n**Your API keys go into the firmware.** Keep`.env` and any binaries you\n          build private.\n- \n**Amuse needs the bridge** (Python 3.11+) and LemonSlice credentials to hold a\n          conversation.\n\n        Both are meant to be forked. Change a persona, add a character, or point them at a different board\n        with `npx gea setup`. If you build something with them, we'd like to see it.", "url": "https://wpnews.pro/news/amuse-and-spark-running-live-talking-ai-avatars-on-an-esp32", "canonical_source": "https://geastack.com/blog-introducing-amuse-and-spark", "published_at": "2026-10-03 14:58:02+00:00", "updated_at": "2026-10-03 15:06:58.054967+00:00", "lang": "en", "topics": ["ai-agents", "ai-products", "developer-tools", "artificial-intelligence"], "entities": ["GeaStack", "Spark", "Amuse", "Waveshare ESP32-S3 Touch AMOLED 2.06", "OpenAI Realtime API", "gpt-realtime-2.1", "LemonSlice", "ElevenLabs"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/amuse-and-spark-running-live-talking-ai-avatars-on-an-esp32", "markdown": "https://wpnews.pro/news/amuse-and-spark-running-live-talking-ai-avatars-on-an-esp32.md", "text": "https://wpnews.pro/news/amuse-and-spark-running-live-talking-ai-avatars-on-an-esp32.txt", "jsonld": "https://wpnews.pro/news/amuse-and-spark-running-live-talking-ai-avatars-on-an-esp32.jsonld"}}