--- 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 ```python 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](https://huggingface.co/datasets/intrect/artifactbench-v1). ## Citation ```bibtex @article{oh2026artifactnet, title={ArtifactNet: Detecting AI-Generated Music via Forensic Residual Physics}, author={Oh, Heewon}, year={2026} } ``` ## License CC BY-NC 4.0