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
相关产品推荐
相关产品推荐

