iOS16下UIKit中AVSpeechSynthesizer失效(iOS12/15正常)
解决iOS16.1中AVSpeechSynthesizer无声音输出问题
问题核心原因
你的代码存在两个关键问题:
- 静态函数内创建的
AVSpeechSynthesizer是局部变量,函数执行结束后会被ARC立即释放,iOS16对对象生命周期的管理更严格,导致语音还未播放就被终止。 - 结构体的实例成员无法直接在静态方法中调用,所以直接把
synthesizer移到函数外会触发编译报错。
修复方案
1. 将合成器改为静态属性
把AVSpeechSynthesizer声明为结构体的静态属性,让它的生命周期和结构体绑定,不会被轻易释放,保证语音能完整播放。
2. 主动配置音频会话(可选但推荐)
iOS16部分场景下需要主动激活音频会话,避免被系统静音策略拦截,确保应用拥有音频播放权限。
修改后的完整代码
import Foundation import AVFoundation struct TTS { // 声明为静态属性,保证生命周期稳定 static let synthesizer = AVSpeechSynthesizer() static func speak(messages: String) { let utterance = AVSpeechUtterance(string: messages) utterance.rate = AVSpeechUtteranceDefaultSpeechRate utterance.postUtteranceDelay = 0.005 // 停止之前的播放(如果存在),避免音频冲突 if synthesizer.isSpeaking { synthesizer.stopSpeaking(at: .immediate) } // 配置音频会话,解决部分静音场景下无声音问题 do { let audioSession = AVAudioSession.sharedInstance() try audioSession.setCategory(.playback, mode: .default) try audioSession.activate() } catch { print("音频会话配置失败: \(error.localizedDescription)") } synthesizer.speak(utterance) } }
额外注意事项
- 确认设备未处于静音模式,且应用的音量设置正常。
- 如果需要后台播放语音,需在
Info.plist中添加UIBackgroundModes并勾选audio权限。
内容的提问来源于stack exchange,提问作者app4g
相关产品推荐
相关产品推荐

