Workflow · Podcast
Podcast platforms specify a dialog-gated loudness target, not a whole-file one. Measure the episode as a single number and the intro bed, the stinger, and the room tone all drag it off. So Specula finds the speech first: a neural VAD marks every spoken block, a parallel integrated LUFS accumulates over just those blocks, and the Apple Podcasts and Spotify Podcasts targets read off that. When the detector guesses wrong, you correct the regions by hand.
Why whole-file LUFS is the wrong number
Dialog loudness measured over the whole file is wrong the moment there's music or SFX in it. The platforms know that, so they specify dialog-gated targets.
An integrated LUFS reading over the entire episode mixes the talking with everything that isn't talking. A loud cold-open music bed, a sponsor stinger, a long quiet pause, they all land in the same average, so the file can read on-target while the actual voice sits a couple of LU off where a listener hears it. Specula computes loudness only over the speech blocks, so the number you check against Apple Podcasts or Spotify Podcasts is the dialogue, not the dialogue blended with the bed.
The same separation matters at the quiet end. The room-tone noise floor between phrases is invisible on a whole-file loudness meter and inaudible on headphones, but it's measured over every non-speech sample here, so a noisy capture shows up as a number before it ships.
From episode to verdict
The detector does the first pass, you correct it, the targets read off the result.
.dlg.json sidecar next to the file (debounced 500 ms), so re-opening the episode re-applies them.Two-tier speech detection, and where your corrections go
Tier 1 is a Silero neural VAD (MIT-licensed, run via FluidAudio). On load the file is downsampled to 16 kHz mono and classified per 100 ms block. Tier 2 is a spectral fallback that covers the rare case where Silero is unavailable, it classifies on four spectral features (an HF gate, a 300 to 3 400 Hz band-energy ratio, spectral flatness, and a harmonicity-plus-flux test) so the speech-gated path still produces a result.
The corrected regions feed straight into the speech-gated path. When you fix regions in Dialogue mode, the dialog-gated LUFS, the noise-floor reading, and the Apple Podcasts / Spotify Podcasts verdicts all recompute against the speech and silence you confirmed, not what the raw VAD guessed. Region tint shows provenance: teal for pristine Silero output, amber for VAD regions you've edited, blue for ones loaded from a sidecar.
Bias the detector to your material in Settings → Speech. Three sliders re-run detection in about half a second: Threshold (0.1 to 0.9, default 0.5, lower picks up quieter speech), Minimum region duration (0.05 to 2.0 s, default 0.10, raise to reject clicks and short interjections), and Merge gap (0.05 to 2.0 s, default 0.10, larger values fuse nearby regions through breath pauses). Reset to VAD discards your edits, deletes the sidecar, and re-runs Silero with the current tuning.
Then fix the level in Edit mode
Where the dialogue is off level or the room tone sits high, the fix is in Edit mode. Level Dialogue works off the same speech regions the measurement uses (the ones you confirmed in Dialogue mode): it gates the gaps between phrases down, then optionally lifts the voice to your target in the same pass, which is what lets an episode come up in level while every pause stays quiet. It buys a few dB on a borderline floor. Hiss from the room or the preamp needs fixing at the source.
For a straight level move, Normalize on a dialog-gated basis shifts the whole episode by the gain that lands speech-gated LUFS on Apple Podcasts' −16 or Spotify's −14, and a true-peak triangle is one Limit TP pass that caps the peaks and leaves the loudness alone. Each is one undoable edit that saves a new file. The mechanics live on the editing page →
In practice
Ship the episode on target
The episode's number is the dialogue's number: measured over the speech you confirmed, checked against Apple's and Spotify's specs, and correctable in the same window when it's off. Level Dialogue for the floor, Normalize for the target, Limit TP for the peaks.