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

设置音量为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:22:43