aufklarer/Nemotron-3-Diarization-100M-MLX-INT8
Nemotron 3 Diarization · MLX INT8
Apple Silicon MLX export of NVIDIA Nemotron 3 Diarization. It emits frame-level activity probabilities for up to eight speakers. It does not transcribe speech or identify people.
Model
Files
Performance
Measured on an Apple M5 Pro running macOS 26.6.2 with one 30.4-second chunk from each of three locally held speech recordings. Times are the median of three warm runs of the model stages. Mel extraction, file loading, speaker-cache updates, and segment postprocessing are excluded. The comparison is against the final unquantized checkpoint; this is a numerical parity check, not a diarization error rate benchmark.
The speech-swift host runtime scored 10.98% pooled DER on 132 internal benchmark recordings (12.82 hours) across eight languages, using a 0.25-second collar, overlap included, and automatic speaker count. All files completed. This measures the full Swift audio-to-segment pipeline, not the first-chunk example below. Other hosts must reproduce the source model's cache and FIFO update algorithm to preserve speaker labels across chunks.
Usage
Install mlx, numpy, and safetensors. Supply a NumPy file containing preprocessed 128-band log-mel features with shape [1, 3040, 128], matching the source NeMo preprocessor. The command below processes the first chunk with empty speaker memory:
python run_chunk.py --format mlx --bundle . --mel chunk.npy --output probabilities.npyimport mlx.core as mx
from mlx_reference import Nemotron3MLXReference, load_weights
model = Nemotron3MLXReference(load_weights("model.safetensors"))
# mel: MLX array [1, 3040, 128]; first chunk only
embeddings = model.preencode(mel)
packed = mx.concatenate((embeddings, mx.zeros((1, 304, 512))), axis=1)
probabilities_10ms, probabilities_80ms = model.infer_preencoded(packed, 380)The first 3040 output frames correspond to the 30.4-second input. Binarize speaker activity with 0.5 onset and offset thresholds, as in the source model's default postprocessor. The pred_score_threshold: 0.25 value in config.json is used to select speaker-cache frames; it is not the segment activity threshold. For later chunks, preserve the arrival-order speaker cache and FIFO state as described by the source model.
Source
Converted from `nvidia/Nemotron-3-Diarization`, revision a435e9867d79e789e90053f9b6d6834053af564a. NVIDIA's model description explains the architecture and benchmark protocol. The source model and these derived weights are distributed under OpenMDW 1.1; see LICENSE and NOTICE.
Links
- speech-swift — Apple SDK
- Docs — installation and CLI guide
- soniqo.audio — website
- blog — updates
