Sawt
صوت (sawt): Arabic for "voice" or "sound".
Listen to any web page, or turn a whole book into an audiobook, with a natural voice that runs on your own computer.
Free, private, offline. No account, no subscription, no usage limits, and nothing you read is ever sent to a server: the voice model (Kokoro, 82M parameters) runs locally on your CPU.
- Read any article aloud from the browser: one click or
Alt+R. Menus, ads and sidebars are skipped, the sentence being spoken is highlighted, and every page resumes where you left off. - Meanings of hard words as you listen. When a sentence holds a word like "myopic", a small card beside the article explains it, from an offline dictionary or from the article itself ("maximum allowable operating pressure (MAOP)"). Reading never pauses.
- Follow along word by word, optionally: the word being spoken can be gently magnified.
- Convert books (EPUB, PDF, TXT) into
.m4baudiobooks with chapter markers, mastered to audiobook loudness standards. - 28 English voices, American and British, with adjustable speed.
Status: v0.2, early. It works well for the author daily; expect rough edges. Bug reports and contributions are very welcome. See CONTRIBUTING.md.
How it works
Browser extension Your computer
┌───────────────────────┐ article text ┌──────────────────────────────┐
│ finds the article │ ───────────────▶ │ sawt serve │
│ plays + highlights │ ◀─────────────── │ Kokoro voice model (CPU) │
└───────────────────────┘ sentence audio └──────────────────────────────┘
only over 127.0.0.1 - never the internet
The extension can't run a voice model by itself, so it talks to a small engine you run locally. The engine keeps the model loaded, synthesizes a few sentences ahead of playback, and caches the audio, so re-opening an article plays instantly.
Install
1. Install the engine. You need uv, the Python installer
(skip this if uv --version already works):
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
Then:
uv tool install sawt
sawt agent install # downloads the voice model once (~350MB), then runs in the background
From then on the engine starts by itself when you log in and restarts if it stops, so there
is no window to keep open. sawt agent status checks on it and sawt agent uninstall removes
it. To run it only when you want, use sawt serve and keep that terminal open instead.
After uv tool upgrade sawt, run sawt agent install again to restart on the new version.
2. Add the browser extension from the Chrome Web Store. Its setup page checks that the engine is running.
3. Open any article and press Alt+R.
Usage
Reading web pages
| Do this | To |
|---|---|
Toolbar icon → Read this page, or Alt+R |
Read the article |
Alt+R again |
Pause / resume |
| Right-click selected text → Read selection aloud | Hear just that, when the page's article detection picks the wrong block |
| Popup → voice / speed | Change it mid-article; reading continues from the current sentence |
More: docs/extension.md (highlighting, resume, limits).
Converting books
Needs FFmpeg on your PATH.
sawt extract ~/Downloads/mybook.epub # -> chapters
sawt inspect # check what extraction produced
sawt synth # synthesize (hours for a novel; resumable)
sawt build # -> ~/Sawt/out/<book>.m4b
Or several at once, unattended: sawt batch books/*.epub --voice af_bella --speed 0.85.
The full guide (voices, pronunciation fixes, trimming front matter, quality checks):
docs/books.md.
Run sawt with no arguments for every command.
Configuration
| Setting | Default | What it does |
|---|---|---|
SAWT_HOME |
~/Sawt |
Where books, output, the audio cache and pronounce.json live |
SAWT_MODELS |
~/.cache/sawt/models |
Where the voice model and the glossary are stored |
SAWT_GLOSSARY |
(downloaded) | Use this glossary file instead, e.g. one built with scripts/build_glossary.py |
SAWT_EXTENSION_IDS |
the published extension | Extra extension IDs the engine accepts (comma-separated), e.g. a fork with its own ID |
sawt serve --port |
7865 |
Port the engine listens on (the extension expects 7865) |
pronounce.json |
— | Whole-word pronunciation fixes, e.g. {"Gregor": "Gregg or"} |
Platform support
| Engine | Start at login | Extension | |
|---|---|---|---|
| macOS | ✅ | ✅ sawt agent install (launchd) |
✅ Chrome; other Chromium browsers should work |
| Linux | ✅ | ⚠️ sawt agent install (systemd user service), new and lightly tested |
✅ Chrome / Chromium |
| Windows | ⚠️ expected to work, untested | ⚠️ sawt agent install (Task Scheduler), new and untested |
✅ Chrome |
English only for now. Firefox and Safari are not supported yet.
Privacy and security
- The extension reads a page only when you ask, and sends its text only to
127.0.0.1. - The engine makes network requests only to download two files once, on first start: the voice model and the word glossary, both from GitHub and both verified against pinned SHA-256 hashes.
- The engine refuses requests from web pages and from other extensions. Details in SECURITY.md; the full policy is in PRIVACY.md.
Troubleshooting
| Problem | Fix |
|---|---|
| Popup says the engine isn't running | sawt agent status, then sawt agent install to (re)start it. The log is ~/Sawt/work/serve.log. Check it answers: curl -H "X-Sawt: 1" http://127.0.0.1:7865/health |
sawt: command not found after install |
Open a new terminal, or run uv tool update-shell |
| Nothing is read on a page | Scroll first if the page loads text lazily, or select the text and right-click → Read selection aloud |
| A name is mispronounced | Add it to pronounce.json in SAWT_HOME with a phonetic spelling |
build fails |
Install FFmpeg (brew install ffmpeg, apt install ffmpeg, or winget install ffmpeg) |
Roadmap
- A desktop app that bundles the engine, so no terminal is needed
- Firefox support
- More languages (Kokoro has voices for Spanish, French, Hindi, Italian, Japanese, Portuguese and Chinese)
Ideas and votes welcome in issues.
Contributing
Pull requests are welcome, from typo fixes to new features. Start with CONTRIBUTING.md (setup takes a couple of minutes) and docs/architecture.md for a map of the code. Issues marked good first issue are a gentle way in.
Credits
- Kokoro by hexgrad, the voice model (Apache-2.0)
- kokoro-onnx, which runs it on the CPU (MIT)
- Readability by Mozilla, which finds the article on a page (Apache-2.0)
- Word meanings come from Wiktionary (CC BY-SA 4.0), via the Kaikki.org extraction; word frequencies from wordfreq
- Pronunciation falls back to espeak-ng (GPL-3.0), installed as a dependency of kokoro-onnx
Convert books you own, public-domain texts and your own writing. Distributing a synthesized copy of an in-copyright book is not allowed.
Licence
Metadata
Release files for sawt 0.2.1
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 |
|---|---|---|---|---|
| sawt-0.2.1.tar.gz | 177.0 kB | With provenance | Details for sawt-0.2.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| sawt-0.2.1-py3-none-any.whl | Python 3 | none | any | Details for sawt-0.2.1-py3-none-any.whl |
Total release size: 232.2 kB
Release files / sawt-0.2.1.tar.gz
| Download URL | sawt-0.2.1.tar.gz |
|---|---|
| Size | 177.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8044e6699c1fc9bc1bb8533add061f71531bbfe993b8420bacb7ba0b921f3991
|
|
BLAKE2b-256 checksum How to use checksums |
cde531604d208c456bbb2db691cdc2694a8125e239872394e7f986c14800ee3a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.
Transparency logRelease files / sawt-0.2.1-py3-none-any.whl
| Download URL | sawt-0.2.1-py3-none-any.whl |
|---|---|
| Size | 55.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9cc8a55eca1b09d9766ca08707bdd1eeb5b8ee1673456916f91c93d5ee538bf9
|
|
BLAKE2b-256 checksum How to use checksums |
5973259cf69fb8180b77b9ce389ad86fa8cb237a8b7198ef3a0181c410b84e39
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.
Transparency logSecurity for sawt 0.2.1
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.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for sawt-0.2.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.
Transparency logA 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.