Delivery specs¶
A delivery spec is the rule set a deliverable has to meet: an integrated loudness target and tolerance, a true-peak ceiling, and optionally short-term and momentary maxima, a loudness-range ceiling, and dialogue gating. Audel treats specs as data. Grading reads only the spec object, so moving a deliverable from one platform to another never needs a code change.
Built-in specs¶
| Name | Integrated | Tolerance | True peak | Extra | Miss is |
|---|---|---|---|---|---|
ebu_r128 |
-23 LUFS | ±0.5 LU | -1 dBTP | rejected | |
ebu_r128_s1 |
-23 LUFS | ±0.5 LU | -1 dBTP | short-term ≤ -18 LUFS | rejected |
atsc_a85 |
-24 LKFS | ±2 LU | -2 dBTP | rejected | |
op59 |
-24 LKFS | ±1 LU | -2 dBTP | rejected | |
arib_tr_b32 |
-24 LKFS | ±1 LU | -1 dBTP | rejected | |
netflix |
-27 LKFS | ±2 LU | -2 dBTP | speech-gated | rejected |
spotify |
-14 LUFS | ±2 LU | -1 dBTP | music | advisory |
youtube |
-14 LUFS | ±2 LU | -1 dBTP | advisory | |
apple_music |
-16 LUFS | ±2 LU | -1 dBTP | music | advisory |
apple_podcasts |
-16 LUFS | ±1 LU | -1 dBTP | speech | advisory |
podcast |
-16 LUFS | ±2 LU | -1 dBTP | speech | advisory |
A rejected miss is graded error, so the verdict is fail. Broadcasters reject deliveries
that miss their loudness spec. An advisory miss is graded warning, because streaming
platforms normalize playback loudness themselves.
The values follow the published recommendations. Contracts often tighten them. When yours does, write a custom spec rather than relying on a built-in.
Use a spec¶
With no spec set, Audel grades exactly as 0.1 did. It uses the AUDEL_LOUDNESS_TARGET preset
with a ±2 LU advisory tolerance, and the report shows spec: "preset.podcast".
Custom specs¶
An operator spec is a JSON file. Unknown keys are rejected and every value is range-checked.
{
"name": "acme_tv",
"description": "ACME network delivery, 2026 contract",
"integrated_lufs": -24,
"tolerance_lu": 1,
"max_true_peak_dbtp": -2,
"max_short_term_lufs": -20,
"max_lra_lu": 15,
"gating": "program",
"strictness": "reject",
"content": "mixed"
}
Spec files are operator configuration
The CLI, the Python API and AUDEL_DELIVERY_SPEC accept a spec file path. The REST service and
the MCP server accept built-in names only, so a remote caller or an agent can never point
Audel at a file on the host.
Dialogue gating¶
Some specs measure loudness over speech only. Audel approximates dialogue gating in three steps. It finds speech with the Silero voice-activity detector bundled in faster-whisper, listening to every channel except LFE on its own, from one streamed decode high-passed at 100 Hz. A downmix would miss dialogue in some immersive channels, or in channels mixed in antiphase. A detected passage counts only where its channel is audible in the mix, within 20 dB of the loudest channel at that moment, so a voice buried under music elsewhere isn't taken for dialogue. It then computes BS.1770 integrated loudness from the main pass's own 400 ms loudness blocks, counting only blocks that lie entirely inside speech, with the standard absolute and relative gates. Then it grades that value against the target.
The finding records basis: "speech-gated" and dialogue_coverage, the fraction of the
programme that is speech. Confidence is medium. If no dialogue is detected (less than 0.4 s), or
the measurement fails, the grade says so (dialogue_unmeasured) and uses programme loudness.
Without the [asr] extra, Audel falls back to programme loudness and marks the finding low
confidence.
This is an approximation
Speech-gated loudness is not Dolby Dialogue Intelligence. When a contract requires a licensed dialogue-intelligence meter, use Audel as the pre-flight check and the licensed meter for sign-off.