Home/Text tools/Text to speech

Text tool

Text to Speech

Reads any text aloud using the voices already installed on your device, through the browser's built-in Web Speech API. Nothing is uploaded — the audio is generated locally by your browser or operating system.

Not speaking.

Playback

Idle

Why the voice list can be empty when the page loads

The Web Speech API's speechSynthesis.getVoices() is unreliable on first call. On many browsers — Chrome especially — the voice list is loaded asynchronously in the background and getVoices() returns an empty array until it finishes, sometimes tens of milliseconds later, sometimes not before the user has already clicked into the page. The only reliable fix is to also listen for the voiceschanged event and rebuild the dropdown whenever it fires, because there is no guarantee it fires only once, or that it fires at all on every platform.

This tool calls getVoices() immediately on load, then again every time speechSynthesis.onvoiceschanged fires, and again on a short one-off timeout as a last-resort fallback for browsers that never fire the event. If no voice has appeared after that, the dropdown says so plainly instead of sitting there looking broken.

Why long text needs to be split into chunks

A single SpeechSynthesisUtterance is not guaranteed to speak an unlimited amount of text. Several browser and OS combinations silently cut playback short somewhere past a few hundred characters, particularly when the voice is a network-backed one rather than a voice installed on the device. There is no standard error for this — the utterance just stops.

To read long text in full, this tool splits the input on sentence boundaries (after ., !, ? or a blank line) into chunks capped at roughly 200 characters, then queues each chunk as its own utterance and calls speechSynthesis.speak() for the next one only once the previous one's onend fires. From a listener's point of view it sounds continuous; internally it is a queue of short utterances rather than one long one.

How this tool's chunking behaves on a sample paragraph
Input lengthWhat happens
Under ~200 characters, one sentenceSpoken as a single utterance
A few paragraphsSplit at sentence ends into multiple utterances, queued and spoken in order
One very long sentence with no punctuationForce-split at the character cap so no chunk can still overrun the limit

Where the voice actually runs

Speech synthesis is not always fully local. Some browsers ship voices that run entirely on-device — typically the operating system's own voices, such as the ones Windows, macOS or Android already have installed. Other browsers, Chrome included on some platforms, also offer voices labelled as remote or network voices, which send the text to a server to generate audio. Which voices are local and which are remote is decided by the browser and OS, not by this page, and the labelling in the dropdown is whatever name the browser itself supplies.

If you need a guarantee that text never leaves your device, prefer a voice whose name matches your OS's built-in voices rather than a "cloud" or "online" labelled one, and check your browser's own documentation — this page has no way to inspect what a given voice does internally.

Questions people ask

Why is the voice dropdown empty or stuck on "Loading voices"?

Most browsers load the list of available voices asynchronously, and the first call to the API can return nothing. This page listens for the browser's voiceschanged event and refills the dropdown when it fires. If it stays empty after a few seconds, that specific browser or device has not exposed a working set of voices — try a different browser.

Does this upload my text anywhere?

This page never sends your text to any server of its own. Whether the browser itself does depends on the voice you pick: on-device voices stay local, while some browsers also offer network-backed voices that do send text to a remote service to generate audio. See the section above for how to tell them apart.

Why does playback stop partway through a long paste?

Some browsers cut a single utterance short past a few hundred characters. This tool avoids that by splitting long text into shorter chunks at sentence boundaries and queuing them one after another, so the fix is already built in — if playback still stops early, the tab was likely backgrounded or the speech engine was interrupted by the OS.

Can I change the voice or rate mid-playback?

Changing rate or pitch takes effect on the next chunk that starts, not the one currently playing, since an utterance's settings are fixed once it starts speaking. Changing the voice while speaking stops playback, since most browsers cannot swap the active voice mid-utterance.

Why does nothing happen when I click Play?

Some browsers require a voice to be selected and loaded before speak() will do anything, and a few require the click that starts speech to be a direct user gesture rather than triggered indirectly. If the voice list never populated, see the first question above.

Need to clean up the text first?

Whitespace cleanup, case conversion and word counting sit right next door.

See all text tools →