Version 1.2
Audio analysis and repair for macOS. Load a file and see what's in it: LUFS and true peak against the streaming and broadcast targets, speech-gated dialog levels, the spectrum, and the phase between channels. Compare up to six masters, level-matched and sample-aligned, down to the A−B residual. Then fix what you find: trim and normalize, paint a cough out of the spectrogram, punch in a corrected line, or run your Audio Unit chain with the meters live.
22
delivery targets across music, podcast, VOD, and broadcast
6
masters compared at once, level-matched and sample-aligned
4×
oversampled true peak, enforced against the inter-sample peak
−60 dB
live ACX noise-floor check on the room, before the take
Live meter
The standard itself, running in this page.
Below is a working BS.1770-4 meter. The page synthesizes a 30-second program - verse, quiet passage, loud chorus, verse, fade - and meters it as it plays: K-weighted momentary and short-term, gated integrated loudness, true peak at 4× oversampling. Specula runs the same standard natively, on your files.
Integrated
−14.7 LUFS
−0.7 LU vs −14.0
Short-term 3 s
−21.5 LUFS
Momentary 400 ms
−53.6 LUFS
True peak
−1.2 dBTP
sample peak −2.2 dBFS
New in 1.2
1.2 opens two doors: your own delivery spec as a first-class compliance target, and audio that arrives with no header at all.
Custom loudness targets put a house spec next to the platform presets. Give it a name, a mode, a measurement source (integrated, dialog-gated, or un-weighted RMS), a reference level, a tolerance band, and a true-peak ceiling. It then works everywhere a built-in target does: the verdict badge, the hover breakdown, Match, Normalize to target, and the report exports. Delivering at -18 LUFS ±1 under -1 dBTP stops being mental math against the nearest streaming preset. Loudness targets guide →
Raw PCM import opens headerless audio: a dump from a decoder under test, an I2S capture, a .bin of samples from a test harness. Declare the sample rate, channels, sample format, byte order, and layout, and the whole analysis stack applies. The sheet checks the file size divides into whole frames, ranks the byte formats that fit by decoding a few seconds of each, and previews the result with playback before you commit. It never guesses the sample rate, because nothing in a headerless file can reveal it and a wrong rate corrupts every number without an error. The same declaration works on the command line. Raw PCM guide →
1.2 also brings a readability pass: Text size scales the whole main window, the info panel honors the system Increase Contrast setting, and the live Momentary and Short-term readouts get a refresh-rate picker and a separate rolling-digits toggle. Plus zoom resets across the waveform, FFT, and Spectral canvas, and fixes to short-file spectrograms and high-zoom loudness curves. The release notes have the full list.
Why Specula
Specula shows what's in the file, in numbers and in pictures, before it ships.
Monitors won't flag what delivery QC will: integrated LUFS half a dB over Spotify's target, a dialog mix four LU under Netflix's speech-gated number, a polarity flip in one channel that nobody caught on headphones. Those numbers are already in the file. Specula reads them out.
Comparison has the same blind spot. Was rev 4 better than rev 3, or just half a dB louder? Specula loads up to six versions, normalises them by integrated LUFS, optionally inverts polarity, and computes a sample-accurate residual: everything that differs between two takes, audible on its own.
Before a file leaves the studio, one window confirms the loudness, the true-peak ceiling, the platform compliance, the phase, and the spectral content of the master you're actually sending.
The pipeline
Built for your workflow
Nine jobs · one engineNine entry points into the same engine. Find your job.
Confirm a master is delivery-ready, with the per-platform gain each streaming service will apply.
→A/B up to six versions, level-matched and auto-aligned, then hear the A−X diff as its own waveform.
→A hard pass/fail per target for streaming and broadcast, with a PDF receipt.
→Dialog-gated loudness with neural speech detection you can hand-correct.
→Per-chapter QC: catch every ACX rejection condition before you upload.
→Trim, cut, fade, normalize to a LUFS target, and level dialogue. Keyboard-driven, always saved as a new file.
→Rectangle, lasso, brush, or wand around the blemish, then attenuate, erase, or repair just that region.
→Score a whole folder unattended with the specula CLI and chainable App Intents.
Verify multichannel order and BS.775 / Pro Logic II fold-downs, PRE or POST.
→Spoken-word work is where Specula goes deepest
Neural speech detection you can hand-correct, dialog-gated targets for every major platform, and per-chapter ACX scoring.
Everything it measures
Every measurement, on every file you load. Live during playback, offline on any selection.
Waveform
All channels, pinch-zoom, drag-select, click-to-seek, clip detection, dBFS grid.
EBU R128
Momentary, Short-term, Integrated, LRA, True Peak, all live.
Loudness targets
Per-platform gain penalties for streaming, hard pass/fail for VOD and broadcast.
Speech-gated LUFS
Silero neural VAD highlights speech blocks for dialog mixes.
FFT spectrum
Five window types, note-name on hover, frequency-range selection.
Spectrogram
Four colormaps, log or mel scale, configurable dB range and time resolution.
M/S stereo width
L/R correlation meter, zone colour mode, plain-language hover labels.
Phase scope
Lissajous L/R correlation.
Per-channel RMS
Peak hold, colour-coded zones, per-channel mute.
Selection analysis
Full offline pass with per-channel peak / RMS / crest.
Loudness violations
Set M/S/TP thresholds, watch the waveform light up.
Plugin chain
Audio Unit effects in Edit mode, metered live, rendered as an undoable edit.
Spectral editing
Select time-frequency regions on the spectrogram; attenuate, erase, or repair.
Record mode
New, append, insert, or punch takes with live loudness and noise-floor meters.
Signal generator
Tones, noise, impulses, sweeps; stacked per channel; WAV / AIFF / CAF.
Channel routing
N→M output matrix, mixdown presets, PRE/POST metering, render to file.
Variable-rate playback
0.25× to 2× with optional pitch preservation.
JSON & PDF reports
Pick what to include, export and archive.
Format support
WAV, AIFF, FLAC, CAF, MP3, AAC; mono through 7.1+ layouts.
specula CLI
analyze, compare, edit, generate, report; JSON / HTML / PDF output.
Shortcuts + Siri
Eight App Intents with chainable measurement and comparison entities.
The whole app, subsystem by subsystem
What each FFT window is for, how the speech-gated path works, how compare-mode auto-align locks two files together, and the complete keyboard map.
From the terminal
The same engine ships as a CLI. Five subcommands, analyze, compare, edit, generate, and report, return the numbers the app shows, as deterministic sorted-key JSON. Install it from Specula → Install Command-Line Tool…
$ specula analyze master.wav $ specula compare revA.wav revB.wav --match-loudness --out-diff residual.wav $ specula report mix.wav --mode music --format pdf --out report.pdf
Batch QC, CI hooks, and the eight App Intents are covered in the automation workflow; the full flag reference is in the user guide.
In depth
.dlg.json sidecar and feed straight into the speech-gated loudness path.specula generate.analyze, report, and edit.Loudness targets
Four delivery modes, twenty-two platforms and standards. The gain each will apply to your master, or a hard pass/fail against the spec.
Music mode shows the streaming penalty rather than a verdict. A master at −10 LUFS reads "Spotify −4 dB"; that's the exact gain Spotify will apply at playback to hit its −14 LUFS reference. The dot is green within ±1.5 dB of zero, yellow within ±4 dB, orange beyond, and a separate triangle lights when the true peak breaches the platform's ceiling.
Quiet masters get the honest readout. Apple Music's Sound Check, YouTube, and Tidal are down-only: a −18 LUFS master plays at −18, and the panel reads "as-is" in green instead of promising a boost that won't come. Spotify, Amazon Music, Deezer, and SoundCloud do boost quiet tracks, and there the +X dB number is real.
VOD and Broadcast modes are hard pass/fail: a green dot means loudness sits inside the tolerance band and true peak is at or below the ceiling. FAIL L marks a loudness band miss, FAIL TP a true-peak overshoot, FAIL S↑ a max-short-term overshoot (EBU R128 S1's tighter short-form spec), FAIL NF an ACX noise-floor breach. When several gates fail at once, the loudness miss is the one named first.
Dialog-gated targets (Netflix, Prime Video, Apple TV+, Disney+, Max; Apple Podcasts, Spotify Podcasts; ATSC A/85) evaluate against the speech-gated path and lead with dialog · in the panel. A file with no detectable speech is labelled "no speech" rather than scored against a gate it can't meet. Pick up to four targets per mode in Settings → Targets.
Match to target is non-destructive audition: press a target row's toggle and playback shifts to that target's level with a true-peak limiter at the spec ceiling. Press it on Netflix and hear the file the way Netflix will play it; release, and unity gain returns. Normalize commits instead: one uniform gain to land the target, a two-pass limiter to hold the ceiling, saved as a new file. When only the true peak is over, one-click Limit TP caps the inter-sample peaks without touching loudness.
For audiobooks, the common ACX rejection is room tone above the −60 dB RMS ceiling. Specula shows a live Noise Floor readout over every non-speech sample, and the ACX preset scores it as part of the verdict: above −60 dB, the target lights FAIL NF. Chapter mode runs the full ACX set per chapter; the audiobook workflow has the details.
The panel tracks playback live. For a broadcast delivery you'll usually want the offline analysis (⌘Return) so the verdict covers the entire master, not a rolling estimate. Every target's reference, tolerance, and true-peak ceiling is listed in the user guide.
Standards
Specula implements the actual specifications, not approximations of them.
EBU R 128Requirements
All audio is processed locally. Specula never transmits your audio anywhere.
FAQ
Yes. The specula CLI has five subcommands (analyze, compare, edit, generate, report) built on the same engine as the app, with deterministic sorted-key JSON output. Install it from Specula → Install Command-Line Tool…, which links it into /usr/local/bin. The full command reference is in the user guide.
Yes: eight App Intents (Get Measurements, Compare Files, Get Compare Diff, Get Report, each in a file-input and a path-input variant) return structured output that chains into later Shortcut steps. Spotlight phrases like "Measure with Specula" register automatically, and path variants accept quotes, tildes, and file:// URLs.
Yes: specula report mix.wav --mode music --format pdf --out report.pdf from the terminal, or the Get Report Shortcut action with Format set to PDF. Both match the app's PDF preview; HTML and JSON come from the same --format flag.
No. The full-file report populates every metric the info panel shows the moment the file finishes loading. ⌘Return selection analysis is for when you want the numbers for a specific region.
Match is a non-destructive playback gain: you hear the file the way the platform plays it, and releasing the toggle restores unity. Normalize commits: it opens Edit mode pre-filled to the target, shifts the whole file by one uniform gain, holds the dBTP ceiling with a two-pass true-peak limiter, and saves a new file. The one exception is the ACX RMS target, which stays compliance-only: ACX has a noise-floor requirement a gain can't satisfy.
Within limits. Level Dialogue drops the room tone between phrases before any makeup gain, so the floor ends up lower. It's a gate, not a denoiser: the floor has to be close to passing already. For chapter-to-chapter consistency, Level chapters levels the whole book in one move. See the audiobook and editing workflows.
Edit mode has a full set, active only in Edit mode and listed in the Edit menu: ⌫ Cut, ⌘T Trim, ⌘F / ⌥⌘F fades, ⌃↑ / ⌃↓ gain, and more. The transport keys work everywhere. The complete map is in the keyboard reference.
Yes, in Edit mode: chain Audio Unit effects installed on your Mac, reorder, bypass, and open each plugin's own window while every meter tracks the processed sound. Render bakes the chain in as an undoable, latency-compensated edit; Render to Compare Slot sets up an A/B against the source. See the Edit mode guide.
Audio Units only (AUv2 and AUv3); VST and VST3 aren't loaded. Most macOS effect plugins install an AU alongside their other formats, and those show up in the Add browser, grouped by manufacturer. Instruments aren't listed, since the chain processes an existing file. AUv3 plugins run out-of-process, so a crash in one can't take Specula down.
Yes. Swift, AVAudioEngine, and Metal for the spectral canvas, not a web view in a desktop frame. Right-clicking audio in Finder gets three Services, Shortcuts and Spotlight get App Intents, and on macOS 26 the chrome is Liquid Glass, with an opt-out to solid chrome in Settings → Layout.
Yes, in Spectral mode (⌘5): draw around the blemish on the zoomable spectrogram with the rectangle, lasso, brush, or wand, then Attenuate, Erase, or Repair it. Space, ⇧Space, and ⌥Space audition the span, the selection alone, and the result before you commit, and everything outside the selection stays untouched. See the spectral repair workflow.
Record mode captures from your input device, so macOS shows its standard permission prompt on first entry (⌘6). Takes are written to your Mac and nowhere else; analysis runs on-device, and the app's only outbound connections (update checks, license validation) carry no audio. Unsaved takes sit in ~/Library/Application Support/Specula/Recordings for seven days. See the privacy policy.
Yes: the Signal Generator (⌘G) builds band-limited tones, white / pink / brown noise, impulses, sweeps, and silence, stacked or sequenced per channel, and writes WAV, AIFF, or CAF, or loads the result straight into the main window. The same generator runs as specula generate, with a --spec-file JSON form for layered multichannel signals. See the Signal generator guide.
Yes: set up the routing in the Output window, then Render to File… writes the routed result to a new file with every gain, polarity, and Pro Logic II phase applied, and only the outputs you've routed (a 5.1 → stereo fold makes a 2-channel file). One honest note: the CLI's edit subcommand doesn't expose routing render; that's app-only. See the surround workflow.
--gain -3 get rejected by the CLI; why?A bare leading - parses as an option name, so pass any negative numeric in the --option=value form: --gain=-3, --normalize-lufs=-14. Positive values work either way.
Email hello@headroomstudio.dev, or use Help → Send Feedback in the app; both land in the same inbox.
Before you send it
Specula doesn't replace your DAW, your mastering chain, or your ears. It catches what they miss: the hidden phase issue, the half-dB true-peak overshoot, the dialog mix three LU off Netflix's target. Load the file, read the numbers, then send it.
Take the long way through the user guide if you're new to loudness gating, or skim the keyboard reference if you just want to drive it.