如何使用 AVAudioEngine 取消或消除回声/重复声音?

Posted

技术标签:

【中文标题】如何使用 AVAudioEngine 取消或消除回声/重复声音?【英文标题】:How to cancel or remove echo/repeated sound with AVAudioEngine? 【发布时间】:2017-08-07 02:57:55 【问题描述】:

我正在使用 AVAudioEngine 进行音频流式传输。但是当我对着麦克风说任何单词时,它会重复多次,就像回声效果一样。我想当我说话的时候,声音只有一次,而不是多次。我想消除回声或额外的噪音。

我怎样才能做到这一点?

var peerAudioEngine: AVAudioEngine = AVAudioEngine() 
var peerAudioPlayer: AVAudioPlayerNode = AVAudioPlayerNode() 
var peerInput: AVAudioInputNode? 
var peerInputFormat: AVAudioFormat? 

func setUpAVPlayer()  
    self.peerInput = self.peerAudioEngine.inputNode 
    self.peerAudioEngine.attach(self.peerAudioPlayer) 
    self.peerInputFormat = AVAudioFormat.init(commonFormat: .pcmFormatFloat32, sampleRate: 44100, channels: 1, interleaved: false) 
    self.peerAudioEngine.connect(self.peerAudioPlayer, to: self.peerAudioEngine.mainMixerNode, format: self.peerInputFormat) 

    print("\(#file) > \(#function) > peerInputFormat = \(self.peerInputFormat.debugDescription)") 

【问题讨论】:

请给我们看一些代码,告诉我们到目前为止你做了什么。 @ParasGorasiya 请检查我的代码 您是否在会产生回声的环境中录制内容? @ParasGorasiya 是的,我正在使用 AVaudioEngine 录制,但是当我发送并播放它时会产生回声或重复声音 我的意思是你在一个空旷的大房间里录音,录音时会产生回声?所以这可能是真正的问题。 【参考方案1】:

我认为您应该能够通过此代码解决您的问题

var reverbNode = AVAudioUnitReverb()
reverbNode.loadFactoryPreset( AVAudioUnitReverbPreset.Cathedral)
reverbNode.wetDryMix = 60
// Attach the audio effect node corresponding to the user selected effect
peerAudioEngine.attachNode(reverbNode)

此外,您可能需要考虑其他方法,在您讲话后可以将麦克风静音,并且您必须手动检测您的 peerAudioEngine 何时没有收到任何输入音频并将其静音。

这将完全消除您讲话中的回声。

有关更多信息,您可以访问 http://asciiwwdc.com/2014/sessions/502

【讨论】:

您还有其他解决方案吗?

以上是关于如何使用 AVAudioEngine 取消或消除回声/重复声音?的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioEngine 是不是支持递归路由?

使用 AVAudioEngine 进行电平测量

AVAudioEngine 寻找歌曲的时间

使用 Swift 使用 AVAudioEngine 实时进行音高转换

使用 AVAudioEngine 录制音频文件

svn如何回滚到之前版本