{"slug": "spiel-chrome-extension-that-reads-articles-pdfs-aloud-with-local-tts", "title": "Spiel: Chrome extension that reads articles/PDFs aloud with local TTS", "summary": "Spiel, a free and open-source Chrome extension, reads articles and PDFs aloud using a local neural voice model on Macs with Apple Silicon, ensuring privacy by processing everything on-device without cloud connectivity or data collection.", "body_md": "**Listen to any article or PDF with a natural AI voice — free, private, and 100% local.**\n\nAn open-source alternative to Speechify* — without the $139/year, and without your reading history flowing through someone else's servers.\n\nRead-aloud tools are either expensive subscriptions or cloud services that see\neverything you read. Spiel is neither: the neural voice\n([Kokoro-82M](https://huggingface.co/hexgrad/Kokoro-82M)) runs **on your own Mac** at\n`127.0.0.1`\n\n. No account, no telemetry, no cloud. Turn off Wi-Fi and it still works.\n\nBuilt for students, researchers, and anyone who reads a lot and wants to pay nothing.\n\n▶️ **One click to listen**— open any article or PDF, press Play- 🖍\n**Word-by-word highlighting** that follows the voice, with auto-scroll - 📄\n**Reads PDFs**— research papers, web-hosted or local, extracted on-device with pdf.js - 👆\n**Click anywhere to listen from there**— click a paragraph, reading jumps to it - ✂️\n**Read your selection**— select text on any page for instant playback - 🎚\n**4 curated voices**(American/British, male/female) and speed up to 3× - ⏱\n**Time-remaining estimate** at your current speed - 🧹\n**Smart skipping**— URLs, [reference brackets], (parentheses) — your choice - 🌙\n**Dark mode** everywhere, matched to the page - 🔒\n**100% local**— text-to-speech happens at`127.0.0.1`\n\n; nothing ever leaves your machine\n\n**Requirements:** Mac with Apple Silicon (M1 or newer) · ~8 GB free disk · Chrome.\n*(Intel Macs and Windows/Linux: on the roadmap.)*\n\n** ⬇ Download the latest spiel-extension.zip**, unzip it, then:\n\n- Open\n`chrome://extensions`\n\n- Toggle\n**Developer mode** ON (top-right) - Click\n**Load unpacked** and pick the unzipped folder - Pin the 🎙 Spiel icon to your toolbar\n\nKeep the folder somewhere permanent (not Downloads) — Chrome loads the extension from that exact path.\n\n(A one-click Chrome Web Store install is coming.)\n\n**Or build from source**\n\n```\ngit clone https://github.com/preet01/spiel.git\ncd spiel && npm install && npm run build\n```\n\nThen Load unpacked → pick the `dist/`\n\nfolder.\n\nPaste this in the **Terminal** app and press Enter:\n\n```\ncurl -fsSL https://raw.githubusercontent.com/preet01/spiel/main/install.sh | bash\n```\n\nWait ~2 minutes. When your Mac says **\"Spiel is ready\"** out loud, you're done —\nopen any article and press Play in the Spiel popup.\n\n**What does that command install, exactly?**\n\nEverything goes under `~/.spiel`\n\n(plus one LaunchAgent). The script:\n\n- Checks your Mac (macOS, disk space)\n- Installs the\n[uv](https://github.com/astral-sh/uv)Python manager if missing - Downloads\n[Kokoro-FastAPI](https://github.com/remsky/Kokoro-FastAPI)(pinned commit, Apache-2.0) - Downloads the Kokoro voice model (~330 MB, Apache-2.0)\n- Creates a LaunchAgent so the engine auto-starts on boot, bound to\n`127.0.0.1`\n\nonly — unreachable from the network - Starts it and speaks a test sentence\n\nIt's ~300 lines of plain bash — [read it yourself](/preet01/spiel/blob/main/install.sh) before running, as you should with any `curl | bash`\n\n.\n\n```\n┌────────────────────────── Your Mac ──────────────────────────┐\n│                                                              │\n│  Chrome                            Kokoro voice engine       │\n│  ┌──────────────────┐   text   ┌───────────────────────┐     │\n│  │ Spiel extension  │ ───────▶ │ FastAPI + Kokoro-82M  │     │\n│  │ (UI, highlights) │ ◀─────── │ at 127.0.0.1:8880     │     │\n│  └──────────────────┘   audio  └───────────────────────┘     │\n│                                                              │\n└────────────── nothing crosses this line ─────────────────────┘\n```\n\nThe extension extracts the article ([Readability](https://github.com/mozilla/readability))\nor PDF ([pdf.js](https://mozilla.github.io/pdf.js/), on-device), sends it\nsentence-by-sentence to the local engine, and plays the audio with synchronized\nword highlighting driven by Kokoro's word timestamps.\n\n- No analytics, no telemetry, no accounts, no remote servers.\n- The voice engine listens on\n`127.0.0.1`\n\nonly — 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.\n\n| Problem | Fix |\n|---|---|\n| Popup says \"Voice not installed\" | Run the Step 2 command; the popup updates itself when the engine is up |\n| Installed but silent | Engine log: `~/Library/Logs/spiel-voice-engine.log` · installer log: `~/.spiel/install.log` |\n| Local PDF won't read | Enable Allow access to file URLs for Spiel at `chrome://extensions` |\n| Port 8880 already in use | Another app owns it — `lsof -iTCP:8880 -sTCP:LISTEN` to find it |\n| First play of the day is slow | The model warms up on first request (~5–15 s); Spiel keeps it warm afterwards |\n| Uninstall everything | `curl -fsSL https://raw.githubusercontent.com/preet01/spiel/main/uninstall.sh | bash` + remove the extension at `chrome://extensions` |\n\nIssues and PRs welcome — especially **Intel Mac / Windows / Linux ports**, new\nvoices, and Firefox support. The codebase is small and documented:\n\n| File | What it does |\n|---|---|\n`src/background.ts` |\nPlayback state machine, TTS fetches, prefetch cache |\n`src/content.ts` |\nArticle extraction, word highlighting, floating player |\n`src/offscreen.ts` |\nAudio playback (Web Audio, autoplay-exempt) |\n`src/pdf-content.ts` |\nOn-device PDF text extraction (pdf.js) |\n\nThe build has two quality gates: a strict TypeScript check and a dist-completeness\ncheck that fails if any runtime file is missing. Before contributing, read\n[ LESSONS.md](/preet01/spiel/blob/main/LESSONS.md) — every past bug, its root cause, and the pre-flight\nchecklist that keeps them from coming back.\n\n```\nnpm run build      # typecheck → bundle → icons → verify dist/ completeness\nnpm run package    # dist/ → spiel-extension.zip\n```\n\n-\n**True one-click:** run the voice inside Chrome via WebGPU (no Terminal step at all) - Chrome Web Store listing\n- In-PDF page highlighting (Spiel Reader view)\n- Windows & Linux installers\n- More voices and languages\n- Firefox support\n\n[MIT](/preet01/spiel/blob/main/LICENSE) © Harpreet Vishnoi. Built on excellent open-source work — see [THIRD_PARTY.md](/preet01/spiel/blob/main/docs/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).\n\n* *Spiel is not affiliated with, endorsed by, or connected to Speechify Inc. in any way.*", "url": "https://wpnews.pro/news/spiel-chrome-extension-that-reads-articles-pdfs-aloud-with-local-tts", "canonical_source": "https://github.com/preet01/spiel", "published_at": "2026-07-10 21:54:46+00:00", "updated_at": "2026-07-10 22:05:17.735934+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-tools", "natural-language-processing"], "entities": ["Spiel", "Kokoro-82M", "Chrome", "Apple Silicon", "Speechify", "Mozilla Readability", "pdf.js"], "alternates": {"html": "https://wpnews.pro/news/spiel-chrome-extension-that-reads-articles-pdfs-aloud-with-local-tts", "markdown": "https://wpnews.pro/news/spiel-chrome-extension-that-reads-articles-pdfs-aloud-with-local-tts.md", "text": "https://wpnews.pro/news/spiel-chrome-extension-that-reads-articles-pdfs-aloud-with-local-tts.txt", "jsonld": "https://wpnews.pro/news/spiel-chrome-extension-that-reads-articles-pdfs-aloud-with-local-tts.jsonld"}}