Procedural Engine Sounds Dataset

Robin Doerfler


Procedurally synthesized engine audio with sample-accurate RPM and torque annotations, covering eight capture configurations across three engines.

19.0 h
audio
5,935
clips
24.47 GB
on disk
8
subsets
6,285 downloads
Hugging Face (original) 2,245
Hugging Face (mirror) 3,972
Zenodo 68

Summed across platforms, not deduplicated. Counts as of 2026-08-15.

Timbre sources

Three engines were recorded across eight capture configurations. Each configuration is one of the released subsets.

SetEngineConfigurationCapture position
AE1turbocharged inline-4Driver headrest, right
BE2twin-turbo V8 (SUV)Passenger footwell
CE3twin-turbo V8 (coupé)Driver headrest, left
DE3twin-turbo V8 (coupé)Front bass mic
EE3twin-turbo V8 (coupé)Front bass mic
FE3twin-turbo V8 (coupé)Passenger, mono
GE3twin-turbo V8 (coupé)Exhaust tailpipe, 0.5 m at 45° left
HE2twin-turbo V8 (SUV)Dashboard centre

Control traces

RPM and torque were pooled separately from the timbre recordings: 2.5 hours of driving across a wider set of vehicles and engine configurations, including an inline-6, together with systematic operation-state sampling on a dynamometer.

What's in a file

Each release file is a four-channel WAV at 48 kHz: two audio channels carrying engine audio on channels 1 and 2 (largely the same content between them, with sparse decorrelation from the resonator and noise components), RPM scaled by 0.0001 on channel 3, and torque scaled by 0.001 on channel 4. Reading it back is a matter of undoing the scale factors.

import soundfile as sf

audio, sr = sf.read("323_Engine-A.wav")   # (n, 4) at 48 kHz
engine = audio[:, 0:2]                    # engine audio, 2 channels
rpm    = audio[:, 2] * 10_000             # revolutions per minute
torque = audio[:, 3] * 1_000              # newton metres

Same-manoeuvre comparison

Three manoeuvres — a gearshift, an overrun and a tip-in in neutral — each drawn from one pooled control trace and rendered by every subset. Switch set to hear the same manoeuvre through a different engine and capture position.

Set
Gearshift 330_Engine-A.wav
Overrun / engine braking 439_Engine-A.wav
Tip-in, neutral 432_Engine-A.wav
Gearshift 330_Engine-B.wav
Overrun / engine braking 439_Engine-B.wav
Tip-in, neutral 432_Engine-B.wav
Gearshift 330_Engine-C.wav
Overrun / engine braking 439_Engine-C.wav
Tip-in, neutral 432_Engine-C.wav
Gearshift 330_Engine-D.wav
Overrun / engine braking 001_Engine-D.wav
Tip-in, neutral 432_Engine-D.wav
Gearshift 248_Engine-E.wav
Overrun / engine braking 148_Engine-E.wav
Tip-in, neutral 075_Engine-E.wav
Gearshift 394_Engine-F.wav
Overrun / engine braking 148_Engine-F.wav
Tip-in, neutral 706_Engine-F.wav
Gearshift 248_Engine-G.wav
Overrun / engine braking 148_Engine-G.wav
Tip-in, neutral 075_Engine-G.wav
Gearshift 248_Engine-H.wav
Overrun / engine braking 148_Engine-H.wav
Tip-in, neutral 075_Engine-H.wav

Pipeline

Every clip is generated by the same five-stage analysis, run once per engine on 5–10 minutes of source audio, followed by a synthesiser that combines the resulting fingerprint with a much larger pool of recorded RPM and torque.

Analysis and synthesis pipeline ANALYSIS SYNTHESIS Real recordings 5–10 min source audio per engine Angle-domain resampling orders stop drifting between bins Frequency-aligned FFT each order locked to a fixed bin Centroid order estimation windowed, not peak-picked Per-order fingerprint amplitude + harmonic deviation vs RPM and torque Pooled control traces 2.5 h of RPM and torque driving, shifts, dyno Parametric synthesiser order oscillators, pink-noise AM, crank-locked bursts, exhaust resonators 4-channel audio audio (2 ch) + RPM + torque, 48 kHz ×15–30

Validation

Per-order magnitude — how much energy sits at each harmonic of the firing frequency — is compared between source recordings and resynthesized audio, plotted against RPM and torque. The same order structure appears in both, and the agreement holds across all eight subsets, over a wider operating range than the five to ten minutes of source audio that seeded each one.

Four heatmaps of engine order magnitude against RPM (top row)
                and torque (bottom row), comparing real-world recordings on
                the left with resynthesized audio on the right. Both columns
                show the same bands of concentrated energy at the low orders
                across the full operating range.
Per-order magnitude against RPM and torque: source recordings (left) against resynthesis (right). Source noise is discarded and replaced with parameterised noise and resonators, so variation above the eighth order is deliberate rather than a discrepancy.

As a downstream check, a differentiable harmonic-plus-noise network with 1.4 million parameters was trained on subsets A, B and C to reconstruct audio directly from RPM and torque alone — coverage the five to ten minutes of source audio per engine could not have supported on its own. This is intended to demonstrate that the generated data supports data-driven modelling, not to claim a state-of-the-art result.

Three training-loss plots, one per subset A, B and C, each
                showing log total loss against training steps for training
                and validation curves. All three converge smoothly with a
                small train-validation gap; a dashed line marks the
                early-stopping point in each.
Training and validation loss over 40,000 steps for subsets A (inline-4), B (V8 SUV) and C (V8 coupé). The dashed line marks early stopping, which lands earlier for A to C as timbral complexity increases.

Models trained on this data

Using it for something? Open a discussion on Hugging Face and I'll add it here.

Use cases

Citing this dataset

Released under CC BY-NC 4.0.

If this dataset was useful, here is how to cite it. The dataset record is the primary reference:

@dataset{doerfler_2025_procedural_engine_sounds,
  author       = {Doerfler, Robin},
  title        = {Procedural Engine Sounds Dataset},
  month        = {August},
  year         = 2025,
  publisher    = {Zenodo},
  version      = {1.0},
  doi          = {10.5281/zenodo.16883336},
  url          = {https://doi.org/10.5281/zenodo.16883336}
}

The paper describing how it was built, written with Lonce Wyse, appeared at EUSIPCO 2026 (a preprint stays on arXiv):

@inproceedings{doerflerAnalysisDrivenProceduralGeneration2026,
  title     = {Analysis-{{Driven Procedural Generation}} of an {{Engine Sound Dataset}} with {{Embedded Control Annotations}}},
  author    = {Doerfler, Robin and Wyse, Lonce},
  booktitle = {Proc. 34th Eur. Signal Process. Conf. (EUSIPCO)},
  address   = {Bruges, Belgium},
  publisher = {EURASIP},
  month     = sep,
  year      = {2026},
  pages     = {221--225},
  isbn      = {978-94-645936-3-1},
  url       = {https://eurasip.org/Proceedings/Eusipco/Eusipco2026/pdfs/0000221.pdf}
}