AECAudioStream

使用 VoiceProcessingIO 音频单元实现的自动回声消除

概述

AECAudioStream 类提供了一个接口,用于从系统的音频输入捕获音频数据,并对其应用声学回声消除 (AEC) 滤波器。该类还允许您使用渲染器回调通过音频单元的扬声器播放音频数据。

关于 AEC

声学回声消除 (AEC) 是一种常见的信号处理技术,用于消除通过扬声器播放的声音被麦克风拾取时发生的回声。这种类型的回声称为声学回声,对于电话或视频通话另一端的人来说,可能会非常分散注意力并且令人烦恼。

AEC 的工作原理是分析通过扬声器播放的音频信号,并从麦克风拾取的音频信号中减去它。这个过程是实时完成的,需要大量的计算能力。

AEC 通常用于电话会议系统、视频会议系统 (VOIP) 以及通过网络传输音频的其他通信系统。 它有助于提高音频信号的质量,并使通信更加有效。

A diagram explaining Echo Cancellation

创建 AECAudioStream

要创建一个没有任何特殊渲染器回调的标准 AudioStream,您可以初始化 AECAudioStream 类的一个新实例,并为录制的音频提供采样率,如下面的代码所示

  /// Audio Samping at 16000Hz
  let audioUnit = AECAudioStream(sampleRate: 16000)

从 AECAudioStream 获取 AEC 过滤后的音频数据

创建 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
})

停止 AECAudioStream

停止运行的 AudioStream 对象很简单,只需调用 AECAudioStream/AECAudioStream/stopAudioUnit()。它将停止音频单元并释放音频图。

主题

要点