使`say`终端实用程序和NSSpeechSynthesizer与Siri语音配合使用

36
  • 截至macOS 11(Big Sur),say命令行实用程序似乎不知道Siri语音:

    • say -v' ? '没有列出Siri语音。

    • 明确将目标设置为Siri语音无效:

      • say -v NoraSiri hi!无法找到Nora Siri语音(默认Siri语音)。

      • 更新:正如ccpizza的答案指出,如果Siri声音恰好是系统声音(即默认声音),say 可以使用它隐式地,也就是说,从macOS Ventura开始,不需要加上-v,该答案还提供了交互式更改系统声音的说明(已更新为Ventura版本)。

    • 使用捆绑标识符(例如,com.apple.speech.synthesis.voice.custom.siri.nora.premium)[1]不会抱怨未知的语音,但是语音输出失败,并出现打开语音通道失败:-86

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

      • 看起来,任何以前缀com.apple.speech.synthesis.voice.custom开头的字符串都会触发此错误。

  • 同样地,NSSpeechSynthesizer不列出可用的Siri语音,并且不支持选择语音输出的语音。

macOS Big Sur本身就能够使用Siri语音进行TTS,这一点可以从您可以在“系统偏好设置 > 辅助功能 > 语音”中选择一个作为系统语音的事实中看出,例如与基于快捷键的“按下键时朗读所选文本”功能相结合。
(有趣的是,如果您通过右键单击文本并从上下文菜单中选择“语音 > 开始朗读”,可能也不会对其他辅助功能产生影响,选择为系统语音的Siri语音不会生效 - 这种差异是this MacRumors论坛帖子的主题。)

不幸的是,似乎没有通过实用程序或API公开此功能。

  • 是否有任何方法可以使用Siri语音与sayNSSpeechSynthesizer

[1] 可以通过以下方式确定已安装的Siri语音的捆绑标识符:

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

注意:以上内容适用于我在macOS Big Sur上的使用,该系统是从早期版本升级而来,并且至少安装了一个Siri语音。Siu Ching Pong -Asuka Kenji-报告称,在全新安装的、未升级的Big Sur机器上,System/Library/Speech/Voices目录为空。

要查找所有可用(可下载)Siri语音的捆绑标识符:

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

我正在测试您的列出捆绑标识符命令。在我的机器上(macOS Big Sur Version 11.4)它无法工作。目录/System/Library/Speech/Voices/是空的。看起来文件已经移动到/System/Library/SpeechBase/Voices/。然而,Siri的文件在那里找不到(grep没有匹配项)。 - Siu Ching Pong -Asuka Kenji-
1
在我的机器上(macOS Big Sur Version 11.4),Siri的语音识别器可以在文件/System/Library/PrivateFrameworks/SpeechObjects.framework/Versions/A/Resources/SpeechDataDefaults.plist中找到。 - Siu Ching Pong -Asuka Kenji-
1
@SiuChingPong-AsukaKenji-:确实,我的机器已经升级了,但请注意,您的文件 - 在早期版本中也存在 - 只是有关可下载语音的元数据目录,而我的命令仅列出已安装的Siri语音。我添加了一个命令来提取所有可下载Siri语音的包ID。(顺便说一句:/System/Library/PrivateFrameworks/SpeechObjects.framework/Resources/SpeechDataDefaults.plist 是更好的路径(去除/Versions/A)。 - mklement0
1
在我的 M1 MacBook Pro 上,搭载的是 Big Sur 操作系统(从未升级过),预期应该会有语音包存在于 /System/Library/Speech/Voices 目录下,但是像上面所提到的那样,“say -v” 命令并不起作用。在这里所说的“预期”的语音包指的是无障碍系统偏好设置中可供使用的语音包,其中包括 AronSiri、Alison、Ava、NoraSiri、Samantha 和 Tom。 - Jonathan Dagle
2
为了完整起见:当在辅助功能中选择“系统语音”时,我可以让高质量的Tom或其他On-Siri语音在终端中工作。 - Jonathan Dagle
显示剩余2条评论
3个回答

12
在WWDC20的演讲中,苹果表示Siri语音不可用于AVSpeechSynthesizer。该演讲名为“在应用中创建无缝的语音体验”。显然,这也适用于Catalina。以下是相关幻灯片:

WWDC20 Slide

我在macrumors上发起了一个主题讨论, 相关问题是如何配置系统语音来朗读文本。


1
谢谢,乔纳森 - 在macOS Catalina(10.15)中似乎是这个答案。然而,听起来有希望在未来的版本中实现,最早可能是macOS Big Sur(11.0) - mklement0
我想知道是否有人在macOS Monterey中使用Siri语音的经验?截至macOS 11.6,Siri语音仍然不可用。 - Jonathan Dagle

6

如原问题所述,使用say -v <some-siri-voice>明确选择Siri语音是不起作用的,但似乎可以在Ventura(13.0.1)上将Siri语音选择为系统默认语音,方法是在系统偏好设置... ⇾ 辅助功能朗读内容系统语音管理语音... ⇾ [选择已下载的Siri语音] ⇾ 点击确定,然后使用例如say nobody expects the spanish inquisition不需要-v)。

❗️ 在Ventura之前的版本(例如Monterey(12.0.1)及更早版本),如果将Siri语音设置为系统默认语音,则say不会使用它。


@mklement0:你说得对,已经更新了配置步骤;虽然实际上在使用say命令时选择那些 Siri 语音时似乎不起作用,但是使用“系统语音”解决方法确实可以解决这个问题,当然这并不完美。 - ccpizza
1
@mklement0:在 Monterey 系统上进行了检查,发现如果将 say 设置为系统默认语音,则不会使用 Siri 语音,并会回退到低质量的 ootb 语音;已更新答案。 - ccpizza

-6

使用键盘快捷方式可以激活新的Siri语音(noraSiri)


4
谢谢,但这已经在问题中提到了(以“操作系统本身...”开头的段落)。我需要的是使用Siri语音的代码方法。 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接