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

iPhone使用麦克风后AVSpeechSynthesizer播放音量变小、输出设备异常问题

问题根因
  • 该异常由iOS AVAudioSession 配置被语音识别模块篡改导致。SFSpeechRecognizer 启动识别时会自动将音频会话类别切换为 .playAndRecord,该类别的默认输出路径为听筒,输出音量优先级低于普通播放类别,同时会覆盖预先配置的音频路由规则,因此会出现音量变小、蓝牙耳机路由被切回本机的问题。
修复方案

1. 语音识别结束后主动重置音频会话

在 SwiftSpeech 识别回调(成功/失败/取消都需要覆盖)执行完成后,立刻重置 AVAudioSession 配置到TTS所需状态,示例代码:

do {
    // TTS仅需播放的场景推荐配置,支持蓝牙输出、默认走扬声器
    try AVAudioSession.sharedInstance().setCategory(
        .playback,
        mode: .spokenAudio,
        options: [.mixWithOthers, .allowBluetoothA2DP]
    )
    try AVAudioSession.sharedInstance().setActive(true, options: .notifyOthersOnDeactivation)
} catch {
    print("音频会话重置失败: \(error.localizedDescription)")
}
  • 若场景需要同时支持录音和播放,可保留 .playAndRecord 类别,额外添加配置强制走扬声器、兼容蓝牙输出:
try AVAudioSession.sharedInstance().setCategory(
    .playAndRecord,
    mode: .spokenAudio,
    options: [.mixWithOthers, .allowBluetooth, .allowBluetoothA2DP, .defaultToSpeaker]
)

2. TTS播放前预校验音频配置

如果重置识别后会话仍有异常,可在每次调用 AVSpeechSynthesizer.speak(_:) 方法前,先执行一次上述音频会话配置,避免其他模块修改会话状态后影响TTS播放。

3. 关闭SwiftSpeech自动音频管理

SwiftSpeech默认会自动管控音频会话,可在库的初始化配置中关闭它的自动音频会话控制权限,完全由业务代码统一管理 AVAudioSession 状态,从根源避免配置冲突。

内容的提问来源于stack exchange,提问作者noranraskin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:45:04