Text to Speech
Type or paste text and have your browser read it aloud, choose the voice, rate, and pitch.
About the Text to Speech Tool
Reading your text aloud happens through the browser's built-in Web Speech API, so no audio gets uploaded or generated on a server. The available voices depend entirely on your browser and operating system, meaning the list looks different from device to device, and a few older browsers don't support speech synthesis at all (this page detects that and lets you know).
Why the voice list sometimes needs a moment to populate
Calling speechSynthesis.getVoices() the instant the page loads can return an empty array in some browsers, particularly Chrome, because the actual list of installed voices is loaded asynchronously in the background rather than being available immediately. To handle that, this page calls populateVoices() once right away, and separately listens for the voiceschanged event, which fires once the browser has actually finished loading its voice list, and re-populates the dropdown at that point. The check for whether synth.onvoiceschanged even exists before attaching that listener is feature detection for older browser implementations that support speech synthesis but never fire that particular event, so the fallback simply relies on whatever getVoices() already returned on the first call in that case.
Rate and Pitch ranges are narrowed from what the spec technically allows
The Web Speech API's SpeechSynthesisUtterance.rate property technically accepts values from 0.1 up to 10, but this tool's slider is capped to a 0.5–2.0 range, since speech well outside that window tends to become either unintelligibly slow or an unintelligible blur rather than usefully faster or slower. Pitch, by contrast, uses the full spec-defined range of 0 to 2, with 1 representing a voice's normal, unmodified pitch in both cases — a value of 1 for rate similarly means normal speaking speed, with values below that slowing speech down and values above speeding it up.
Clicking Speak again restarts immediately instead of queuing
Every click of the Speak button calls synth.cancel() before creating and starting a new utterance. Without that call, editing your text and clicking Speak again while a previous reading was still in progress would queue the new utterance to play after the current one finishes, rather than replacing it — cancelling first means the newest click always takes over immediately, which matches what most people expect when they hit a "speak" button a second time.
A synthesis error looks identical to normal completion in the status indicator
The utterance's onend and onerror callbacks both call the same function to reset the status display back to "Idle," so if speech synthesis fails partway through for some reason — an unavailable voice, an interruption from another app claiming audio, or an engine-level error — the interface doesn't distinguish that from a normal, successful finish. You'll see the status simply return to idle either way, without a specific error message telling you something went wrong.
Why the available voices differ so much from one device to another
The Web Speech API doesn't ship its own voices — it's a thin wrapper around whatever text-to-speech engine is already built into the operating system or browser you're using. That's why a Mac tends to offer a different voice lineup than a Windows PC, why mobile Chrome and desktop Chrome can list different voices even though it's the same browser, and why installing additional system-level voices (something some operating systems support) can make new options appear in this dropdown without the tool itself changing at all. There's no way to add a voice from within the page; the list here is a direct reflection of what your device already has installed.
Practical uses beyond accessibility
Beyond the obvious use for anyone who benefits from having text read aloud, hearing a piece of writing spoken rather than reading it silently is a well-known editing technique — awkward phrasing, run-on sentences, and repeated words tend to jump out audibly in a way they can slide past on a silent read-through. It's also a quick way to proofread a script, check how a name or product is likely to be pronounced by a voice assistant, or preview how a block of text sounds before recording narration around it.
Frequently Asked Questions
Why is the Voice dropdown empty or short when the page first loads?
Some browsers, notably Chrome, load the list of available voices asynchronously in the background rather than having it ready instantly. This page listens for the browser's voiceschanged event and refreshes the dropdown once the full voice list actually becomes available, which can take a brief moment after the page loads.
What do the Rate and Pitch values actually mean?
A value of 1 represents normal speed or normal pitch in both cases. Rate values below 1 slow speech down and values above speed it up; the slider is capped between 0.5 and 2.0 rather than the full range the API technically supports, since more extreme values tend to become unintelligible.
What happens if I click Speak again while it's already reading?
The current speech is cancelled and playback restarts immediately with whatever text is in the box at that moment, rather than queuing the new request to play after the current one finishes.
Will I see an error message if speech synthesis fails?
Not a specific one. The status indicator returns to "Idle" the same way whether the speech finished normally or failed partway through, so a synthesis error isn't visually distinguished from a successful completion.
Is my text sent to a server to generate the audio?
No. Speech is generated entirely by your browser and operating system's built-in text-to-speech engine using the Web Speech API; your text is never uploaded anywhere.