Every text-to-speech Chrome extension I tried had one of two problems. Either it sent my text to a server, or it used the browser's built-in voices that sound like a GPS from 2012.
I wanted TTS that stays on my machine and doesn't sound terrible. So I built one.
What it does
GlowReadTTS is a Chrome extension that reads text aloud using AI voices bundled directly in the extension package. No cloud, no accounts, no API keys, no network calls at all.
Two ways to use it:
Right-click mode: Select text on any webpage, right-click, choose "Read with GlowReadTTS." It reads the text aloud and highlights each sentence on the page as it goes. A floating stop button appears at the top-right of the page so you can halt playback without opening the popup.
Popup mode: Open the extension popup, paste or type text, hit play.
15 AI voices (American and British English), speed control from 0.25x to 2x, streaming playback so audio starts quickly.
How a 96MB model fits in a Chrome extension
The AI voice model is about 96MB and ships entirely inside the .crx package. After install, there are no runtime downloads and no network calls. You can turn off wifi and it still works.
The voices sound significantly better than built-in browser TTS. 15 voices are bundled covering American and British English.
Architecture
The whole thing is vanilla JavaScript. No React, no build step, no bundler. Manifest V3.
background/ → service worker, context menu, message routing
content/ → in-page sentence highlighting, floating stop button
offscreen/ → audio playback + TTS inference
popup/ → extension UI (voice picker, text input, controls)
options/ → settings (speed, voice, performance toggle)
libs/ → bundled AI voice model + inference code
The offscreen/ part is worth explaining. Chrome extensions can't play audio from a service worker, so an offscreen document handles the TTS inference and pipes audio out. This is a Manifest V3 pattern that trips people up if you haven't seen it before.
The performance toggle
Cold-starting a 96MB model takes a few seconds. To avoid that delay on the first right-click read of a session, GlowReadTTS can optionally pre-warm the model whenever you select text on a page. This is on by default.
If you'd rather keep idle RAM minimal, switch it off in Settings. The first read will be slower, but subsequent reads in the same session stay fast.
Privacy
This is the whole point of the project.
- Zero data collection. No analytics, no telemetry, no tracking.
- Text never leaves the device. 100% local processing.
- No accounts. No sign-up, no API keys.
- The extension doesn't even have permission to make network requests. If you're reading a article nothing gets sent anywhere.
Status
- License: Apache 2.0
- Source: github.com/lavellehatcherjr/GlowReadTTS
- Chrome Web Store: Submitted, pending review. I'll update this post with the install link once it's approved. If you find it useful, a ⭐ on the repo helps more than you'd think.
What's next
Additional language support is on my radar. The architecture is designed for it, so stay tuned.
Questions, feedback, or bugs? Open an issue.
Top comments (0)