You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 04:07:33