metadata
license: cc-by-nc-4.0
tags:
- audio-classification
- ai-music-detection
- forensic
- onnx
language:
- en
pipeline_tag: audio-classification
ArtifactNet v9.4 — AI-Generated Music Forensic Detection
ArtifactNet detects AI-generated music by extracting forensic residual artifacts via a task-specific UNet, rather than learning generator-specific patterns. This approach generalizes across 22 AI music generators with only 4.2M parameters.
Model Description
- Architecture: ArtifactUNet (3.6M) + 7ch HPSS Forensic CNN (424K) = 4.2M total
- Input: 44.1kHz mono audio, 4-second segments
- Output: P(AI) ∈ [0, 1] per segment, song-level median verdict
- Format: Single ONNX file (entire pipeline: STFT → UNet → HPSS → 7ch → CNN → sigmoid)
Performance (ArtifactBench v1, fair eval)
| Metric | ArtifactNet (4.2M) | CLAM (194M) | SpecTTTra (19M) |
|---|---|---|---|
| F1 | 0.983 | 0.824 | 0.766 |
| Precision | 0.991 | 0.758 | 0.885 |
| Recall (TPR) | 0.976 | 0.904 | 0.675 |
| FPR | 0.015 | 0.705 | 0.214 |
| @FPR≤5% TPR | 99.1% | - | - |
Evaluated on 8,766 tracks across 22 AI generators and 6 real music sources.
Usage
import onnxruntime as ort
import numpy as np
import soundfile as sf
# Load model
sess = ort.InferenceSession("artifactnet_v94_full.onnx")
# Load audio (44.1kHz mono, 4-second chunk)
audio, sr = sf.read("track.wav", dtype="float32")
if audio.ndim > 1:
audio = audio.mean(axis=1)
chunk = audio[:4 * 44100].reshape(1, -1).astype(np.float32)
# Inference
prob = sess.run(None, {"audio": chunk})[0][0]
print(f"P(AI) = {prob:.4f}") # > 0.5 → AI-generated
For song-level verdict, compute median over multiple chunks.
Benchmark
Evaluate with ArtifactBench v1.
Citation
@article{oh2026artifactnet,
title={ArtifactNet: Detecting AI-Generated Music via Forensic Residual Physics},
author={Oh, Heewon},
year={2026}
}
License
CC BY-NC 4.0