如何在iOS 11的“设置”中访问用户选择的Siri语音

时间:2017-09-20 22:35:18

标签: ios swift avfoundation siri

我正在编写一个包含使用AVSpeechSynthesizer的文字转语音的应用。生成话语和使用语音合成器的代码一直运行良好。

let utterance = AVSpeechUtterance(string: text)
utterance.voice = currentVoice
speechSynthesizer.speak(utterance)

现在使用iOS 11,我希望将语音与用户在手机的“设置”应用中选择的语音进行匹配,但我看不到任何方法来获取该设置。

我已尝试获取已安装语音的列表并查找quality .enhanced的语音列表,但有时没有安装增强语音,即使有,也可能或可能不是用户在“设置”应用中选择的语音。

static var enhanced: AVSpeechSynthesisVoice? {
    for voice in AVSpeechSynthesisVoice.speechVoices() {
        if voice.quality == .enhanced {
            return voice
        }
    }

    return nil
}

问题有两个:

  1. 如何确定用户在设置应用中选择了哪种语音?
  2. 为什么在一些使用新Siri语音的iOS 11手机上我没有找到“增强型”语音?
  3. enter image description here

2 个答案:

答案 0 :(得分:2)

我想如果有一种方法可用于选择与“设置”应用程序中相同的语音,则会在“查找语音”主题下的AVSpeechSynthesisVoice类文档中显示。跳转到AVSpeechSynthesisVoice的代码中的定义,我找不到任何不同的方法来检索语音。

这是我为我正在处理的应用程序获得增强型配音的解决方法:

默认情况下,新的iOS设备中可能不存在增强版语音,以节省存储空间。通过我的全新iPhone上的可用声音迭代,我只发现默认质量的声音,例如: [AVSpeechSynthesisVoice 0x1c4e11cf0]语言:en-US,名称:Samantha,质量:默认[com.apple.ttsbundle.Samantha-compact]

我发现这个article关于如何启用额外的配音,并在其中下载了名为“Samantha(增强版)”的声音。再次检查可用语音列表,我注意到以下内容: [AVSpeechSynthesisVoice 0x1c4c03060]语言:en-US,姓名:Samantha(增强版),质量:增强[com.apple.ttsbundle.Samantha-premium]

截至目前,我能够在Xcode上选择增强语言。鉴于AVSpeechSynthesisVoice.currentLanguageCode()方法公开了当前选定的语言,请运行以下代码以选择我能找到的第一个增强型语音。如果没有可用的增强版本,我只选择可用的默认值(下面的代码是我创建的VoiceOver自定义类,用于处理我的应用程序中的所有语句。下面的部分更新其语音变量。)

var voice: AVSpeechSynthesisVoice!

for availableVoice in AVSpeechSynthesisVoice.speechVoices(){
        if ((availableVoice.language == AVSpeechSynthesisVoice.currentLanguageCode()) &&
            (availableVoice.quality == AVSpeechSynthesisVoiceQuality.enhanced)){ // If you have found the enhanced version of the currently selected language voice amongst your available voices... Usually there's only one selected.
            self.voice = availableVoice
            print("\(availableVoice.name) selected as voice for uttering speeches. Quality: \(availableVoice.quality.rawValue)")
        }
}
if let selectedVoice = self.voice { // if sucessfully unwrapped, the previous routine was able to identify one of the enhanced voices
        print("The following voice identifier has been loaded: ",selectedVoice.identifier)
} else {
        self.voice = AVSpeechSynthesisVoice(language: AVSpeechSynthesisVoice.currentLanguageCode()) // load any of the voices that matches the current language selection for the device in case no enhanced voice has been found.

}

我也希望Apple公开一种直接加载所选语言的方法,但我希望这项工作可以在此期间为您服务。我猜Siri的增强型语音是随时随地下载的,所以也许这就是我需要这么长时间来回答语音命令的原因:)

最好的问候。

答案 1 :(得分:1)

看起来iOS 11中新的Siri语音不是AVSpeechSynthesis API的一部分,开发人员无法使用。

在macOS 10.13 High Sierra(它也获得了新的声音)中,似乎有一个新的SiriTTS框架可能与这个功能有关,但是它在PrivateFrameworks中却没有。有一个开发人员API。