Specula app icon

Workflow · Batch QC & automation

Score a folder unattended, same numbers as the app.

Checking files one at a time in the app works until there are dozens of them. The specula CLI and eight App Intents run the exact measurement engine the app uses: same integrated LUFS, same 4× oversampled true peak, same speech-gated reading, so a script walking a directory produces numbers identical to the window. Output is pretty-printed JSON with sorted keys, so a diff across two runs shows what actually changed, not key reordering.

macOS specula CLI 8 App Intents Finder Services Deterministic JSON

7-day trial · one-time purchase · macOS 14+

A Specula PDF report: headline loudness metrics, per-platform target verdicts, a loudness curve and per-channel stats.
One report, every number. Headline loudness, per-platform verdicts, and per-channel stats, as PDF or sorted-key JSON.

Why hand-checking doesn't scale

Opening, reading, and closing files by hand is fine for one master. For a folder of forty, you want the engine in a script.

The thing that makes the manual loop slow isn't the measurement, it's the file handling around it: open, wait, read off six numbers, note the failures, next file. Specula's answer is to expose the same loudness engine the window drives as a headless tool. The CLI, the App Intents, and the Finder Services all run one engine, so a batch pass and a hand check of the same file return the same integrated LUFS, true peak, and speech-gated reading. No second implementation to drift out of sync.

CLIFour subcommands: analyze / compare / edit / report, for shell scripts that walk a folder of files.
IntentsEight App Intents for Shortcuts and Siri, with chainable output a downstream step reads without parsing JSON.
ServicesThree Finder right-click Services: Analyze, Compare, Get Report, that work out of the box, nothing to build.

The workflow

Install once, then put the same numbers in a loop.

1 · Install the CLI
The CLI ships inside the app bundle: pick Specula → Install Command-Line Tool… and Specula links specula into /usr/local/bin (one admin prompt if that folder needs it); verify with specula --version. App updates keep the installed command current. The tool shares the app's license and trial: it runs through the 7-day trial and needs the license activated in the app after that. The four subcommands (analyze, compare, edit, report) run the same measurement engine the app uses, so the script gets the exact same numbers.
2 · Analyze in a loop
specula analyze <FILE> emits the headline numbers: integrated LUFS, true peak, sample peak, loudness range, speech-gated LUFS, stereo correlation, as JSON. Pass --no-vad to skip Silero (faster) or --no-stereo to skip the per-block correlation pass. Walk the folder, parse one field, flag the misses.
3 · Cut a receipt per file
specula report <FILE> runs the full report through the headless pipeline. --format json|html|pdf|csv selects the shape (PDF is the same dark-themed report the app's preview renders; PDF requires --out; CSV emits the per-chapter table, or a flat metric,value table when the file has no chapters). --mode music|podcast|vod|broadcast picks which loudness-target catalog evaluates the file; --no-curve drops the per-100 ms loudness curve for smaller batch output.
4 · Diff two versions
specula compare <A> <B> reports every metric side-by-side with B − A deltas. --match-loudness nets out the integrated-LUFS delta so the deltas surface spectral or shape differences instead of pure level drift; --out-diff <PATH> writes the A − gainB·B residual as a Float32 WAV and adds a residual block to the JSON. Sample rate and channel count must match, it refuses structural mismatches rather than resampling.

A one-chapter report straight to PDF, the same shape the app prints:

$

specula report ch01.wav --mode podcast --format pdf --out ch01.pdf

Every subcommand emits pretty-printed JSON with sorted keys, so diffs across runs stay deterministic, a changed number is the only thing that shows up. Silence reads as "-inf" rather than blowing up the encoder. Full command reference in the CLI section of the user guide.

No shell? Use the App Intents

Eight App Intents let the system Shortcuts app and Siri call the same engine the CLI does, no file-handling shell glue, output is chainable. Four core actions ship in two variants each, a file-input and a path-input, so they fit whichever Shortcuts workflow shape you have: Get Measurements, Compare Files, Get Compare Diff, and Get Report.

The returns are structured Shortcuts output you chain on directly. Get Measurements exposes every numeric field as a Shortcuts variable, so a downstream step can branch ("if Integrated LUFS > -12 then…") without parsing JSON. Compare Files returns both sides plus the B − A deltas; Get Compare Diff returns the residual WAV; Get Report returns the JSON / HTML / PDF file you can pipe straight into AirDrop, Save File, or Mail.

The (from Path) variants take the audio file as a text string instead of a File, so a clipboard-driven shortcut is just Get Clipboard → Get Report (from Path). They accept bare paths, paths with spaces, tildes, shell quotes, curly quotes from Notes/Mail, and percent-encoded file:// URLs, quotes stripped, tilde expanded automatically.

Spotlight phrases trigger them too: "Measure with Specula", "Compare files in Specula", "Get diff with Specula", "Build a report with Specula" (and their path-input siblings). The six measurement, compare, and report intents default to speech detection off, flip the toggle in the Shortcut step when you need speech-gated metrics. The two Get Compare Diff intents return a pure residual, so they carry no speech step.

For a right-click pass with nothing to configure, three Finder Services install automatically: Analyze in Specula, Compare in Specula, and Get Report from Specula. The report service runs headlessly: it analyses the file, builds the PDF, and drops it next to the source (falling back to ~/Downloads if the source directory isn't writable), then reveals it in Finder without ever popping a window.

One gotcha on the CLI side: negative numerics need the --option=value form. The CLI reads a bare leading - as an option name, so --gain -3 is rejected, write --gain=-3 (likewise --normalize-lufs=-14, --lufs-ceiling=-1). Positive numbers work in either form.

See it in Specula

A Shortcuts workflow using Specula's Get Measurements action with its chainable output.
Drive it from Shortcuts. App Intents return measurements you can chain into any automation.
The Finder right-click Services menu with Analyze in Specula, Compare in Specula and Get Report from Specula.
Right-click in Finder. Analyze, Compare, or Get Report run the same engine with nothing to configure.

Put the same engine in your pipeline

Specula is the same measurement engine whether you're reading one file in the window or scoring a folder from a Folder Action. The CLI both flags the misses and fixes the fixable ones in the same pass: specula edit in.wav --normalize-lufs=-16 --lufs-ceiling=-1 --out out.wav normalizes and caps a file unattended, so a Folder Action can correct what it flagged instead of handing you a list. What a gain can't fix it leaves alone: a noisy capture or a bad mix is still your job, with numbers you can diff across runs. See the editing workflow →