Search code examples
macostext-to-speechmacos-catalinasirinsspeechsynthesizer

Make the `say` terminal utility and NSSpeechSynthesizer work with Siri voices


  • The say command-line utility seems to be unaware of Siri voices as of macOS 11 (Big Sur):

    • say -v '?' doesn't list Siri voices.

    • Targeting a Siri voice explicitly doesn't work:

      • say -v NoraSiri hi! doesn't find the Nora Siri voice (which is the default Siri voice).

      • Update: As ccpizza's answer points out, if a Siri voice happens to be the system voice (i.e. the default voice), say can use it, implicitly, namely without -v, starting with macOS Ventura ; the answer also has updated-for-Ventura instructions for how to change the system voice interactively.

    • Using a bundle ID (e.g., com.apple.speech.synthesis.voice.custom.siri.nora.premium)[1] doesn't complain about an unknown voice, but speech output fails with Open speech channel failed: -86:

      • say -v com.apple.speech.synthesis.voice.custom.siri.nora.premium hi!

      • Seemingly, any string with prefix com.apple.speech.synthesis.voice.custom triggers this error.

  • Similarly, NSSpeechSynthesizer doesn't list Siri voices as available and doesn't support selecting one for speech output.

macOS Big Sur itself is capable of using a Siri voice for TTS, as evidenced by the fact that you can select one as the system voice in System Preferences > Accessibility > Speech, e.g. in combination with the shortcut-key-based Speak selected text when the key is pressed feature.
(Curiously, though, a Siri voice selected as the system voice does not take effect if you right-click text and select Speech > Start Speaking from the context menu and possibly also not for other accessibility features - this discrepancy is the subject of this MacRumors forum thread.)

Unfortunately, it appears that this functionality isn't exposed through a utility or API.

  • Is there any way to use Siri voices with say or NSSpeechSynthesizer?

[1] The bundle IDs of the installed Siri voices can be determined as follows:

ls /System/Library/Speech/Voices/*.SpeechVoice/Contents/Info.plist | grep -i siri | xargs -n 1 /usr/libexec/PlistBuddy -c 'print CFBundleIdentifier'

Note: The above works for me as of macOS Big Sur, upgraded from an earlier version, with at least one Siri voice installed. Siu Ching Pong -Asuka Kenji- reports that on a freshly installed, non-upgraded Big Sur machine the System/Library/Speech/Voices directory is empty.

To find the bundle IDs of all available (downloadable) Siri voices:

/usr/libexec/PlistBuddy -c 'print DownloadableCustomVoices' /System/Library/PrivateFrameworks/SpeechObjects.framework/Resources/SpeechDataDefaults.plist | grep 'VoiceIdentifier' | sed -E 's/.+ = //'

Solution

  • In a WWDC20 talk, Apple says Siri voices are not available in AVSpeechSynthesizer.

    The talk is called "Create a seamless speech experience in your apps." Apparently this applies to Catalina as well.

    Here's the relevant slide:

    WWDC20 Slide

    I started a thread at macrumors regarding similar problems configuring the system voice to speak text.