Keep Finishing Audio at 48 kHz
Resample every 44.1 kHz generate on ingest, use a real anti-alias filter, and keep the project at 48 kHz / 24-bit so export does not click.
Image-to-video and text-to-speech tools still hand back 44.1 kHz as if the file were going onto a compact disc. Drop that clip on a video timeline, add a 48 kHz voiceover, export, and the last frame of the sequence clicks. The picture is fine. The click is a sample-rate fight that happened at the bounce, not a bad take.
Video finishing is 48 kHz. YouTube's upload encoding lists 48 kHz for AAC, Opus, or Eclipsa Audio. Netflix's sound-mix specification requires 48 kHz / 24-bit for original-language mixes, stems, and printmasters. Instagram's Graph API Reel spec caps audio at 48 kHz. Compact-disc 44.1 kHz is a music-delivery rate. It is not a video-project rate. The rule that survives a mixed generate stack is: the session is 48 kHz / 24-bit, every inbound file is converted once on the way in, and the export never sees two clocks.
Why 48 kHz is the video clock
A frame of picture has to contain a whole number of audio samples, or the edit is fighting the bounce on every cut. At 48 kHz the arithmetic is clean against the rates you actually use:
| Frame rate | Samples per frame at 48 kHz | Samples per frame at 44.1 kHz |
|---|---|---|
| 24 fps | 2,000 | 1,837.5 |
| 25 fps | 1,920 | 1,764 |
| 30 fps | 1,600 | 1,470 |
Versely timelines default to 25 fps, so a 48 kHz track is 1,920 samples per frame, every frame. 44.1 kHz at 24 fps is 1,837.5 samples per frame: not an integer. A cut that is picture-accurate is then half a sample off on the audio, and the converter at export has to invent or drop that remainder. That remainder is the click.
25 fps at 44.1 kHz happens to be an integer (1,764). That is luck, not a reason to keep 44.1 in the project. The moment you conform a 24 fps generate onto the 25 fps sequence (the arithmetic is elsewhere), or you add a 48 kHz bed under a 44.1 kHz text-to-speech read, the luck is gone.
24-bit is the other half of the rule. Netflix specifies 24-bit for original-language mix and M&E. Finishing at 24-bit leaves headroom for EQ, limiting, and a true-peak pass without burying the signal in 16-bit truncation. Dither to 16-bit only if a destination still asks for it, and only on the last bounce. Do not dither on ingest.
Why mixed rates click on the last frame
The click is almost never "the encoder is broken." It is one of three things, and they stack.
1. Two clocks in one sequence. Premiere, Resolve, and most NLEs will accept a 44.1 kHz clip on a 48 kHz sequence. They resample at playback and again at export. Each clip's converter has a filter delay. At the last frame of the sequence, or at a hard cut between a 44.1 generate and a 48 kHz voiceover, that delay does not have another buffer of input to flush, so you get a step, a pop, or a one-sample spike. Sample-peak meters often miss it. You hear it on a phone speaker, which is how it ships.
2. Fractional samples per frame. 44.1 kHz at 24 fps cannot land a whole number of samples on a frame boundary. A trim that is picture-locked is audio-unlocked by half a sample. The bounce rounds. The round is a discontinuity.
3. A cheap resampler. Linear interpolation does not anti-alias. 48 → 44.1 needs a low-pass below 22.05 kHz before you decimate, or the extra energy folds back as grit. 44.1 → 48 needs a reconstruction filter, or a poor interpolator images extra tones. Either artefact is easy to miss in headphones and obvious as a click or a fizz at a cut.
Image-to-video clips and text-to-speech reads are the two usual offenders, because those pipelines inherit music-tool defaults (44.1) or a model's own training rate rather than a broadcast session rate. Native-audio video is not safe either until you have measured it. Do not assume 48 kHz because the container is MP4.
Check before you import:
ffprobe -v error -select_streams a:0 \
-show_entries stream=sample_rate,bits_per_raw_sample,channels,codec_name \
-of default=nw=1 generated.mp4
If sample_rate is 44100, 22050, or 16000, that file does not enter the sequence. It enters an ingest folder.
Resample once, with a real filter
The conversion is a one-way door: 44.1 → 48 on the way in, never 48 → 44.1 in the middle of an edit, and never a second conversion at export. Use a converter that names its filter. SoX rate -v, ffmpeg aresample with the SoX resampler, and the SRC in Pro Tools / RX are the ones that belong on ingest. The NLE's silent "conform this clip" is the one that does not.
ffmpeg, 44.1 kHz 16-bit in, 48 kHz 24-bit wav out:
ffmpeg -i tts.wav -af "aresample=resampler=soxr:precision=28:osf=s32" \
-ar 48000 -c:a pcm_s24le tts_48k24.wav
precision=28 is SoX very-high quality. osf=s32 keeps the intermediate at 32-bit so the 24-bit write is a truncation of a clean upsample, not of a 16-bit file that was already noisy. For a video generate that also needs picture copied:
ffmpeg -i generated.mp4 \
-c:v copy \
-af "aresample=resampler=soxr:precision=28" \
-ar 48000 -c:a aac -b:a 192k \
generated_48k.mp4
Picture stream-copied, audio resampled once. If you are also rewriting GOP for an edit master, do the audio resample in that transcode so the file is touched once.
Two filter facts worth keeping, because they are the ones people skip:
- Downsampling (48 → 44.1, if a destination still wants CD-rate) requires an anti-alias low-pass below 22.05 kHz before decimation. A proper SRC does this. A "change sample rate" slider that just drops samples does not. You should not be downsampling inside a video project at all.
- Upsampling (44.1 → 48) requires a reconstruction / anti-imaging filter. That is interpolation, not aliasing, but a cheap interpolator still adds images above the original Nyquist. SoX linear-phase is the default you want for picture work: the delay is constant, so lip sync does not wander along the clip. Minimum-phase SRC is for music mastering where you care about pre-ring; it is the wrong default against a speaking face.
Do not use asetrate. asetrate changes the clock and the pitch together. A 44.1 file played as 48 is 8.8% fast and about a semitone and a half sharp. That is how a voiceover that was fine in isolation lands "off" against picture, and it is not a sample-rate conversion.
The project-wide 48 kHz / 24-bit rule
Write this at the top of the session template and do not make exceptions for "it's only a nine-second ad."
- Sequence / session: 48 kHz, 24-bit, 25 fps (or whatever single frame rate you picked; do not mix). Audio clock and picture clock are set before the first import.
- Ingest folder, not the bin. Every generate, every voiceover bounce, every music bed lands in
_raw_audioand is measured. 44.1, 22.05, 16 kHz, and mystery rates go through the SoX resample above. 48 kHz 16-bit is promoted to 24-bit without a rate change. - One 48 kHz / 24-bit WAV (or 48 kHz AAC inside a closed-GOP MP4) enters the sequence. Replacing a video's audio after the fact is fine, as long as the replacement is already 48 kHz. Mixing a 44.1 TTS file onto a 48 kHz picture in one step is how the click gets baked in.
- Export at 48 kHz. Do not "match source" if source still contains a 44.1 clip you forgot. Match the sequence. AAC-LC, 48 kHz, stereo is the social delivery pairing; 48 kHz 24-bit WAV is the master you keep.
If you assemble inside Versely rather than an NLE, generate the read, resample if the bounce is 44.1, then attach. The editor's 480p preview pass is free, with a short per-user cooldown, and the final export is charged once. Preview is how you hear a mix; it is not how you change a sample rate.
A last-frame click that survives this rule is a fade or true-peak problem, not a clock problem. Fade the last 5–10 ms if the generate ends on a non-zero sample. Fix that on the WAV, not with another resample.
FAQ
The TTS file is 44.1 kHz and the picture is already edited. Can I convert on export?
You can, and that is how the click got into the last round. Convert the TTS to 48 kHz / 24-bit, replace the audio, export again. A single export-time SRC across a mixed sequence is the path that fails at the tail. One inbound conversion is cheaper than a recut.
Does 48 kHz sound better than 44.1 kHz?
Not in the way people mean. You cannot hear 24 kHz. You can hear a bad resample, a fractional-sample cut, and a last-frame discontinuity. 48 kHz is the rate that divides by 24, 25, and 30. That is the reason, not an airy top end.
What about 96 kHz production files?
Keep them at 96 until they enter this picture session, then SRC to 48 kHz / 24-bit on ingest, once, with the same SoX-class filter. Do not run a 96 kHz voice against 48 kHz picture "because it is higher quality." You have just invented a mixed-rate sequence. 96 kHz belongs in a sound-for-picture DAW that will bounce 48 kHz stems into the NLE.
Instagram says 48 kHz max. Is 44.1 safer?
No. "Max 48 kHz" is a ceiling, not a preference for 44.1. 48 kHz is inside the envelope. 44.1 is also inside it, and it is the rate that will fight your 25 fps timeline. Deliver 48.