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

3

37
  • 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/.+ = //'
Hadfield answered 9/4, 2020 at 13:33 Comment(7)
I am testing your command for listing bundle IDs. It does not work on my machine (macOS Big Sur Version 11.4). The directory /System/Library/Speech/Voices/ is empty. It seems that the files are moved to /System/Library/SpeechBase/Voices/. However, the files for Siri are not found there (grep does not match anything).Indoaryan
On my machine (macOS Big Sur Version 11.4), the voice identifiers for Siri could be found inside the file /System/Library/PrivateFrameworks/SpeechObjects.framework/Versions/A/Resources/SpeechDataDefaults.plist.Indoaryan
That is curious, @SiuChingPong-AsukaKenji-: For me, the original command still works, as of macOS Big Sur 11.5.1Hadfield
Perhaps it is because mine is a clean install of macOS Big Sur. When I installed Big Sur, I wiped out all the things on my Mac. The fact that your command still works on your machine may be due to upgrading from a previous version of macOS. Those files are carried from the old one. By the way, I am curious whether my locations work on your machine too. 😉Indoaryan
@SiuChingPong-AsukaKenji-: indeed, my machine is upgraded, but please note that your file - also present in earlier versions - is just a catalog of metadata about downloadable voices, whereas my command lists only the installed Siri voices. I've added a command to extract the bundle IDs of all downloadable Siri voices too. (As an aside: /System/Library/PrivateFrameworks/SpeechObjects.framework/Resources/SpeechDataDefaults.plist is the better path to use (/Versions/A removed).Hadfield
On my M1 MacBook Pro with Big Sur (never upgraded), the expected system voice are presents in /System/Library/Speech/Voices but "say -v" does not work as noted above. By "expected" I mean those available to me in the Accessibility Sys Pref pane (including AronSiri, Alison, Ava, NoraSiri, Samantha, and Tom).Kumamoto
Added for completeness: I can get high quality Tom or other on-Siri voices to work in Terminal when they are selected as "System Voice" in Accessibility.Kumamoto
K
14

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.

Kumamoto answered 1/7, 2020 at 15:48 Comment(2)
Thanks, Jonathan - that seems to be the answer as of macOS Catalina (10.15). However, it sounds like there is hope this may eventually be implemented in a future version, which would be macOS Big Sur (11.0) at the earliest.Hadfield
I wonder whether anyone has experience with Siri voices in macOS Monterey? As of macOS 11.6, Siri voices are still not available.Kumamoto
T
10

As stated in the original question, explicitly selecting a siri voice with say -v <some-siri-voice> does not work, yet what does seem to work (verified on Ventura, 13.0.1) is selecting a Siri voice as the system default under System settings... ⇾ AccessibilitySpoken ContentSystem voiceManage voices... ⇾ [select a downloaded siri voice] ⇾ click Ok, and then use e.g. say nobody expects the spanish inquisition (without -v).

❗️ This behaviour does not seem to be available on versions prior to Ventura, e.g. on Monterey (12.0.1) and earlier, say will not use a siri voice if it's set as system default.

Televise answered 28/4, 2023 at 13:38 Comment(3)
@mklement0: you are right, updated the config steps; the op implied that siri voices do not 'work' with say while in practice it does not work when selecting those voices explicitly with -v name yet it does work using the System voice workaround, which is of course not perfect.Televise
@mklement0: checked on a monterey system, and found that say won't use a siri voice if it's set as system default and falls back to a lower quality ootb voice; answer updatedTelevise
This works as of sonoma 14.5! Thank you! This is of course not perfect, you couldn't do this in a script or an app because you can't control that setting, but for my purposes (i want scripts to announce things like when they're done if i'm not looking, and i want it more natural sounding than Samantha) it's a great solution.Ingham
R
-7

Using the keyboard shortcut can activate the new Siri voice (noraSiri)

Rachellerachis answered 16/6, 2020 at 16:18 Comment(1)
Thanks, but that is already mentioned in the question (the paragraph that starts with "The OS itself ..."). What I'm looking for are programmatic ways of using Siri voices.Hadfield

© 2022 - 2024 — McMap. All rights reserved.