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…

Offline files are stored in this browser profile. Browser settings or storage pressure can clear them.

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
The page still uses some memory. Loading speech typically needs about 1 GiB of RAM on a desktop; this is an estimate, not a device reading.
Unloading keeps your saved files for quick offline reuse. Deleting removes the downloaded model, voices and libraries and unloads RAM. Only the small page shell remains; offline speech will need another download.
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.

Save WAV

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.

Browser code, model and voice dependencies
ComponentVersion / revisionLicense
PRN UI (adapted palette and button geometry)986d93b681cb49f28b8fcd3069e2b3a04dad1a3fMIT
Kokoro-82M model and six voices1939ad2a8e416c0acfeecc08a694d14ef25f2231Apache-2.0
kokoro-js1.2.1Apache-2.0
@huggingface/transformers3.8.1Apache-2.0
phonemizer JavaScript wrapper1.2.1Apache-2.0
eSpeak NG code and language dataEmbedded in phonemizer 1.2.1; engine revision not identified upstreamGPL-3.0-or-later
ONNX Runtime Web (JavaScript and WASM)1.22.0-dev.20250409-89f8206ba4MIT
onnxruntime-common (inside Transformers.js)1.21.0MIT
@huggingface/jinja (inside Transformers.js)0.5.3MIT

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.

ComponentVersion / revisionLicense
@puppeteer/browsers2.10.5Apache-2.0
@tootallnate/quickjs-emscripten0.23.0MIT
@types/node26.6.6MIT
@types/yauzl2.10.3MIT
agent-base7.1.4MIT
ansi-regex5.0.1MIT
ansi-styles4.3.0MIT
ast-types0.13.4MIT
b4a1.9.0Apache-2.0
bare-buffer3.7.1Apache-2.0
bare-events2.9.2Apache-2.0
bare-fs4.8.4Apache-2.0
bare-path3.1.2Apache-2.0
bare-stream2.13.4Apache-2.0
bare-url2.5.6Apache-2.0
basic-ftp5.3.1MIT
buffer-crc320.2.13MIT
chromium-bidi5.1.0Apache-2.0
cliui8.0.1ISC
color-convert2.0.1MIT
color-name1.1.4MIT
data-uri-to-buffer6.0.2MIT
debug4.4.3MIT
degenerator5.0.1MIT
devtools-protocol0.0.1452169BSD-3-Clause
emoji-regex8.0.0MIT
end-of-stream1.4.5MIT
escalade3.2.0MIT
escodegen2.1.0BSD-2-Clause
esprima4.0.1BSD-2-Clause
estraverse5.3.0BSD-2-Clause
esutils2.0.3BSD-2-Clause
events-universal1.0.1Apache-2.0
extract-zip2.0.1BSD-2-Clause
fast-fifo1.3.2MIT
fd-slicer1.1.0MIT
get-caller-file2.0.5ISC
get-stream5.2.0MIT
get-uri6.0.5MIT
http-proxy-agent7.0.2MIT
https-proxy-agent7.0.6MIT
ip-address10.7.6MIT
is-fullwidth-code-point3.0.0MIT
lru-cache7.18.3ISC
mitt3.0.1MIT
ms2.1.3MIT
netmask2.1.1MIT
once1.4.0ISC
pac-proxy-agent7.2.0MIT
pac-resolver7.0.1MIT
pend1.2.0MIT
progress2.0.3MIT
proxy-agent6.5.0MIT
proxy-from-env1.1.0MIT
pump3.0.4MIT
puppeteer-core24.10.0Apache-2.0
require-directory2.1.1MIT
semver7.8.6ISC
smart-buffer4.2.0MIT
socks2.8.10MIT
socks-proxy-agent8.0.5MIT
source-map0.6.1BSD-3-Clause
streamx2.28.1MIT
string-width4.2.3MIT
strip-ansi6.0.1MIT
tar-fs3.1.3MIT
tar-stream3.2.2MIT
teex1.0.1MIT
text-decoder1.2.7Apache-2.0
tslib2.9.10BSD
typed-query-selector2.12.3MIT
undici-types8.9.0MIT
wrap-ansi7.0.0MIT
wrappy1.0.2ISC
ws8.22.1MIT
y18n5.0.8ISC
yargs17.7.3MIT
yargs-parser21.1.1ISC
yauzl2.10.0MIT
zod3.25.76MIT

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.