Workflow · Batch QC & automation
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 measurement engine the app uses: same integrated LUFS, same 4× oversampled true peak, same speech-gated reading. A script walking a directory gets numbers identical to the window, as pretty-printed JSON with sorted keys that diffs cleanly across runs.
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, from a single implementation.
analyze / compare / edit / generate / report, for shell scripts that walk a folder of files.Scripting it
Install once, then put the same numbers in a loop.
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 five subcommands (analyze, compare, edit, generate, report) run the same engine the app uses, so the script gets the exact same numbers.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.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.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.specula generate --out <OUT> synthesizes a test signal and writes it: one source per run (--sine, --square, --saw, --triangle, --noise white|pink|brown, --sweep START:END, --impulse, --silence) across N identical channels, with --sample-rate, --bit-depth 16|24|32f, and --container wav|aiff|caf. For layered or time-sequenced multichannel signals, pass a JSON spec with --spec-file; the stdout receipt reports the written format and the measured peak, RMS, and integrated LUFS. Same band-limited sources as the app's Signal Generator window.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, with output a downstream step can chain on. 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, 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.
Shortcuts and Finder
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. Anything beyond a level move 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 →