You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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")
    // 或者直接注释掉这行,让系统自动选择默认语音
    

    另外,你可以打开模拟器的「设置」→「辅助功能」→「语音内容」→「朗读屏幕」,检查是否开启了该功能,并且尝试下载对应语音包(不过模拟器下载语音包经常失败,重启模拟器可能会有帮助)。

  • 调整朗读触发的时机
    ScrollViewonAppear可能在self.description还没完全初始化完成时就触发了,你可以延迟一点时间再调用朗读:

    .onAppear {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            AudioManager.shared.speak(text: self.description)
        }
    }
    
  • 优先用真机测试
    模拟器的AVSpeechSynthesizer功能本身就有很多兼容性问题,很多在模拟器里出现的错误,在真机上都会自动消失。如果条件允许,直接在真机上运行测试,语音合成的表现会稳定很多。

按照这个顺序排查,先解决生命周期的问题,应该就能看到朗读效果了!

火山引擎 最新活动