Listen to any article or PDF with a natural AI voice β free, private, and 100% local.
An open-source alternative to Speechify* β without the $139/year, and without your reading history flowing through someone else's servers.
Read-aloud tools are either expensive subscriptions or cloud services that see
everything you read. Spiel is neither: the neural voice
(Kokoro-82M) runs on your own Mac at
127.0.0.1
. No account, no telemetry, no cloud. Turn off Wi-Fi and it still works.
Built for students, researchers, and anyone who reads a lot and wants to pay nothing.
βΆοΈ One click to listenβ open any article or PDF, press Play- π
Word-by-word highlighting that follows the voice, with auto-scroll - π
Reads PDFsβ research papers, web-hosted or local, extracted on-device with pdf.js - π
Click anywhere to listen from thereβ click a paragraph, reading jumps to it - βοΈ
Read your selectionβ select text on any page for instant playback - π
4 curated voices(American/British, male/female) and speed up to 3Γ - β±
Time-remaining estimate at your current speed - π§Ή
Smart skippingβ URLs, [reference brackets], (parentheses) β your choice - π
Dark mode everywhere, matched to the page - π
100% localβ text-to-speech happens at127.0.0.1
; nothing ever leaves your machine
Requirements: Mac with Apple Silicon (M1 or newer) Β· ~8 GB free disk Β· Chrome. (Intel Macs and Windows/Linux: on the roadmap.)
** β¬ Download the latest spiel-extension.zip**, unzip it, then:
-
Open
chrome://extensions -
Toggle Developer mode ON (top-right) - Click Load unpacked and pick the unzipped folder - Pin the π Spiel icon to your toolbar
Keep the folder somewhere permanent (not Downloads) β Chrome loads the extension from that exact path.
(A one-click Chrome Web Store install is coming.)
Or build from source
git clone https://github.com/preet01/spiel.git
cd spiel && npm install && npm run build
Then Load unpacked β pick the dist/
folder.
Paste this in the Terminal app and press Enter:
curl -fsSL https://raw.githubusercontent.com/preet01/spiel/main/install.sh | bash
Wait ~2 minutes. When your Mac says "Spiel is ready" out loud, you're done β open any article and press Play in the Spiel popup.
What does that command install, exactly?
Everything goes under ~/.spiel
(plus one LaunchAgent). The script:
- Checks your Mac (macOS, disk space)
- Installs the uvPython manager if missing - Downloads Kokoro-FastAPI(pinned commit, Apache-2.0) - Downloads the Kokoro voice model (~330 MB, Apache-2.0)
- Creates a LaunchAgent so the engine auto-starts on boot, bound to
127.0.0.1
only β unreachable from the network - Starts it and speaks a test sentence
It's ~300 lines of plain bash β read it yourself before running, as you should with any curl | bash
.
βββββββββββββββββββββββββββ Your Mac βββββββββββββββββββββββββββ
β β
β Chrome Kokoro voice engine β
β ββββββββββββββββββββ text βββββββββββββββββββββββββ β
β β Spiel extension β ββββββββΆ β FastAPI + Kokoro-82M β β
β β (UI, highlights) β ββββββββ β at 127.0.0.1:8880 β β
β ββββββββββββββββββββ audio βββββββββββββββββββββββββ β
β β
βββββββββββββββ nothing crosses this line ββββββββββββββββββββββ
The extension extracts the article (Readability) or PDF (pdf.js, on-device), sends it sentence-by-sentence to the local engine, and plays the audio with synchronized word highlighting driven by Kokoro's word timestamps.
- No analytics, no telemetry, no accounts, no remote servers.
- The voice engine listens on
127.0.0.1
only β your own machine, not your network. - The only network traffic Spiel ever creates is the one-time download of the engine and model at install.
| Problem | Fix |
|---|---|
| Popup says "Voice not installed" | Run the Step 2 command; the popup updates itself when the engine is up |
| Installed but silent | Engine log: ~/Library/Logs/spiel-voice-engine.log Β· installer log: ~/.spiel/install.log |
| Local PDF won't read | Enable Allow access to file URLs for Spiel at chrome://extensions |
| Port 8880 already in use | Another app owns it β lsof -iTCP:8880 -sTCP:LISTEN to find it |
| First play of the day is slow | The model warms up on first request (~5β15 s); Spiel keeps it warm afterwards |
| Uninstall everything | `curl -fsSL https://raw.githubusercontent.com/preet01/spiel/main/uninstall.sh |
Issues and PRs welcome β especially Intel Mac / Windows / Linux ports, new voices, and Firefox support. The codebase is small and documented:
| File | What it does |
|---|---|
src/background.ts |
|
| Playback state machine, TTS fetches, prefetch cache | |
src/content.ts |
|
| Article extraction, word highlighting, floating player | |
src/offscreen.ts |
|
| Audio playback (Web Audio, autoplay-exempt) | |
src/pdf-content.ts |
|
| On-device PDF text extraction (pdf.js) |
The build has two quality gates: a strict TypeScript check and a dist-completeness check that fails if any runtime file is missing. Before contributing, read LESSONS.md β every past bug, its root cause, and the pre-flight checklist that keeps them from coming back.
npm run build # typecheck β bundle β icons β verify dist/ completeness
npm run package # dist/ β spiel-extension.zip
True one-click: run the voice inside Chrome via WebGPU (no Terminal step at all) - Chrome Web Store listing
- In-PDF page highlighting (Spiel Reader view)
- Windows & Linux installers
- More voices and languages
- Firefox support
MIT Β© Harpreet Vishnoi. Built on excellent open-source work β see THIRD_PARTY.md for full credits (Kokoro model & Kokoro-FastAPI, Apache-2.0; Mozilla Readability, Apache-2.0; pdf.js, Apache-2.0; and the CC BY voice datasets behind Kokoro).
- Spiel is not affiliated with, endorsed by, or connected to Speechify Inc. in any way.