Wenlan
Wenlan is a source-backed AI knowledge base and LLM wiki for AI work: organize documents and decisions into pages you can find, inspect, and review.
翻訳待ち
NPU-accelerated local voice typing & auto-captioning on Fedora/KDE via OpenVINO GenAI Whisper
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Live captions for anything playing on your Linux laptop, running on the NPU
that came with it. No cloud, no API key, no account, no audio leaving the
machine. Point it at whatever is playing and it captions in your terminal, or
in a floating box above everything else on screen. The same box does
dictation too: hold a key, talk, and let go to type what you said. There is
nothing to configure: start it and it goes.Read the full README ↗Live captions for anything playing on your Linux laptop, running on the NPU that came with it. No cloud, no API key, no account, no audio leaving the machine. Point it at whatever is playing and it captions in your terminal, or in a floating box above everything else on screen. The same box does dictation too: hold a key, talk, and let go to type what you said. There is nothing to configure: start it and it goes.
pip install vinowhisper && vinowhisper-setup && vinowhisper-caption
To be upfront about the bias: I did not build this because local speech-to-text is hard to find. I built it because my laptop has an Intel NPU rated at 16 TOPS that was doing absolutely nothing, and captioning a video turns out to be the rare workload that suits it: continuous, latency-sensitive, and small enough to fit. 16 TOPS is a coprocessor, not a GPU, and whisper-small.en is one of the genuinely useful models that fits in it.
So the pitch is not "another Whisper wrapper." It is: the transcription runs on
a chip that is otherwise idle, so it costs you no CPU, no GPU, no fan, and no
network. openvino-genai's WhisperPipeline with device="NPU" does the
work, the same idea as vinoAuthFace,
different feature.
Measured on this laptop (Wildcat Lake, stepping A0), whisper-small.en on the NPU, 2026-09-12:
Per 12s window (the default), generate() | 0.70s mean, 0.85s p90 |
| Captions behind the audio | ~1.5s at best |
| First streamed token | 0.204s |
| Idle cost after you stop | zero, the server exits itself |
The Intel iGPU does the same window in 0.95s and the CPU in 2.30s, so both fallbacks are usable, just laggier.
Words are never rewritten once printed. The stitcher runs LocalAgreement-2:
a word is committed only when two overlapping windows independently agree on
it. That is why the transcript can live in your terminal's own scrollback,
where it survives quitting and where your terminal's selection and search still
work on it. The hearing… line is the words heard once and still waiting on a
second opinion, so the two-cycle commit delay is visible rather than felt as
a freeze.
It scales to zero, the systemd way. The NPU model load costs 10-30s, so something has to hold it. A socket unit owns a private Unix socket at boot with no process running, systemd spawns the server on the first connection, and the server exits itself after 5 minutes idle. Serverless, on your laptop, with no framework.
The model download is verified. The Hugging Face source is pinned to a
commit and every file is sha256-checked before the export reads it, and the
export is then hashed against pins in vinowhisper/model_digests.json before
anything loads it.
Details in SECURITY.md.
A missing NPU degrades instead of bricking. Selection walks NPU, then GPU,
then CPU, 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.
It tells you how to fix it. Nearly every error path here prints the command that resolves it, in your distro's package names (see Supported distros).
The overlay is optional, and native. vinowhisper-tray is a 6.3MB Rust
binary that floats a caption box above every window, fullscreen video
included, with a tray icon, a global shortcut and a start-at-login toggle. It
links nothing but libc, adds nothing to the Python install, and draws the same
event stream as the terminal UI. It also does dictation: hold Meta+H (the
dictation key on laptops that have one), talk, and let go to type what you
said into the focused window, one NPU decode per utterance. Optionally, a small
model on the NPU tidies it first, and only by deleting: "um", stammers, "three, no
wait, four", "scratch that". It never adds or rewords a word, and nothing leaves the
machine. docs/tray.md
curl -fsSL https://github.com/karanshukla/vinoWhisper/releases/latest/download/install.sh | bash
That checks the latest release's wheel against its SHA256SUMS, installs it with
uv (fetching uv itself, hash-pinned, if you don't have it), 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 paths that
actually exist. It prints every command before running it and asks first.
The desktop overlay (floating captions and dictation) is one more command:
vinowhisper-setup --gui. It downloads the binary from the GitHub release and
checks it against a digest pinned in the Python package.
To upgrade, use Check for updates on the settings window's About page, or run
vinowhisper-upgrade. It installs the new release's wheel, refreshes the overlay and window
if you have them, and restarts the server; the exported model stays. To build from a
checkout instead, scripts/install.sh still clones and syncs the locked environment.
This is the beginning of the README. Read the rest at the original. Read the full README ↗