You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug]: export of a clipped voice misses -16 LUFS and goes over -1 dBTP #1157
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
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.
Edit it (7 trims, Audio facet at its default output level) and export MP4 1080p 30 fps.
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:
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.
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.
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.
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.
Activity
EtienneLescot commentedon Oct 12, 2026
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.
fix(audio): hold the export's true peak under -1 dBTP
github-actions commentedon Oct 12, 2026
Fixed by #1166 and merged into
main.This change is assigned to the
Next Releaserelease milestone and is not necessarily available in the latest downloadable desktop release yet. It is currently marked asstatus: pending releaseuntil a packaged release containing it is published.EtienneLescot commentedon Oct 15, 2026
Moved into
v2.1.0as part of the pre-release cut.