// docs / overview
LiveAudio documentation
LiveAudio is a free, open-source (MIT) desktop app that generates real-time Whisper speech captions 100% locally and streams them to OBS over a local WebSocket. It runs on Windows and Linux — no cloud, no API key, no per-minute cost.
What LiveAudio is
Plynte LiveAudio is a local-first speech-recognition engine for streamers and creators. It transcribes with Whisper (tiny, base, small, turbo), trims silence with Silero VAD, and broadcasts subtitle JSON over a local WebSocket so OBS — or any localhost client — can render live captions.
- Local processing. No audio or transcribed text leaves your machine. No telemetry.
- Process isolation. Separate worker processes keep capture and transcription stable under heavy load.
- Hot-swap. Change the audio device or model size without restarting the app.
System requirements
| Component | Requirement |
|---|---|
| Operating system | Windows 10/11 x64, or Linux x86_64. No macOS. |
| GPU | Optional — CPU works. NVIDIA CUDA is recommended and auto-detected; needs driver ≥ 525 and VRAM ≥ 4 GiB. |
| RAM | 8 GB minimum, 16 GB recommended. |
| Disk | ~400 MB (CPU) / ~2.5 GB (CUDA) for app + deps, plus model storage. |
| Python | Not required for users — the installer provisions its own Python 3.11. |
| Internet | First run only (downloads Python, deps and models). Fully offline afterward. |
Capture and platforms
LiveAudio captures from a physical microphone on both platforms. On Windows it can also capture system audio via WASAPI loopback.
How it installs (bootstrap)
What you download is a small bootstrapper launcher — a frozen PyInstaller executable, not a multi-gigabyte bundle. On first run it provisions everything else: it resolves the install root, detects your hardware to pick a torch extra, downloads a checksum-verified source zip, ensures uv, runs uv sync (which also fetches a managed CPython 3.11), writes installed.json, then launches the app.
LiveAudio-Setup-X.Y.Z.exe / liveaudio-launcher
│
├─ 1. Resolve install root (portable.marker / default per-user dir)
├─ 2. Detect hardware → torch extra: cpu | cu121
├─ 3. Download liveaudio-src-X.Y.Z.zip (URL + SHA256 baked into the exe)
├─ 4. Ensure uv (bundled > on PATH > previously downloaded)
├─ 5. uv sync --locked --extra <cpu|cu121> --python 3.11
│ (uv also fetches a managed CPython 3.11 into <root>/python)
├─ 6. Write installed.json (atomic — marks the install complete)
└─ 7. Launch <root>/app/.venv/.../liveaudio On later runs installed.json already matches the launcher's target version, so it takes the fast path and spawns the installed app directly. On Windows a brief “Starting LiveAudio…” splash stays up until the app window appears — the app imports torch at module level, so a cold start can take 60+ seconds with no UI of its own.
Install layout
Everything lives under one install root — the source, the virtual environment, the managed Python, and your data:
| Location | Content |
|---|---|
<root>/app/ | Application source (pyproject.toml, uv.lock, liveaudio/). |
<root>/app/.venv/ | Virtual environment created by uv sync. |
<root>/python/ | uv-managed CPython 3.11. |
<root>/installed.json | {app_version, extra, python, uv_version} — marks the install complete. |
<root>/bootstrap.log | Full launcher + uv log of every run. |
<root>/data/ | App data home (LIVEAUDIO_HOME): config.json, sessions/. |
Hardware detection
The launcher decides between the cpu and cu121 torch extras with a first-match-wins ladder:
- A
--device cpu|cudaCLI flag, if you passed one (persisted ininstalled.json). - Otherwise the persisted preference (
extraininstalled.json). - Otherwise NVML +
nvidia-smi: if the driver is≥ 525and VRAM is≥ 4096 MiB→cu121. - Anything else (no NVML, smi failure, or a GPU below requirements) →
cpu, with a note when a GPU was found but did not qualify.
Updates
The app checks the GitHub Releases API in the background and shows an update button when a newer version exists. Clicking it relaunches the launcher with --update vX.Y.Z; you can also run --update by hand (no tag means “latest”). The launcher verifies the source zip’s SHA256, preserves the existing .venv, and re-runs uv sync --locked. Because uv only downloads what changed and torch wheels are cached, a typical update transfers a few MB rather than gigabytes. If the installed version already matches, it reports “already up to date” and exits.