AVSpeechSynthesizer为何额外播报文本外的信息?
AVSpeechSynthesizer 配合VoiceOver播报参数问题的排查与解决思路
问题背景
使用AVSpeechSynthesizer处理文本的核心代码如下:
guard let nonNilText = text else { return } let utterance = AVSpeechUtterance(string: nonNilText) utterance.voice = AVSpeechSynthesisVoice(language: Locale.current.identifier) utterance.rate = 0.4 synthesizer.speak(utterance)
功能整体正常,但在部分设备(尤其是iPhone区域设置为英文时),VoiceOver会在目标文本前播报类似「Speak: rate xxx, voice name equals to com.apple...」的语音参数描述信息。
复现问题的关键设置
要在自己的设备上复现该问题,重点检查VoiceOver的以下设置(英文系统路径对应括号内内容):
- 开启VoiceOver后,进入「设置」→「辅助功能」→「VoiceOver」→「语音」(Settings > Accessibility > VoiceOver > Speech),找到并启用**「播报语音详细信息」**(Speak Speech Details)选项,该选项会强制VoiceOver在播报合成语音前,输出语音速率、语音ID等参数信息。
- 将设备区域设置切换为英文(Settings > General > Language & Region > Region),同时确保VoiceOver的播报语音设置为英文语音,部分区域和语音组合会触发该选项的生效逻辑。
代码层面的规避方案
1. 覆盖无障碍播报标识
显式设置AVSpeechUtterance的无障碍标签为目标文本,让VoiceOver优先播报内容而非参数:
utterance.accessibilityLabel = nonNilText
2. 禁用无障碍元素暴露
如果不需要该合成语音被VoiceOver识别为可访问元素,可以尝试隐藏其无障碍属性:
utterance.accessibilityElementsHidden = true
注意:该设置可能影响VoiceOver用户对语音播放状态的感知,需根据产品无障碍需求评估使用。
3. 适配VoiceOver活跃状态
通过判断VoiceOver是否运行,动态调整播报参数:
if UIAccessibility.isVoiceOverRunning { // VoiceOver活跃时,使用系统默认速率或调整为VoiceOver兼容的参数 utterance.rate = AVSpeechUtteranceDefaultSpeechRate } else { utterance.rate = 0.4 }
其他排查方向
- 检查设备iOS版本:部分旧版iOS(如iOS 14及更早)存在该默认行为,升级至新版本可能自动修复。
- 排查第三方无障碍工具:部分第三方辅助功能APP会修改VoiceOver的播报逻辑,可尝试卸载后测试。
内容的提问来源于stack exchange,提问作者ssantos
相关产品推荐
相关产品推荐

