Get TTS with natural Voices on macOS without external Tools

You don't need fancy tool to get Text-to-Speech on macOS, even baked into Firefox

Get TTS with natural Voices on macOS without external Tools
17 Feb 2025
|
2 min read

People will happily sell you subscription for Text-to-Speech tools which would read articles aloud. What if I tell you, you've already paid for that if you have a Mac.

Next, I'll show the following:

  • How to download higher quality voices

  • Use the new voices within Firefox' Reader View

  • Read content from a text file aloud with a CLI tool

Siri Voices

You will be surprised about how many Siri and TTS voices are actually available on macOS which generally sound natural and are sufficient for Text-to-Speech.

I've found that 🇺🇸 Zoe (Premium) and 🇩🇪 Anna (Premium) sound the most natural.

Install new Voices

To download new Voices, you will need to head over to the macOS System Settings.

Go to Accessibility → Spoken Content.

Press the (Info) icon next to System voice.

Select you preferred language on the left and hit "Voice".

Now download the voices via the blue download Icon. I found to like 🇺🇸 Zoe (Premium) and 🇩🇪 Anna (Premium).

Firefox

Once you've downloaded new Voices via your System Settings, you can restart Firefox and see those voices being available in the Firefox Reader View!

New macOS TTS voices available in Firefox

If the TTS sounds weird to you, try reducing the speed.

CLI Tool

I've put together a Fish Shell script which just reads content from a specified text file and simultaneously shows the current transcription.

Once put inside your Fish functions folder, you can use the CLI tool by calling

tts <language> <input-file>
tts de article.txt

Script tts.fish

I'm using Fish as my shell but I'm sure you can convert it to bash by throwing it in a LLM.

function tts --argument-names lang text
    if test (count $argv) -eq 0
        echo "Usage: tts [en|de] <filename>"
        return 1
    end

    if test $argv[1] != "en" -a $argv[1] != "de"
        echo "First argument must be 'en' or 'de'"
        return 1
    end

    if not test -f $argv[2]
        echo "File does not exist: $argv[2]"
        return 1
    end

    set -l voice "Samantha"
    if test $argv[1] = "de"
        set voice "Anna (Premium)"
    else if test $argv[1] = "en"
        set voice "Zoe (Premium)"
    end

    # Check if voice exists
    if not say -v \? | string match -q "*$voice*"
        echo "Voice '$voice' not found on system"
        echo "Instructions: https://romanzipp.com/blog/get-tts-with-natural-voices-on-macos-without-external-tools"
        return 1
    end

    echo "Starting TTS in $argv[1] with voice $voice"

    say -v $voice -f $argv[2] --quality 127 --rate 180 -i
end

Comments

Read more...