SAR Strikes Back: A New Hope for RSVQA
Paper β’ 2501.08131 β’ Published
How to use DimQ1/sortformer-4spk-v2-onnx-int8-cpu with NeMo:
# tag did not correspond to a valid NeMo domain.
INT8 quantized ONNX model of NVIDIA's Sortformer 4spk-v2 speaker diarization. Uses MatMulNBits (ORT β₯ 1.18) for real 8-bit weight compression.
processed_signal β log-mel spectrogram [B, 128, mel_frames]speaker_logits β per-frame sigmoid probabilities [B, diar_frames, 4]Audio (16 kHz mono) β STFT β 128 mel bins
β ConformerEncoder (17 layers, d=512)
β SortformerModules (4 speakers)
β TransformerEncoder (18 layers, d=192)
β Sigmoid β [B, diar_frames, 4] speaker logits
All 265 constant-weight MatMul nodes replaced with MatMulNBits (INT8, block_size=64). 87 dynamic MatMul nodes (attention scores) remain in FP32.
| Metric | Value |
|---|---|
| RTF | 0.034 (29.4Γ real-time) |
| DER | 21.64% (LibriCSS test set) |
| Size | 129 MB (3.6Γ smaller than FP32) |
| cos_sim vs FP32 | 0.989β0.999 |
Benchmarked on 100-file LibriCSS subset (1954.8 s audio). ORT 1.27.1 with ORT_PARALLEL + memory optimizations.
π INT8 is the fastest variant β 29.4Γ real-time on 12-core CPU (66.6 s for 1954.8 s audio).
| Variant | Size | DER | RTF | Link |
|---|---|---|---|---|
| FP32 | 469 MB | 17.82% | 0.037 | sortformer-4spk-v2-onnx-fp32-cpu |
| INT4 | 135 MB | 19.11% | 0.043 | sortformer-4spk-v2-onnx-int4-cpu |
.data file must be in the same directory as sortformer.onnximport onnxruntime as ort
session = ort.InferenceSession(
"sortformer.onnx",
providers=["CPUExecutionProvider"],
)
speaker_logits = session.run(None, {"processed_signal": mel})[0]
using var session = new InferenceSession("sortformer.onnx");
var inputs = new List<NamedOnnxValue>
{
NamedOnnxValue.CreateFromTensor("processed_signal", melTensor),
};
using var results = session.Run(inputs);
Quantized from FP32 ONNX using MatMulNBitsQuantizer (ORT β₯ 1.18, opset 21):
python scripts/quantize_nbits.py --int8
See nemotron-speech-csharp/DiarizationConverter