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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:35:16