Turn highlighted text on any web page into natural speech with your own cloud TTS account: Amazon Polly, Azure Speech, Google Cloud TTS, OpenAI, or any OpenAI-compatible server, from one extension. Setup guides, pricing notes, and troubleshooting are on the website.
- Connect Amazon Polly, Azure Speech, Google Cloud TTS, OpenAI, and/or any OpenAI-compatible server with your own credentials; every voice appears in one searchable picker, tagged by provider
- Preview any voice before selecting it, and star your favorites
- Read aloud from the context menu, a keyboard shortcut (
Ctrl/Cmd+Shift+S), or the popup sandbox, with playback controls and live speed adjustment - Download any selection as an MP3 file (
Ctrl/Cmd+Shift+E) - Adjust speed, pitch, volume, and speaking style where the selected voice supports them
- Use the interface in English, Chinese (Simplified and Traditional), or Hindi
- Credentials stay in your browser (Chrome sync optional), and text is sent only to the provider you chose
One Chrome build goes to the Chrome Web Store; a separate Firefox build goes to addons.mozilla.org.
| Listing | Store | Who gets it |
|---|---|---|
| Cloud Speech (the Polly for Chrome listing, renamed in place) | Chrome Web Store | new installs; former Polly users received it as a normal update |
| Cloud Speech | addons.mozilla.org | the Firefox build |
- Stack: WXT, React 19, TypeScript (strict), Tailwind CSS v4, Bun workspaces.
apps/extensionis the extension;apps/webis the Astro website. The scripts below run from the repo root.
bun install # install dependencies
bun run dev # extension dev with HMR (opens Chrome) + website on localhost:5173
bun run dev:extension # the extension alone, with interactive WXT keys
bun run dev:web # the website alone
bun run build # check + all builds: chrome, firefox, web (browser builds also zip)
bun run build:chrome # Chrome build + store zip -> apps/extension/.output/chrome-mv3
bun run build:firefox # Firefox build + store zip -> apps/extension/.output/firefox-mv3
bun run build:web # website -> apps/web/dist
bun run check:size # size-limit budget on the built content script
bun run typecheck # tsc --noEmit (strict, both apps)
bun run check # biome lint + format (check:fix auto-fixes)
bun run test # vitest, both build targets (chrome + firefox)
bun run test:coverage # vitest with coverage thresholds
bun run lint:firefox # Mozilla's addons-linter on the Firefox build
bun run verify:zips # manifest smoke on the emitted store zips
bun run test:e2e # Playwright popup smoke against the built extension (one-time: bunx playwright install chromium)
bun run test:e2e:firefox # the same smoke in a stock Firefox through Selenium (needs a Firefox on PATH)- Chrome: load
apps/extension/.output/chrome-mv3/unpacked fromchrome://extensions(Developer mode). - Firefox:
bun run --cwd apps/extension dev:firefoxruns it in a temporary profile through web-ext. - Architecture rules and the provider contract: AGENTS.md.
Rebuilding the Firefox store package from source (AMO reviewers):
- Install Bun at the version in
.bun-version. bun install --frozen-lockfilebun run --cwd apps/extension build:firefox; the zip lands inapps/extension/.output/.
- PR titles are Conventional Commits; CI gates on the
all-greencheck. - Before opening a PR, run what
.github/workflows/checks.ymlruns, all from the block above. - Account-wide conventions: the contributing guide.
Report vulnerabilities privately through the repository's Security tab (Report a vulnerability), never in an issue; the security policy has the details. In scope:
- Every listing ships the same source at the same version, so a report against one applies to all.
- API credentials live in
chrome.storage(syncby default,localwhen the sync toggle is off). Anything that exfiltrates, logs, or leaks them is high severity. - Selected text goes only to the provider the user configured, straight from the browser, with no intermediary servers or analytics. Any other destination is a bug.
- The content script runs on all pages (
<all_urls>) for error toasts; selected text is read on demand throughscripting.executeScript. Injection or privilege escalation in either path is in scope.
- Bug reports and feature requests: GitHub Issues
- Website: vivswan.github.io/cloud-speech
- Individual and Small Organization License 1.1.0; see LICENSE for the terms and its summary table.
- Individuals may use it for any purpose they choose for themselves; organizations under 100 people and 10,000,000 USD yearly income may use it; anything beyond that needs the licensor's permission.
- Releases through v1.0.8 were published under the MIT License and remain available under it.