可供 AVSpeechSynthesis 在 iOS 中使用的已安装语音的可用性

Ant*_*ton 6 voice text-to-speech ios siri avspeechsynthesizer

我希望能够测试哪些文本转语音可供我的 iOS 应用程序与 AVSpeechSynthesis 一起使用。生成已安装声音的列表很容易,但 Apple 将其中一些设置为禁止应用程序使用,我想知道哪些。

例如,考虑以下测试代码 (swift 5.1):

import AVFoundation

...

func voiceTest() {
    let speechSynthesizer = AVSpeechSynthesizer()
    let voices = AVSpeechSynthesisVoice.speechVoices()
    for voice in voices where voice.language == "en-US" {
        print("\(voice.language) - \(voice.name) - \(voice.quality.rawValue) [\(voice.identifier)]")
        let phrase = "The voice you're now listening to is the one called \(voice.name)."
        let utterance = AVSpeechUtterance(string: phrase)
        utterance.voice = voice
        speechSynthesizer.speak(utterance)
    }
}
Run Code Online (Sandbox Code Playgroud)

当我打电话时voiceTest(),控制台输出是这样的:

en-US - Nicky (Enhanced) - 2 [com.apple.ttsbundle.siri_female_en-US_premium]
en-US - Aaron - 1 [com.apple.ttsbundle.siri_male_en-US_compact]
en-US - Fred - 1 [com.apple.speech.synthesis.voice.Fred]
en-US - Nicky - 1 [com.apple.ttsbundle.siri_female_en-US_compact]
en-US - Samantha - 1 [com.apple.ttsbundle.Samantha-compact]
en-US - Alex - 2 [com.apple.speech.voice.Alex]
Run Code Online (Sandbox Code Playgroud)

一些声音以他们的实际声音说话,而其中一些则以默认声音说话。在我的情况下,Nicky (com.apple.ttsbundle.siri_female_en-US_premium) 和 Alex (com.apple.speech.voice.Alex) 都被列为高质量,但在选择时听起来像是低质量默认值 Samantha。

我知道 Apple 已经表示 Siri 声音不可用于第三方应用程序。当我通过“设置”在 iPhone 上手动加载 Samantha(高质量)时,它会出现在列表中,我可以使用它。也许亚历克斯只是高质量的男性 Siri 声音,即使 Aaron 根据其标识符 (com.apple.ttsbundle.siri_male_en-US_compact) 似乎是低质量的 Siri 声音?这就是为什么亚历克斯和尼基是仅有的两个不可用的原因?所以如果我让我的应用程序专门排除那些它会生成可用声音的真实列表?有一些清晰度会很好。

Val*_*hin 2

我一直在寻找一种方法来以编程方式使用 Siri 的好听声音,例如English Siri Male (United States),并且很快发现使用公共语音 API 是不可能的,即使可以在系统偏好设置中选择语音。

要回答您的问题,除了代码示例之外,至少还有两种其他方法可以查找可用的语音。

使用defaults命令

 defaults read com.apple.speech.voice.prefs > speech_prefs.txt
Run Code Online (Sandbox Code Playgroud)

要查找有关当前在系统偏好设置中选择的语音的信息,请SelectedVoiceName在 中查找speech_prefs.txt

例如,对于英语 Siri Male(美国),这将是SelectedVoiceName = "Aaron Siri";

现在,通过进一步搜索aaronin speech_prefs.txt,您将发现以下内容:

"VOICEID:com.apple.speech.synthesis.voice.custom.siri.aaron.premium_1" = {
    BundleIdentifier = "com.apple.speech.synthesis.voice.custom.siri.aaron.premium";
Run Code Online (Sandbox Code Playgroud)

我在初始化语音时尝试了这两个字符串,但收到错误消息,提示找不到语音。

寻找语音目录

似乎有三个位置

/System/Library/Speech/Voices
Run Code Online (Sandbox Code Playgroud)

,

/Library/Speech/Voices
Run Code Online (Sandbox Code Playgroud)

~/Library/Speech/Voices
Run Code Online (Sandbox Code Playgroud)

第三个似乎是自定义声音的位置。

每个声音都有自己的目录。

如果您比较Info.plist某些以编程方式可用和以编程方式不可用的语音的文件,您会发现两者具有不同的结构。例如,无法通过编程实现的语音缺少一些与 Speech API 相对应的属性,例如VoiceSupportedCharacters. 我认为这是因为有些声音是老一代的,有些是新的。

聚苯乙烯

与您的问题没有直接关系,但仅供参考:我仍在寻找以编程方式使用 Siri 语音的解决方案。一种想法是制作语音目录的副本并使用其Info.plist. 另一个想法是通过模拟绑定到Speak selected text when the key is pressed系统偏好设置/辅助功能/语音中的选项的按键,然后录制音频,自动化 MacOS UI 来触发文本到语音转换。

如果有人可以分享其他想法,我将不胜感激。