offline-speech
Download once, bookmark this page, and turn text into speech with no internet. Your text and audio stay on this device.
Preparing step 1: download speech files.
1. Download speech files
Start here: press Download for offline use. This saves the model and voices to disk once; it does not load them into RAM.
Checking saved files…
2. Load the model
After the download finishes, press Load model. Wait for “Ready”, then go to step 3. Load it again whenever you reopen this page or unload RAM.
- Disk · saved offline files
- Checking…
- RAM · model and runtime
- Model unloaded
Storage details
Saved-file sizes exclude browser bookkeeping and temporary files.
3. Type text and hear speech
Choose a voice and press Speak. Speak prepares and plays the audio. Recent text-and-voice combinations replay instantly from the beginning without loading or running the model. Save WAV keeps the completed file. Progress is shown below while it is preparing.
Sentence breaks and progress
Current phonemes
Preparing offline storage…
Licenses and dependencies
Copyright © 2026 Dima Korolev <dmitry.korolev@gmail.com>.
offline-speech’s own code is licensed under GPL-3.0-or-later (GNU General Public License version 3 or later). Third-party components retain their respective licenses.
- Speech model: onnx-community/Kokoro-82M-v1.0-ONNX — Apache-2.0. Kokoro generates speech; the bundled model and six voice files use this license.
- Text-to-phoneme engine: espeak-ng/espeak-ng (eSpeak NG) — GPL-3.0-or-later. Its code and language data are embedded through phonemizer. The phonemizer JavaScript wrapper separately uses Apache-2.0.
Browser code, model and voice dependencies
| Component | Version / revision | License |
|---|---|---|
| PRN UI (adapted palette and button geometry) | 986d93b681cb49f28b8fcd3069e2b3a04dad1a3f | MIT |
| Kokoro-82M model and six voices | 1939ad2a8e416c0acfeecc08a694d14ef25f2231 | Apache-2.0 |
| kokoro-js | 1.2.1 | Apache-2.0 |
| @huggingface/transformers | 3.8.1 | Apache-2.0 |
| phonemizer JavaScript wrapper | 1.2.1 | Apache-2.0 |
| eSpeak NG code and language data | Embedded in phonemizer 1.2.1; engine revision not identified upstream | GPL-3.0-or-later |
| ONNX Runtime Web (JavaScript and WASM) | 1.22.0-dev.20250409-89f8206ba4 | MIT |
| onnxruntime-common (inside Transformers.js) | 1.21.0 | MIT |
| @huggingface/jinja (inside Transformers.js) | 0.5.3 | MIT |
Included voices: af_heart, af_bella, af_nicole, am_michael, am_fenrir, bf_emma. Browser bundles are fetched with pinned SHA-256 hashes. offline-speech changes packaging/imports, adds an explicit phoneme-progress callback, and manages hosted voice caching.
The full ONNX Runtime notices below include its upstream dependency inventory across runtime variants. They are a superset, not a claim that every listed native library ships in this browser build. The exact embedded eSpeak NG engine revision is not identified by the published phonemizer bundle.
Development and test dependencies (80 npm packages)
These tools are not shipped to app visitors. Node.js 20 or later supplies build utilities; puppeteer-core and its complete locked dependency graph support browser tests. Tests use a separately installed Chrome/Chromium browser under that distribution’s own licenses.
| Component | Version / revision | License |
|---|---|---|
| @puppeteer/browsers | 2.10.5 | Apache-2.0 |
| @tootallnate/quickjs-emscripten | 0.23.0 | MIT |
| @types/node | 26.6.6 | MIT |
| @types/yauzl | 2.10.3 | MIT |
| agent-base | 7.1.4 | MIT |
| ansi-regex | 5.0.1 | MIT |
| ansi-styles | 4.3.0 | MIT |
| ast-types | 0.13.4 | MIT |
| b4a | 1.9.0 | Apache-2.0 |
| bare-buffer | 3.7.1 | Apache-2.0 |
| bare-events | 2.9.2 | Apache-2.0 |
| bare-fs | 4.8.4 | Apache-2.0 |
| bare-path | 3.1.2 | Apache-2.0 |
| bare-stream | 2.13.4 | Apache-2.0 |
| bare-url | 2.5.6 | Apache-2.0 |
| basic-ftp | 5.3.1 | MIT |
| buffer-crc32 | 0.2.13 | MIT |
| chromium-bidi | 5.1.0 | Apache-2.0 |
| cliui | 8.0.1 | ISC |
| color-convert | 2.0.1 | MIT |
| color-name | 1.1.4 | MIT |
| data-uri-to-buffer | 6.0.2 | MIT |
| debug | 4.4.3 | MIT |
| degenerator | 5.0.1 | MIT |
| devtools-protocol | 0.0.1452169 | BSD-3-Clause |
| emoji-regex | 8.0.0 | MIT |
| end-of-stream | 1.4.5 | MIT |
| escalade | 3.2.0 | MIT |
| escodegen | 2.1.0 | BSD-2-Clause |
| esprima | 4.0.1 | BSD-2-Clause |
| estraverse | 5.3.0 | BSD-2-Clause |
| esutils | 2.0.3 | BSD-2-Clause |
| events-universal | 1.0.1 | Apache-2.0 |
| extract-zip | 2.0.1 | BSD-2-Clause |
| fast-fifo | 1.3.2 | MIT |
| fd-slicer | 1.1.0 | MIT |
| get-caller-file | 2.0.5 | ISC |
| get-stream | 5.2.0 | MIT |
| get-uri | 6.0.5 | MIT |
| http-proxy-agent | 7.0.2 | MIT |
| https-proxy-agent | 7.0.6 | MIT |
| ip-address | 10.7.6 | MIT |
| is-fullwidth-code-point | 3.0.0 | MIT |
| lru-cache | 7.18.3 | ISC |
| mitt | 3.0.1 | MIT |
| ms | 2.1.3 | MIT |
| netmask | 2.1.1 | MIT |
| once | 1.4.0 | ISC |
| pac-proxy-agent | 7.2.0 | MIT |
| pac-resolver | 7.0.1 | MIT |
| pend | 1.2.0 | MIT |
| progress | 2.0.3 | MIT |
| proxy-agent | 6.5.0 | MIT |
| proxy-from-env | 1.1.0 | MIT |
| pump | 3.0.4 | MIT |
| puppeteer-core | 24.10.0 | Apache-2.0 |
| require-directory | 2.1.1 | MIT |
| semver | 7.8.6 | ISC |
| smart-buffer | 4.2.0 | MIT |
| socks | 2.8.10 | MIT |
| socks-proxy-agent | 8.0.5 | MIT |
| source-map | 0.6.1 | BSD-3-Clause |
| streamx | 2.28.1 | MIT |
| string-width | 4.2.3 | MIT |
| strip-ansi | 6.0.1 | MIT |
| tar-fs | 3.1.3 | MIT |
| tar-stream | 3.2.2 | MIT |
| teex | 1.0.1 | MIT |
| text-decoder | 1.2.7 | Apache-2.0 |
| tslib | 2.9.1 | 0BSD |
| typed-query-selector | 2.12.3 | MIT |
| undici-types | 8.9.0 | MIT |
| wrap-ansi | 7.0.0 | MIT |
| wrappy | 1.0.2 | ISC |
| ws | 8.22.1 | MIT |
| y18n | 5.0.8 | ISC |
| yargs | 17.7.3 | MIT |
| yargs-parser | 21.1.1 | ISC |
| yauzl | 2.10.0 | MIT |
| zod | 3.25.76 | MIT |
Full offline-speech license · Full third-party notices and license texts. Both files are saved with the page for offline reading.
When redistributing this app, preserve notices and meet applicable GPL corresponding-source requirements. Source links identify upstream projects; notices alone do not supply corresponding source for a particular build. A separate HTML page does not by itself determine the license obligations of a containing site. GNU GPL guidance on separate and combined works.