设置音量为0的AVSpeechUtterance仍可听见,求彻底静音方案
解决AVSpeechUtterance设置音量为0仍有微弱声音的问题
针对iOS 16.2/16.3.1中部分语音(如Eddy)设置volume=0后仍有微弱声音的问题,结合记忆训练需固定时长静音间隙的场景,可尝试以下几种方案:
方案1:强制设置系统音频输出音量为0
通过AVAudioSession直接将系统输出音量设为0,从底层切断音频输出,播放完成后可按需恢复原音量:
import AVFoundation // 播放前激活音频会话并设置音量为0 do { let audioSession = AVAudioSession.sharedInstance() try audioSession.setActive(true) try audioSession.setOutputVolume(0) } catch { print("音频会话设置失败:\(error)") } // 创建并播放静音 utterance let utterance = AVSpeechUtteranceSR(string: text) utterance.volume = 0 aVSpeechSynthesizer.speak(utterance) // 播放结束后恢复原音量(可选) // 可通过AVSpeechSynthesizerDelegate的speechSynthesizer(_:didFinish:)方法实现
方案2:使用无声文本匹配目标时长
如果仅需要对应语音时长的静音间隙,可创建包含非发音字符(如空格)的utterance,并设置与原语音一致的时长:
// 计算原语音的预估时长 func calculateSpeechDuration(text: String, voiceIdentifier: String) -> TimeInterval { let utterance = AVSpeechUtteranceSR(string: text) utterance.voice = AVSpeechSynthesisVoice(identifier: voiceIdentifier) return utterance.speechDuration } // 获取目标静音时长 let targetDuration = calculateSpeechDuration(text: originalText, voiceIdentifier: AVSpeechSynthesisVoiceIdentifierEddy) // 创建静音 utterance let silentUtterance = AVSpeechUtteranceSR(string: " ") silentUtterance.volume = 0 silentUtterance.speechDuration = targetDuration // 强制设置时长 aVSpeechSynthesizer.speak(silentUtterance)
方案3:用AVAudioPlayer播放静音音频
提前准备一段1秒的静音音频文件(如silent.wav),根据目标时长循环播放该音频:
func playSilentGap(duration: TimeInterval) { guard let audioPath = Bundle.main.path(forResource: "silent", ofType: "wav"), let audioURL = URL(fileURLWithPath: audioPath) else { return } do { let player = try AVAudioPlayer(contentsOf: audioURL) player.numberOfLoops = Int(duration / player.duration) player.play() // 到点停止播放 DispatchQueue.main.asyncAfter(deadline: .now() + duration) { player.stop() } } catch { print("静音音频播放失败:\(error)") } } // 获取原语音时长后调用 let targetDuration = calculateSpeechDuration(text: originalText, voiceIdentifier: AVSpeechSynthesisVoiceIdentifierEddy) playSilentGap(duration: targetDuration)
问题原因说明
部分语音出现微弱声音属于iOS 16.x系统的语音合成器实现bug,设置volume=0并未完全切断对应语音的音频输出,上述方案可通过系统级音量控制、无声文本替代或独立音频播放的方式绕过该问题。
内容的提问来源于stack exchange,提问作者Kiwi
相关产品推荐
相关产品推荐

