TTS
Free text to speech for Mac with the voices of macOS, Siri’s included. A pasted text or a dropped file is read aloud or saved as MP3, offline; numbers, dates and units are read right in Russian and Ukrainian.
- Download for MacDMG · 1.7 MB
brew install geragarazagh/tap/ tts - GitHubsource code
Apple silicon, macOS 13 or later. Interface in English, Ukrainian and Russian.
For advanced users and language models
TTS speaks with Apple’s own voices. Speech starts in about half a second and is made on the Mac itself, so the app works without internet and sends nothing anywhere. Checked while Siri spoke a long text: Apple’s speech processes opened no network connection. The only network use of the app is its daily check for updates.
The voice button opens the voices of the text’s language, named as in System Settings: Siri’s Voice 1, Voice 2 and so on, otherwise the best voice of macOS (Ukrainian: Lesya). A click on a name chooses it; the waveform button next to it plays a sample spoken on the spot at the chosen speed. Siri voices not downloaded yet: Download Siri Voices… opens the right page of System Settings. Speed from 0.6× to 3.5×, spoken by the voice itself and heard at once; Save MP3 writes the whole text in the same voice and speed. The sentence being read is highlighted and followed; Command-Plus and Command-Minus change the text size. Space plays and pauses, the arrows jump 15 seconds.
How it works
- Voices: macOS lists Siri’s voices only to programs Apple signed. The app has
osascript, a part of every Mac, run its scripttts(JavaScript for Automation), which speaks with AVSpeechSynthesizer and so gets every voice the Mac has. Siri’s voices checked this way on macOS 27; the app itself on 13, 14 and 26 with the voices those Macs had. Apple does not document this way; if an update closes it, the app speaks with the other voices of macOS. - Text step for Russian and Ukrainian: numbers become words in the case the sentence needs (preposition before, noun after: с 18 ГБ, до 12:00, з 08:00), with dates, times, years, Roman centuries, decimals, fractions, ranges, currencies, percent, degrees and units; abbreviations are expanded, “ИИ” in its case too. Markdown marks, emoji and links (read as their site) go. A Russian test text with 35 numbers was read right in full, a Ukrainian one with 16 too; without this step Siri read 31 of the 35.
- Each paragraph gets its language. Russian, Ukrainian, Bulgarian and Kazakh by their letters and common words; a Cyrillic line with nothing to tell them apart (a heading, a title, a name) takes the language of the text around it, and a text of such lines alone takes the first of these languages in the Mac’s list of languages. A Russian paragraph with English words stays in one voice. Other languages by Apple’s language recognizer; a line in Latin letters whose language the recognizer is unsure of (names, models, numbers) is read in English. For a language without a chosen voice the best voice of the same kind is taken, and of several Siri voices the one with the lowest number.
- Sentences are spoken one by one by two helper processes (all performance cores when saving), each into a file that grows while the voice speaks, so a sentence plays while it is still being made and the highlight is exact. Pauses are Siri’s own: 0.32 s between sentences at 1×, shorter at higher speed, twice that between paragraphs.
- Voice samples are spoken on the Mac when the button is pressed: the app carries no recordings of Apple’s voices. In Russian the voices read Woland from Bulgakov’s “The Master and Margarita”, in Ukrainian the start of Kotliarevsky’s “Eneida”, in English Shakespeare’s seven ages of man; in other languages the start of the text.
- While listening, the sound lives as 16-bit samples in a temporary file that has no name on disk (deleted the moment it is opened), so nothing is left behind.
- MP3: LAME 4.0 (LGPL), mono, 48 kHz, VBR quality 2, about 48 MB an hour, with the LAME tag so players show the exact length; its comment says the speech is synthetic.
- The script is also a command line tool:
/Applications/TTS.app/Contents/Resources/tts -h(a text file to MP3, M4A, WAV or AIFF, voice, speed,-tprints the text as it will be read,-Llists the voices).
Apple’s voices are part of macOS, and its licence allows the speech they make for personal, non-commercial use.
Questions
Does the text leave the Mac?
No. The voices speak on the Mac itself; the app goes online only to check for updates.
Does it work without internet?
Yes. Only downloading a Siri voice in System Settings needs it, once.
Which voices are there?
The voices of macOS: Siri’s in the languages Siri speaks, among them Russian (Voice 1 and Voice 2), English, German, French, Spanish, Italian, Portuguese, Dutch, Turkish, Arabic, Japanese, Korean and Chinese, and Apple’s other voices for some forty languages, Ukrainian (Lesya) among them. Voices can’t be added or cloned in the app.
Where do Siri voices come from?
From System Settings, free. Download Siri Voices… in the app’s voice list opens the page: on macOS 26 and later Accessibility, Read & Speak, then the ⓘ next to System voice and the language; on macOS 13 to 15 Accessibility, Spoken Content, System voice, Manage Voices….
Can it read the text selected in any app?
No: macOS does that itself, in System Settings, Accessibility, Read & Speak (Spoken Content before macOS 26), Speak selection.
What happened to the voices of 0.1 and 0.2?
They came from the downloaded Supertonic 3 model, which read numbers and long texts less reliably. Version 0.3 speaks with the voices of macOS and deletes that model, 401 MB, on its first launch.
Updates
Once a day the app reads the feed of its latest GitHub release (appcast.xml) through Sparkle. Nothing about the Mac is sent. When a newer version is out, a window shows it with Install Update, Remind Me Later and Skip This Version; nothing is downloaded before Install Update. Check for Updates in the app menu checks at once.
The feed and the disk image are signed with an EdDSA key, and Sparkle installs only an app that carries the same Developer ID signature.
Settings and removal
Settings (the voices chosen per language, the speed, the text size) and the time of the last update check are in the defaults of com.geragaraza.tts. Nothing else is kept: no text, no history, no saved window state.
To remove TTS: quit it, move TTS.app to the Trash and run defaults delete com.geragaraza.tts. Siri voices stay in macOS; System Settings removes them.
Installed with Homebrew, brew uninstall --zap tts quits it and removes the app and its settings.
Details
- Version: 0.5.
- Bundle ID:
com.geragaraza.tts. - Download:
TTS.dmg, 1.7 MB. - Requires: Apple silicon, macOS 13 or later.
- Permissions: none. Network: to check for updates.
- Signed with a Developer ID and notarized by Apple.
- Interface: English, Ukrainian, Russian, from the language of macOS.
- Code: Swift with AppKit, about 2,500 lines, the script
ttsin JavaScript for Automation, about 1,300 lines, LAME, and Sparkle for updates. - License: MIT.
English Українська Русский