NSSpeechSynthesizer 在 macOS 上获取 Siri 的声音

NSSpeechSynthesizer get Siri voices on macOS

有没有办法获得 NSSpeechSynthesizer 的 Siri 声音? NSSpeechSynthesizer.availableVoices() 没有列出它们,但也许有未记录的技巧或其他东西?

我也尝试过使用 AVSpeech​Synthesizer,即使它应该在 macOS 10.14+ 上可用,我也无法大声朗读……

我使用了 Playground 来测试这个,代码来自 NSHipster:

import Cocoa
import AVFoundation

let string = "Hello, World!"
let utterance = AVSpeechUtterance(string: string)

let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)

Siri 语音

我不知道有什么技巧可以让 Siri 语音可用,恐怕无法通过 public API.

让它工作
  • NSSpeechSynthesizerAVSpeechSynthesizer 都利用了 SpeechSynthesis.framework(包含在 ApplicationServices.framework 中)。
  • 快速检查它,函数 BuildDefaultVoiceList(bool) 检查包标识符(通过 PermitAllVoices 将其与 com.apple.VoiceOverUtilitycom.apple.VoiceOvercom.apple.VoiceOverUtilityCacheBuilder 进行比较)。
  • 可能还有其他检查。

所有语音都存储在/System/Library/Speech/Voices文件夹中。试图复制语音,更改 Info.plist 值使其看起来像另一个语音,但仍然不是 available/working。

你想走多远?您想禁用 SIP、修改框架、预加载您的东西……值得吗?

AVSpeech​Synthesizer macOS

它可以工作,但它有问题,您必须不时终止该服务。

可用语音列表

AVSpeechSynthesisVoice.speechVoices().forEach { voice in
    print("Name: \(voice.name) Language: \(voice.language) Identifier: \(voice.identifier)")
}

let utterance = AVSpeechUtterance(string: "Ahoj, jak se máš?")
utterance.voice = AVSpeechSynthesisVoice(identifier: "com.apple.speech.synthesis.voice.zuzana.premium")

let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)

不说话?

当您调用 speak(utterance) 时会调用以下所有方法(委托),并且它会正常工作:

如果你只得到 speechSynthesizer(_:didCancel:) 方法调用,你必须终止 speechsynthesisd 进程,那就有问题了:

kill `pgrep speechsynthesisd`

然后再试一次,它为我解决了问题。

额外的语音安装

  • 系统偏好设置 - 辅助功能 - 语音
  • 系统语音 - 单击并向下滚动 & select 自定义...
  • Select 要安装的附加语音