Swift中如何在偏好语言下通过名称指定原生Siri语音?
获取原生Siri语音用于AVSpeechSynthesis
嘿,这个需求我之前做项目的时候刚好碰到过!要调用系统原生的Siri语音(不需要额外下载的那种),确实不能直接靠语音名称来定位——因为名称会随系统语言本地化变化,但我们可以通过**语音标识符(identifier)**和语言筛选来精准获取。
核心思路
原生Siri语音的AVSpeechSynthesisVoice对象,其identifier字段里会包含"Siri"关键词(比如英文原生语音的标识是com.apple.ttsbundle.Siri_en-US_compact),而额外下载的高质量Siri语音标识也带"Siri",但原生版本是系统默认自带的,不需要用户额外下载。我们可以结合目标语言(比如用户系统偏好的语言)来筛选出对应的原生Siri语音。
实现代码
首先写一个工具函数来获取指定语言的原生Siri语音:
func getNativeSiriVoice(for languageCode: String) -> AVSpeechSynthesisVoice? { // 遍历所有可用语音,筛选匹配语言且标识含"Siri"的语音 return AVSpeechSynthesisVoice.speechVoices().first { voice in voice.language == languageCode && voice.identifier.contains("Siri") } }
然后在你的语音合成逻辑里调用这个函数:
// 创建语音 utterance let utterance = AVSpeechUtterance(string: "Hello, I'm Siri!") // 获取用户系统偏好语言对应的Siri语音, fallback到英文 let targetLanguage = Locale.current.languageCode ?? "en-US" if let siriVoice = getNativeSiriVoice(for: targetLanguage) { utterance.voice = siriVoice } else { // 如果找不到对应语言的Siri语音,使用该语言的默认语音 utterance.voice = AVSpeechSynthesisVoice(language: targetLanguage) } // 执行语音合成 let synthesizer = AVSpeechSynthesizer() synthesizer.speak(utterance)
注意事项
- 不同系统版本的Siri语音标识符可能略有差异,但
contains("Siri")这个判断是通用的,能精准定位所有Siri系列语音。 - 部分小语种可能没有原生Siri语音,所以一定要加fallback逻辑,避免语音合成失败。
- 如果你想强制使用某个特定地区的Siri语音(比如美式英语),直接传入对应的语言代码(如
"en-US")即可。
内容的提问来源于stack exchange,提问作者Frostie3
相关产品推荐
相关产品推荐

