iOS模拟器中AVSpeechSynthesizer无法朗读文本,控制台出现Error fetching voices错误的解决咨询
iOS模拟器中AVSpeechSynthesizer无法朗读文本,控制台出现Error fetching voices错误的解决咨询
我之前在模拟器里折腾语音合成的时候也踩过类似的坑,结合你的代码和控制台错误信息,给你几个实际可行的排查和解决方向:
修复AVSpeechSynthesizer的生命周期问题(最关键!)
你在speak方法里创建的synthesizer是局部变量,方法执行完毕后,ARC会立刻回收这个实例,而语音合成是异步执行的——这就导致语音还没开始朗读就被终止了,这是非常常见的错误。把
synthesizer改成AudioManager的实例属性,保证它的生命周期和管理器一致:class AudioManager { static let shared = AudioManager() // 将synthesizer改为实例属性,避免被提前释放 let synthesizer = AVSpeechSynthesizer() // ... 保留其他原有属性和方法 func speak(text: String) { let utterance = AVSpeechUtterance(string: text) utterance.voice = AVSpeechSynthesisVoice(language: "en-GB") // 使用实例属性的synthesizer synthesizer.speak(utterance) } }规避模拟器的语音加载限制
控制台的Error fetching voices是模拟器的常见bug,它对特定地区的语音包支持很差,尤其是非en-US的语音。你可以先尝试切换到美式英语语音,或者直接使用系统默认语音:// 换成en-US试试 utterance.voice = AVSpeechSynthesisVoice(language: "en-US") // 或者直接注释掉这行,让系统自动选择默认语音另外,你可以打开模拟器的「设置」→「辅助功能」→「语音内容」→「朗读屏幕」,检查是否开启了该功能,并且尝试下载对应语音包(不过模拟器下载语音包经常失败,重启模拟器可能会有帮助)。
调整朗读触发的时机
ScrollView的onAppear可能在self.description还没完全初始化完成时就触发了,你可以延迟一点时间再调用朗读:.onAppear { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { AudioManager.shared.speak(text: self.description) } }优先用真机测试
模拟器的AVSpeechSynthesizer功能本身就有很多兼容性问题,很多在模拟器里出现的错误,在真机上都会自动消失。如果条件允许,直接在真机上运行测试,语音合成的表现会稳定很多。
按照这个顺序排查,先解决生命周期的问题,应该就能看到朗读效果了!




