C.W.K.
Stream
Lesson 10 of 10 · published

Podcast & TTS Post-Processing

~12 min · podcast, tts, elevenlabs, production

Level 0Viewer
0 XP0/73 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

The full chain

For TTS clips (ElevenLabs, OpenAI, Google) and casual podcasts, the standard chain is:

  1. Trim leading/trailing silence (silenceremove).
  2. Highpass at 80 Hz to kill rumble.
  3. Light denoise (afftdn=nf=-20).
  4. De-essing if needed (equalizer=f=6000:t=q:w=2:g=-3 for bright TTS voices).
  5. Compression (smoothes dynamics — compand or acompressor).
  6. Loudness normalize to -16 LUFS (two-pass loudnorm).
  7. Encode to AAC 192 kbps or Opus 128 kbps.

This is what the cwkPippa tts_normalize.py service runs on every Pippa voice clip before hitting the WebUI player. The order matters — denoise after highpass, normalize last.

Code

Full TTS post-process in one command·bash
# Trim → HP → denoise → light compress → loudnorm → AAC
ffmpeg -i pippa_raw.wav \
  -af "silenceremove=start_periods=1:start_silence=0.1:start_threshold=-40dB:detection=peak,areverse,silenceremove=start_periods=1:start_silence=0.1:start_threshold=-40dB:detection=peak,areverse,highpass=f=80,afftdn=nf=-20,acompressor=threshold=-18dB:ratio=3:attack=20:release=200,loudnorm=I=-16:TP=-1:LRA=11" \
  -ar 48000 -c:a aac -b:a 192k \
  pippa_clean.m4a
Podcast episode chain (slightly different — preserve voice dynamics)·bash
# Two-pass loudnorm for accuracy. Pass 1:
ffmpeg -i raw.wav -af \
  "highpass=f=80,afftdn=nf=-22,acompressor=threshold=-20dB:ratio=2.5:attack=15:release=250,loudnorm=I=-16:TP=-1:LRA=11:print_format=json" \
  -f null - 2> measure.txt

# Extract values from measure.txt and use in pass 2
ffmpeg -i raw.wav -af \
  "highpass=f=80,afftdn=nf=-22,acompressor=threshold=-20dB:ratio=2.5:attack=15:release=250,loudnorm=I=-16:TP=-1:LRA=11:measured_I=-19.50:measured_TP=-3.20:measured_LRA=8.00:measured_thresh=-29.50:offset=0:linear=true" \
  -ar 48000 -c:a aac -b:a 192k episode_clean.m4a

External links

Exercise

Generate a 30-second TTS clip (ElevenLabs, OpenAI, or browser web speech). Run the full TTS chain above. Compare to the raw output: (a) loudness with loudnorm measurement, (b) listen on headphones — sibilants better? Background hiss gone? Then try the same chain on a noisy phone-recorded voice memo and see if it stretches to that source too.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.