我正在编写一个包含使用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
}
问题有两个:
答案 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。