NSSpeechSynthesizer 在 macOS 上获取 Siri 声音

ale*_*ner 10 macos avfoundation avspeechsynthesizer swift nsspeechsynthesizer

有没有办法获得 Siri 的声音NSSpeechSynthesizerNSSpeechSynthesizer.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)
Run Code Online (Sandbox Code Playgroud)

zrz*_*zka 5

Siri 语音

我不知道有什么技巧可以使 Siri 语音可用,恐怕不可能通过公共 API 使其工作。

  • 双方NSSpeechSynthesizerAVSpeechSynthesizer就利用SpeechSynthesis.framework(列入ApplicationServices.framework)。
  • 快速检查它,该函数BuildDefaultVoiceList(bool)检查包标识符(通过PermitAllVoices将其与com.apple.VoiceOverUtility, com.apple.VoiceOver,进行比较com.apple.VoiceOverUtilityCacheBuilder)。
  • 可能还有其他检查。

所有的声音都存储在/System/Library/Speech/Voices文件夹中。试图复制声音,更改Info.plist值以使其看起来像另一个声音,但仍然不可用/工作。

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

AVSpeech?Synthesizer 在 macOS 上

它有效,但它有问题,您必须不时终止该服务。

可用语音列表

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

说话

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)
Run Code Online (Sandbox Code Playgroud)

不说话?

调用时会调用以下所有方法(委托),speak(utterance)并且它按应有的方式工作:

如果您只获得speechSynthesizer(_:didCancel:)方法调用并且必须终止该speechsynthesisd进程,则会出现问题:

kill `pgrep speechsynthesisd`
Run Code Online (Sandbox Code Playgroud)

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

附加语音安装

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