vinoWhisper
NPU-accelerated local live captioning for Linux, using OpenVINO GenAI's
WhisperPipeline on an Intel NPU. Named after
vinoAuthFace, same idea of
OpenVINO doing the NPU work, different feature.
Point it at whatever is playing and it captions in your terminal. Nothing leaves the machine. Start it and it goes; there is nothing to interact with.
The transcript scrolls above that bar in your terminal's own scrollback, so it
is still there after you quit and your terminal's selection and search still
work on it. hearing… is the words heard once but still waiting on a second
cycle to agree, which is the two-cycle commit delay made visible rather than
felt as a freeze.
Install
curl -fsSL https://raw.githubusercontent.com/karanshukla/vinoWhisper/main/scripts/install.sh | bash
That installs uv, clones the repo, builds the
environment, and hands over to vinowhisper-setup, which is where every
machine-specific decision happens: your capture tool, your NPU driver, the
model export your device needs, and systemd units generated against the paths
that actually exist. It prints every command before running it and asks first.
From a checkout, or to see what it would do without doing it:
git clone https://github.com/karanshukla/vinoWhisper && cd vinoWhisper
uv sync
uv run vinowhisper-setup --dry-run # the whole plan, nothing changed
uv run vinowhisper-setup # for real, one prompt per step
Or from PyPI, if you would rather wire up the machine yourself:
pip install vinowhisper # needs Python 3.11-3.13
vinowhisper-setup # still worth running: NPU driver, model export, units
pip install gets you the five commands and the Python dependencies. It cannot
get you an NPU driver, a model export or systemd units, which is what
vinowhisper-setup is for either way. See
docs/install.md for the OpenVINO version
floor and why this could not be a pip install until 2026-08-31.
Commands
vinowhisper-caption # caption system audio
vinowhisper-caption --source mic # caption yourself
vinowhisper-caption --list-targets # capture one app instead of the whole sink
vinowhisper-caption --debug # per-cycle timings, levels, raw transcript
vinowhisper-caption --record ~/sess # save the session for replay
vinowhisper-caption --plain > out.txt # no status bar (implied when piping)
vinowhisper-setup # guided install; re-runnable, idempotent
vinowhisper-setup --dry-run # print the plan, change nothing
vinowhisper-setup --print-units # the systemd units it would generate
vinowhisper-doctor # devices, model, audio, live levels
vinowhisper-doctor --json # the same, for a bug report
vinowhisper-doctor --no-probe # skip the 2s-per-target level capture
vinowhisper-replay ~/sess --restitch # re-run the merge logic offline
vinowhisper-replay ~/sess --sweep 8,12,20 # measure what --window actually costs
Hardware
The NPU is the point. Everything below it exists so a broken driver degrades the tool instead of bricking it.
| Device | Selected | Model export | What you get |
|---|---|---|---|
NPU (Intel(R) AI Boost) |
first | --disable-stateful |
~1.19s per 30s window, measured 2026-08-03 |
| GPU (Arc / Xe) | second | stateful | Untested here. Works in principle; watch the lag figure |
| CPU | last resort | stateful | Runs. Competes with everything else on the machine, and lags |
Selection is automatic and a fallback is never silent: it shows up in the
server journal, in /health, in vinowhisper-doctor, and on the status bar as
a red border. The two model exports are not interchangeable, and the NPU needs
a userspace driver half that no distro packages completely.
docs/hardware.md covers all of it, including what to do
when the NPU does not show up.
Audio capture works on PipeWire (pw-record) or PulseAudio (parec), picked
automatically, and package names for eight distro families live in one table in
vinowhisper/distro.py. If a name is wrong for your
distro, that is expected, and it is the fastest thing here to fix.
Docs
| Installing | What the installer does, the OpenVINO version floor and why, pinning the window on top |
| Hardware | Device selection, the two model exports, and every way the NPU fails to appear |
| Audio capture | PipeWire vs PulseAudio, distro coverage, and what actually silences a capture (it is not the mute button) |
| Latency | Why captions trail the audio, the one knob that changes it, and why the wording drifts |
| Debugging | --record, offline replay, and what vinowhisper-doctor measures |
| Architecture | Socket activation and scale-to-zero, and how to stop it |
More
- Design doc, benchmarks, and the three export bugs hit getting to a working NPU pipeline: wildcat-lake-linux/input/f5-voice-typing.md
- CONTRIBUTING.md, where the useful contributions are distro corrections and reports from hardware that isn't this laptop
- SECURITY.md, what stays on the machine and what the loopback server's trust boundary actually is
- CHANGELOG.md
MIT licensed.
Release files for vinowhisper 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| vinowhisper-0.3.0.tar.gz | 77.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| vinowhisper-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size:145.6 kB
Release files / vinowhisper-0.3.0.tar.gz
| Download URL | vinowhisper-0.3.0.tar.gz |
|---|---|
| Size | 77.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
52dac626c48b389ab35cd5088bfe93fc445aa0e17a3ab79774cffc5b87160354
|
|
BLAKE2b-256 checksum How to use checksums |
38c5237b71a4d74e41cb09cd6f743790cf0484e6dd9ae720a5bb25f4c7ad9f16
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / vinowhisper-0.3.0-py3-none-any.whl
| Download URL | vinowhisper-0.3.0-py3-none-any.whl |
|---|---|
| Size | 68.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0b0ade0a5b399bbde54e5bd8bf33b8c739237e8f0de200ba867103855cf351ea
|
|
BLAKE2b-256 checksum How to use checksums |
c609ef40728e834cde9c19e7c668885608cc0ebb12795b9d33c29b6eb56b9025
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.8 {"installer":{"name":"uv","version":"0.12.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|