使用 VoiceProcessingIO 音频单元实现的自动回声消除
AECAudioStream
类提供了一个接口,用于从系统的音频输入捕获音频数据,并对其应用声学回声消除 (AEC) 滤波器。该类还允许您使用渲染器回调通过音频单元的扬声器播放音频数据。
声学回声消除 (AEC) 是一种常见的信号处理技术,用于消除通过扬声器播放的声音被麦克风拾取时发生的回声。这种类型的回声称为声学回声,对于电话或视频通话另一端的人来说,可能会非常分散注意力并且令人烦恼。
AEC 的工作原理是分析通过扬声器播放的音频信号,并从麦克风拾取的音频信号中减去它。这个过程是实时完成的,需要大量的计算能力。
AEC 通常用于电话会议系统、视频会议系统 (VOIP) 以及通过网络传输音频的其他通信系统。 它有助于提高音频信号的质量,并使通信更加有效。
要创建一个没有任何特殊渲染器回调的标准 AudioStream,您可以初始化 AECAudioStream
类的一个新实例,并为录制的音频提供采样率,如下面的代码所示
/// Audio Samping at 16000Hz
let audioUnit = AECAudioStream(sampleRate: 16000)
创建 AudioStream 对象后,您可以通过调用 AECAudioStream/AECAudioStream/startAudioStream(enableAEC:)
来监听录制的音频数据。它返回一个 AsyncThrowingStream
,该流产生包含捕获的音频数据的 AVAudioPCMBuffer
对象。
for try await pcmBuffer in audioUnit.startAudioStream(enableAEC: true) {
// here you get a ``AVAudioPCMBuffer`` data
pushStream?.write(pcmBuffer.data())
}
或者,如果您不熟悉 AsyncThrowingStream
方式,您可以调用 AECAudioStream/AECAudioStream/startAudioStream(enableAEC:audioBufferHandler:)
,音频数据将在 audioBufferHandler
中提供。
audioUnit.startAudioStream(enableAEC: true, audioBufferHandler: { pcmBuffer in
// here you get a ``AVAudioPCMBuffer`` data
})
停止运行的 AudioStream 对象很简单,只需调用 AECAudioStream/AECAudioStream/stopAudioUnit()
。它将停止音频单元并释放音频图。
AudioToolbox/kAudioUnitSubType_VoiceProcessingIO