Skip to main content
Code samples

NCKitStreamProcessor

Live / real-time denoise adapter for AVAudioEngine microphone taps. Resamples to 48 kHz mono, accumulates 10 ms hops, and drives NCKitProcessor.processFrame.

Requires NCKit 1.1.1+ for reset().

APIโ€‹

public final class NCKitStreamProcessor {
public let frameLength: Int

public init(processor: NCKitProcessor) throws

public func prepare(inputFormat: AVAudioFormat) throws
public func convertToTargetFormat(_ buffer: AVAudioPCMBuffer) throws -> AVAudioPCMBuffer
public func process(buffer: AVAudioPCMBuffer) throws -> [AVAudioPCMBuffer]
public func processConverted(_ buffer: AVAudioPCMBuffer) throws -> [AVAudioPCMBuffer]
public func flush() throws -> [AVAudioPCMBuffer]
public func reset()
public func setAttenLim(_ db: Float)
public func setPostFilterBeta(_ b: Float)
}

Setupโ€‹

import NCKit
import AVFoundation

let modelURL = try NCKitModelLocator.modelTarGzURL()
let processor = try NCKitProcessor(modelURL: modelURL)
let stream = try NCKitStreamProcessor(processor: processor)

Install microphone tapโ€‹

inputNode.installTap(onBus: 0, bufferSize: 4096, format: tapFormat) { buffer, _ in
try stream.prepare(inputFormat: buffer.format)
let frames = try stream.process(buffer: buffer)
for frame in frames {
// 480 Float samples @ 48 kHz mono
}
}

Dry + denoised (A/B)โ€‹

try stream.prepare(inputFormat: buffer.format)
let dry = try stream.convertToTargetFormat(buffer)
let denoised = try stream.processConverted(dry)

End of sessionโ€‹

let tail = try stream.flush()
stream.reset()

Threadingโ€‹

Not thread-safe โ€” call prepare, process, processConverted, flush, and reset from one serial queue (typically the audio tap thread).