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

标签 ios text-to-speech voice 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)
    }
}

当我调用 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]

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

我知道 Apple 曾表示 Siri 语音无法在第三方应用程序中使用。当我通过设置在我的 iPhone 上手动加载 Samantha(高质量)时,它会出现在列表中,我可以使用它。也许 Alex 只是高品质的男性 Siri 声音,尽管 Aaron 似乎是基于其标识符 (com.apple.ttsbundle.siri_male_en-US_compact) 的低品质 Siri 声音?这就是为什么 Alex 和 Nicky 是仅有的两个不可用的?因此,如果我的应用程序专门排除了那些,它将生成可用声音的真实列表?有一些清晰度会很好。

最佳答案

我一直在寻找一种以编程方式使用 Siri 好听的声音的方法,例如英语 Siri Male(美国),并很快发现即使可以在系统偏好设置中选择语音,也无法使用公共(public)语音 API。
要回答您的问题,除了您的代码示例之外,至少还有两种其他方法可以找到可用的声音。
使用 defaults命令

 defaults read com.apple.speech.voice.prefs > speech_prefs.txt
要查找系统偏好设置中当前选择的语音信息,请查找 SelectedVoiceNamespeech_prefs.txt .
例如,对于英语 Siri Male(美国),这将是 SelectedVoiceName = "Aaron Siri"; .
现在,通过进一步搜索 aaronspeech_prefs.txt ,您会发现以下内容:
"VOICEID:com.apple.speech.synthesis.voice.custom.siri.aaron.premium_1" = {
    BundleIdentifier = "com.apple.speech.synthesis.voice.custom.siri.aaron.premium";
我在初始化语音时尝试了这两个字符串,但出现错误提示语音未找到。
寻找语音目录
好像有three locations :
/System/Library/Speech/Voices
,
/Library/Speech/Voices
~/Library/Speech/Voices
第三个似乎是自定义声音的位置。
每个声音都有自己的目录。
如果你比较 Info.plist一些以编程方式可用和以编程方式不可用的声音的文件,您将看到两者具有不同的结构。例如,编程不可用的语音缺少一些与 Speech API 对应的属性,例如 VoiceSupportedCharacters .我相信这是因为有些声音是老一代的,有些是新的。
附言
与您的问题没有直接关系,但仅供引用:我仍在寻找以编程方式使用 Siri 语音的解决方案。一个想法是复制语音目录并使用它的Info.plist .另一个想法是通过模拟绑定(bind)到 Speak selected text when the key is pressed 的按键来自动化 MacOS UI 以触发文本到语音的转换。系统偏好设置/辅助功能/语音中的选项,然后录制音频。
如果有人可以分享其他想法,我将不胜感激。

关于ios - 可供 AVSpeechSynthesis 在 iOS 中使用的已安装语音的可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60116322/

相关文章:

java - 限制语音识别词典以实现更快的匹配和更高的准确性

android - 如何根据语音命令打开Activity

ios - 使用 NSFetchedResultsController 删除节的最后一行时出现错误消息

ios - 没有Facebook App不会显示FBWebDialogs presentFeedDialogModallyWithSession

iphone - 从 UITextField 添加一个对象到 NSMutableArray

c# - 如何在 Visual C#/C++ 中实现文本转语音 (TTS)?

java - FreeTTS 卡在 ColdFusion 8/Java 中

android - 如何花时间通过TTS讲文字

iOS - 为什么我的 UIAlertView 上的底部项目是粗体?

node.js - 如何将 Alexa 请求处理程序引入另一个模块