Skip to content

[Bug]: export of a clipped voice misses -16 LUFS and goes over -1 dBTP #1157

Closed

Description

@EtienneLescot

Summary

An MP4 export of a hot, clipped speech recording comes out quieter than the -16 LUFS target and over the -1 dBTP true-peak limit that the manual e2e checklist sets for exports.

Repro

  1. Take a speech recording whose source is clipped: here French speech at -17.6 LUFS integrated, sample peak +3.3 dBFS, true peak +4.9 dBTP.
  2. Edit it (7 trims, Audio facet at its default output level) and export MP4 1080p 30 fps.
  3. Measure the export with ffmpeg -af ebur128=peak=true+sample and astats.

Evidence (v2.1.0 candidate, build run 38252812147, macOS 26.5 arm64, results row in #1131)

integrated sample peak true peak
source -17.6 LUFS +3.3 dBFS +4.9 dBTP
export -17.3 LUFS -0.59 dBFS +0.5 dBTP

The export audio chain, run step by step on the same source and trims (crates/compositor/src/audio.rs):

stage integrated sample peak true peak
after the per-file loudness gain (+1.60 dB) -16.0 LUFS +4.85 dBFS
after finish_audio (limiter), before AAC -17.25 LUFS -1.50 dBFS +0.6 dBTP
same PCM through ffmpeg's aac at 128 kb/s -17.3 LUFS -0.5 dBFS +0.7 dBTP

So the normalisation is right, and the AAC encoder adds only about 0.1 dB of true peak. Both defects come from the limiter:

  1. It limits sample peaks, not true peaks. limit_peaks holds every sample under -1.5 dBFS, but on a clipped source the squared-off peaks reconstruct about 2 dB above the samples between them. The "-1.5 dBFS leaves half a decibel for the encoder" margin assumes about 0.5 dB of overshoot, and a clipped voice has four times that.
  2. Limiting costs loudness, and nothing gives it back. A voice brought to -16 LUFS with peaks 6 dB over the ceiling loses 1.25 LU to the limiter, so the file lands at -17.3 instead of about -16.

Expected

Integrated loudness about -16 LUFS, true peak at most -1 dBTP (checklist, Export section).

Actual

-17.3 LUFS, +0.5 dBTP.

Platform

All three: finish_audio is shared by the macOS, Windows and Linux export pipelines. Measured on macOS 26.5 arm64.

Activity

  1. EtienneLescot commented on Oct 12, 2026

    @EtienneLescot
    MemberAuthor

    Root cause and fix in #1166. On the loudness half, one finding changes the expectation for this particular voice.

    The limiter now holds the true peak (a 4x envelope) at -2 dBTP. The AAC encoder needs that margin: on a hard-limited voice it adds 1.3 dB of true peak at 128 kb/s, so the export moves to 256 kb/s, where it adds about 0.5 dB. A bounded makeup gain then gives back what the limiter took. Result on this source and its 7 trims: -17.2 LUFS, -1.6 dBTP (was -17.3, +0.5).

    -16 LUFS is not reachable for this voice without clipping it again. Its crests come every pitch period, so the ceiling holds the voiced passages at the ceiling minus the waveform's own crest factor (about 15 dB), whatever the gain. The limited programme reads -17.6 LUFS with no makeup, -17.1 with 3 dB, -16.9 with 6 dB and -16.7 with 12 dB. Past 3 dB, the makeup only raises pauses and room noise, so it stops there. A voice that is not clipped and only has a few hot transients lands on -16.0 (tested). The checklist line is updated to say that, for a voice clipped at the source, only the true peak is checked.

  2. added
    status: fixed in mainWork is merged into main but may not be in a downloadable release yet.
    status: pending releaseMerged change is waiting for a packaged desktop release.
    on Oct 12, 2026
  3. added this to the Next Release milestone on Oct 12, 2026
  4. github-actions commented on Oct 12, 2026

    @github-actions
    Contributor

    Fixed by #1166 and merged into main.

    This change is assigned to the Next Release release milestone and is not necessarily available in the latest downloadable desktop release yet. It is currently marked as status: pending release until a packaged release containing it is published.

  5. EtienneLescot commented on Oct 15, 2026

    @EtienneLescot
    MemberAuthor

    Moved into v2.1.0 as part of the pre-release cut.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: fixed in mainWork is merged into main but may not be in a downloadable release yet.status: pending releaseMerged change is waiting for a packaged desktop release.

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions