vinoSpeak
Local text-to-speech on the Intel NPU, using Kokoro-82M INT8 through OpenVINO GenAI. Type a sentence or point it at a file and it reads it aloud. Nothing leaves your machine after the one-time ~160 MB model download, and OpenVINO's own telemetry is blocked.
- Speaks text, files and stdin. Markdown is cleaned up for listening, and PDFs, Word and slides work through vinoSearch's extracted text.
- Reads vinoWhisper sessions: the summary, or the transcript.
- Starts talking in about 1.5 s on the NPU, however long the text: the first sentence plays while the rest is synthesized.
- 41 Kokoro voices in US/UK English, Spanish, French, Hindi, Italian and Brazilian Portuguese, at 0.5x to 2x speed.
- Plays or saves: your speakers via PipeWire/PulseAudio/ALSA, or a WAV.
- NPU, GPU or CPU. CPU works with no driver at all.
- A window (proof of concept) to find a file with vinoSearch and listen to it, and a Python API.
Install
Python 3.11 to 3.14. With uv:
uv tool install --python 3.14 vinospeak
vinospeak "Hello."
--python 3.14 because OpenVINO 2026.4.1 has no 3.15 wheels yet. OpenVINO is
pinned to the same release as vinoPop and vinoWhisper, so programs sharing one
NPU never run mismatched runtimes.
From source, for the exact versions in uv.lock, hashes included. --locked
fails if the lock is out of date:
git clone https://github.com/karanshukla/vinoSpeak && cd vinoSpeak
uv sync --locked
uv run vinospeak "Hello."
To put that checkout's vinospeak on your PATH with the lock's versions as
constraints (uv tool install doesn't read uv.lock by itself):
uv export --locked --no-dev --no-emit-project --no-hashes -o constraints.txt
uv tool install --constraints constraints.txt .
The window isn't on PyPI, so it's always built from a checkout, with
Rust. This puts it in your app menu, using the vinospeak
on your PATH or in ~/.local/bin:
gui/install.sh # --uninstall removes it
VINOSPEAK=.venv/bin/vinospeak gui/install.sh # or the checkout's vinospeak
Finding files in it needs vinoSearch running. See gui/README.md.
Fedora Atomic / openSUSE Aeon: nothing to layer for vinoSpeak itself. uv
brings its own Python and the wheels carry espeak-ng and libsndfile. Only the
NPU driver (for --device NPU) and an audio player, if you lack one, are
system packages.
No player? Install pw-play or paplay, or use --output:
| Distro | pw-play |
paplay |
|---|---|---|
| Fedora | pipewire-utils |
pulseaudio-utils |
| Ubuntu / Debian | pipewire-bin |
pulseaudio-utils |
| Arch | pipewire |
libpulse |
| openSUSE | pipewire-tools |
pulseaudio-utils |
Use
vinospeak "Hello from vinoSpeak." # play it
vinospeak "Hello." --output hello.wav # save a WAV
vinospeak --file notes.md # read a file aloud
vinospeak --file notes.md --print-text # see what it would say, no model load
some-command | vinospeak --file - # plain text from stdin
vinospeak --file 2026-10-27-140512.vwsession # a vinoWhisper summary
vinospeak --file 2026-10-27-140512.vwsession --part transcript
vinospeak "Hola." --voice ef_dora --language es --speed 1.2 --device CPU
| Option | What it does |
|---|---|
--voice, --language, --speed |
Kokoro voice (default af_heart), language, 0.5 to 2.0 |
--device |
NPU (default), GPU or CPU |
--audio-device |
A sink from pactl list short sinks, or an ALSA device |
--kind |
Read --file as plain, markdown or document (one paragraph or cell a line, as vinoSearch extracts) |
--model-dir |
Use your own model directory, unchecked |
In markdown, headings, list items and table rows become sentences, links keep
their text, URLs are said as their host and code blocks are skipped.
Abbreviations like e.g. and Dr. don't end a sentence. vinospeak --help
lists everything.
The model is fetched from Hugging Face at one pinned commit and every file is
checked against its sha256 (see SECURITY.md). It lives in
~/.cache/vinospeak/, along with OpenVINO's compiled-model cache so later runs
skip the NPU compile.
Check this machine
vinospeak-doctor # --json for a bug report
Shows the OpenVINO packages and devices, the audio player it picked, and
whether the cached model still matches its pins. With
ovfetch on your PATH it also checks
your OpenVINO version against your NPU driver. If your distro's driver has no
NPU compiler (Fedora's intel-npu-driver 1.32.0), ovfetch npu install
fetches Intel's into your home directory and vinoSpeak loads it from there.
Python
from vino_speak import Synthesizer
synth = Synthesizer("NPU") # compiles once; reuse it
audio = synth.synthesize("Hello.") # audio.samples (float32), audio.sample_rate
speech = synth.speak("A long passage.") # plays in the background
speech.stop() # or speech.wait()
Development
See CONTRIBUTING.md. uv run poe check runs everything CI
does; none of it needs OpenVINO or an NPU.
Metadata
Release files for vinospeak 0.4.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 | Provenance | Actions |
|---|---|---|---|---|
| vinospeak-0.4.0.tar.gz | 54.3 kB | Without provenance | Details for vinospeak-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| vinospeak-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for vinospeak-0.4.0-py3-none-any.whl |
Total release size: 88.8 kB
Release files / vinospeak-0.4.0.tar.gz
| Download URL | vinospeak-0.4.0.tar.gz |
|---|---|
| Size | 54.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5b57403fa04900d2a9915216f41c2d9afec83168e7de343acf2c018627e7592a
|
|
BLAKE2b-256 checksum How to use checksums |
2f62e0845ca6af2beea09d780ef227f39dba21872c1f00e3ddf5b2f56ac0e46b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / vinospeak-0.4.0-py3-none-any.whl
| Download URL | vinospeak-0.4.0-py3-none-any.whl |
|---|---|
| Size | 34.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e0e1a843d1e957ced635632e5be33fe05c3f3ca1f3b5a52777203589d1f2af10
|
|
BLAKE2b-256 checksum How to use checksums |
75b66060ce1257c7a6ecbdb3f1db79abb6b9894a96b6f53312afe6bd73d9699e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.6 {"installer":{"name":"uv","version":"0.13.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for vinospeak 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.