Version 1.4.1
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.4
A song opens with its key and tempo, its sections and their loudness under the ruler, a bars ruler, beat snapping, and the vocal measured against the bed in LU.
On the timeline. Apple's on-device music analysis runs in the background after the file loads, about 0.6 seconds per minute of audio. Once it has found a song, the sidebar's File section reads the key and the tempo, a band under the waveform's ruler shows the song's sections with each section's integrated LUFS (red when a section sits outside the chapter deviation threshold from the song's median), the ruler's mode button gains a bars setting, the transport reads the bar and beat under the playhead, and a SNAP chip in the control strip lands selection edges on the nearest beat or bar. A click on a section selects it.
Stem-gated loudness. The sidebar's Loudness section gains a Stem-Gated block: integrated LUFS over the blocks where the vocal is present, over the bed without it, and their difference in LU, then the same three readings for drums, all Specula's own BS.1770-4 integrated measurement gated by Apple's stem presence spans. A side with less than 10 seconds of audio reads "-". A Sections block next to it lists the loudest and quietest sections and their spread.
Music module (⌃7). The detail view. Four stem lanes, Vocal, Drums, Bass, and Other, mark where each stem is present and how active it is over time. Above them sit the beat and bar grid, the song's sections, segments, and phrases as labelled bands and ticks, and Apple's pace figure per section. Click or drag on the module to place the playhead; scroll zooms the time axis with the other sections. Music analysis guide →
Section loudness map. Chapter mode takes its chapters from the song's sections, one per section tiling the whole file, and Analyse Loudness then reads integrated LUFS, true peak, RMS, LRA, and the deviation from the song's median for every section, in the chapter report and CSV as well.
Any file up to 15 minutes (a limit you can change) is analysed after it loads, in every Mode, and longer files are left alone until you ask; Settings → FFT / Analysis → Run music analysis chooses Songs, Every file, or Never, and View → Analyse Music runs it by hand. A key found means the file is a song: the Music module opens on its own, and if the Mode is not Music the sidebar offers a one-click switch. Nothing is uploaded. The JSON report carries the full result under musicAnalysis and the stem-gated readings under stemGatedLoudness, the PDF and HTML reports get a Music summary, and the CSV export gets Key and Tempo rows.
The analysis is Apple's Music Understanding framework and is labelled as Apple's analysis throughout; the loudness figures stay Specula's own BS.1770-4 measurement. It needs macOS 27. On earlier systems the timeline stays as it is and the module and its menu items are absent; everything else in Specula runs on macOS 14 and later.
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, saved as a new file by default, or over the original once you allow it.
→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.
Send any channel to any output, with per-route gain and phase, 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.
By default no: Save As (⇧⌘S) writes a new file and refuses the loaded file's path, so the source you opened stays as it was. Settings → Editing → Allow Save to overwrite the original file adds Save (⌘S), which replaces the loaded WAV, AIFF, or CAF with the edited audio and keeps its bit depth, sample rate, channel layout, and container: the format is read from the file's header, so a WAV called .WAV or .bwf is written back as a WAV. The new data is written to a temporary file and swapped in only once complete, so a failed save leaves the original untouched, and Specula asks before each overwrite until you tick "Don't ask again". Compressed files and raw PCM still save as a new file, and metadata chunks (BWF, iXML, cue points, markers) are not carried over. Details in the user guide.
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, phase, and ±90° shift 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 flexible monitoring 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.
Music analysis needs macOS 27. It runs Apple's Music Understanding framework, which exists on macOS 27 and later only, so on earlier systems the toggle bar has no Music button, the View → Analyse Music items are disabled, and a song loads without the Key and Tempo rows, the section band under the ruler, the bars ruler, and the SNAP chip. Everything else in Specula runs on macOS 14 and later. The framework is Apple's and runs on the Mac; no audio is uploaded, and the specula command-line tool does not run it.
Apple's model separates the file into exactly four stems: Vocal, Drums, Bass, and Other. It is a stem split, not an instrument list, so a trumpet, a synth pad, and a string section all land in Other. On speech and other non-musical material the model still returns a beat grid and a structure, and they are not meaningful: on the same speech file two runs gave 84 and 101 BPM. It also finds no key on such material, so when no key is detected the module hides the beat and pace rows, dims the tempo, and marks the structure as unreliable. The stem lanes stay useful; speech lights the Vocal lane and nothing else. Details in the Music analysis guide.
The difference, in LU, between two integrated loudness readings: one over the file's blocks where Apple's analysis marks the vocal as present, one over the bed without it. Both are Specula's own BS.1770-4 integrated measurement over the file's 100 ms blocks, gated by the stem's presence spans, so the vocal-present figure is the Integrated reading over exactly those blocks. A positive balance means the vocal sections run louder than the bed. Either side needs at least 10 seconds of audio above the absolute gate, otherwise it reads "-"; a song with drums throughout has no "No drums" reading for that reason. The same three numbers exist for drums, and the JSON report carries all of them under stemGatedLoudness, kept apart from Apple's musicAnalysis block. Details in the Music analysis guide.
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.