Talking Head Audio Cleaner

Shorts audio

by timscheuerai · MIT license · ★ 37 on GitHub

Shorts audio cover

Clean the audio on a talking-head recording without making it sound processed — constant-gain loudness, rumble removal, and when (not) to denoise. Use when recording audio sounds weird, artificial, pumping, quiet, or noisy, or when…

---
name: shorts-audio
description: Clean the audio on a talking-head recording without making it sound processed — constant-gain loudness, rumble removal, and when (not) to denoise. Use when recording audio sounds weird, artificial, pumping, quiet, or noisy, or when asked to denoise or normalize a video's audio.
---

# shorts-audio

Stage 2 of shorts-edit. **Two traps, both silent, both cost hours.**

Quiet recordings cause both. The reference takes sat at **−43 LUFS** and needed **+26 dB**.

---

## TRAP A: `loudnorm` silently pumps

`loudnorm` with `linear=true` promises a single constant gain.

**It abandons that promise without warning** whenever the required gain would push the true

Overview

Stage 2 of shorts-edit. Two traps, both silent, both cost hours.

Manual install (npx, ZIP)
Claude Codenpx skills add timscheuerai/content-vault --skill shorts-audio -g -a claude-code
Claude Code (degit)npx degit timscheuerai/content-vault/skills/shorts-audio#main ~/.claude/skills/shorts-audio
Claude.ai / desktopZip the folder and upload it under Settings → Capabilities → Skills.
Codex, Cursor, other agentsPoint them at SKILL.md. The other files are plain text.

Connects with Agent Alley MCP · agentalley.io/mcp

Files included

  • SKILL.md4.1 KB
Read SKILL.md here
timscheuerai/main1 file shown
SKILL.md
Show the full text93 lines

shorts-audio

Stage 2 of shorts-edit. Two traps, both silent, both cost hours.

Quiet recordings cause both. The reference takes sat at −43 LUFS and needed +26 dB.


TRAP A: loudnorm silently pumps

loudnorm with linear=true promises a single constant gain.

It abandons that promise without warning whenever the required gain would push the true peak past the ceiling — which +26 dB always does. It falls back to dynamic mode: per-frame gain riding. Pumping, breathing, a squashed unnatural tone.

This — not the denoiser — was the actual cause of "the audio sounds artificial". Removing the denoiser alone did not fix it, which is exactly why it cost so much time.

Fix: never use loudnorm for gain. Measure the true peak, apply ONE constant volume=XdB that lands it at −1.5 dBTP, and accept whatever LUFS falls out.

Verified pure: correlation 0.999975 with the source waveform, residual 43 dB down (just AAC noise), no limiter ever engaged. Mathematically, the output is the input times a number.


TRAP B: every denoiser reconstructs the voice, and you can hear it

afftdn with tn=1 (blind tracking) guesses the noise spectrum moment to moment. Guessing wrong is precisely what makes musical burbling.

Learning the profile from real silence in the take is far better — asendcmd … sn start/stop around the longest silence:

chain noise reduction speech level
highpass 60Hz only 11.2 dB −0.1 dB
RNNoise (arnndn) 17.6 dB −0.1 dB
learned print, nr=12 23.0 dB −0.1 dB

And it still didn't ship. On headphones, every spectral denoiser — blind, learned, even a 50/50 wet/dry blend — was audible as an unnatural tone, because they all reconstruct the signal rather than merely attenuating it. The user listened to all of them and chose the honest one.

SHIPPED: no denoiser. highpass=f=60 + a constant gain. Nothing else.

If a genuinely noisy take needs help, print12@50 (a 50% blend) was the best compromise.


Two ordering rules that silently defeat the filters

  1. The denoiser must run BEFORE the trims. Its asendcmd timestamps point at silence in the ORIGINAL take, and the edit throws that silence away. Applied after the cut, the sample window falls outside the clip, the command never fires, and afftdn quietly reverts to blind mode — the exact thing that sounded fake. The floor betrays it: −54 dB (blind) vs −64.8 dB (learned).

  2. Gain must precede ANY denoiser. RNNoise is trained on speech at normal levels. Fed −68 dBFS audio it sees silence and does literally nothing (measured: 0 dB of extra reduction). Gain it first and the same filter removes 23 dB.


What did NOT work

  • A noise gate. Intuitive — mute the gaps — and useless: after the edit the cut is 96% speech. There are no gaps left to gate. The audible noise is under the voice.
  • Notch filters. The noise looked like 60Hz mains harmonics at coarse FFT resolution. At fine resolution it isn't: 69% of the voice-band noise is broadband room tone. Notching mangled the voice (correlation 0.77) to buy 3 dB.

The mono-SFX clipping trap

amix negotiates a common channel layout. A mono SFX bed makes it pick mono, which silently downmixes the stereo voice — and that downmix pushed the peak from −1.62 dB to +0.83 dB (clipping). Pin aformat=channel_layouts=stereo on both sides of the mix.

Known tradeoff: the clips are quiet (−18 to −23 LUFS)

Peak-normalizing with no limiting and no compression lands below the −14/−16 social norm. That is the honest ceiling for zero dynamics processing; getting louder means compressing, which is what was rejected. Platforms normalize on playback.

The real fix is at the source: raise the input gain when recording.

1---
2name: shorts-audio
3description: Clean the audio on a talking-head recording without making it sound processed — constant-gain loudness, rumble removal, and when (not) to denoise. Use when recording audio sounds weird, artificial, pumping, quiet, or noisy, or when asked to denoise or normalize a video's audio.
4---
5 
6# shorts-audio
7 
8Stage 2 of shorts-edit. **Two traps, both silent, both cost hours.**
9 
10Quiet recordings cause both. The reference takes sat at **−43 LUFS** and needed **+26 dB**.
11 
12---
13 
14## TRAP A: `loudnorm` silently pumps
15 
16`loudnorm` with `linear=true` promises a single constant gain.
17 
18**It abandons that promise without warning** whenever the required gain would push the true
19peak past the ceiling — which +26 dB always does. It falls back to *dynamic* mode: per-frame
20gain riding. Pumping, breathing, a squashed unnatural tone.
21 
22**This — not the denoiser — was the actual cause of "the audio sounds artificial".**
23Removing the denoiser alone did not fix it, which is exactly why it cost so much time.
24 
25**Fix: never use `loudnorm` for gain.** Measure the true peak, apply ONE constant
26`volume=XdB` that lands it at −1.5 dBTP, and accept whatever LUFS falls out.
27 
28Verified pure: **correlation 0.999975** with the source waveform, residual 43 dB down (just
29AAC noise), no limiter ever engaged. Mathematically, the output is the input times a number.
30 
31---
32 
33## TRAP B: every denoiser reconstructs the voice, and you can hear it
34 
35`afftdn` with `tn=1` (blind tracking) *guesses* the noise spectrum moment to moment.
36Guessing wrong is precisely what makes musical burbling.
37 
38Learning the profile from real silence in the take is **far** better — `asendcmd … sn
39start/stop` around the longest silence:
40 
41| chain | noise reduction | speech level |
42|---|---|---|
43| highpass 60Hz only | 11.2 dB | −0.1 dB |
44| RNNoise (arnndn) | 17.6 dB | −0.1 dB |
45| **learned print, nr=12** | **23.0 dB** | **−0.1 dB** |
46 
47**And it still didn't ship.** On headphones, every spectral denoiser — blind, learned, even
48a 50/50 wet/dry blend — was audible as an unnatural tone, because they all *reconstruct* the
49signal rather than merely attenuating it. The user listened to all of them and chose the
50honest one.
51 
52> **SHIPPED: no denoiser. `highpass=f=60` + a constant gain. Nothing else.**
53 
54If a genuinely noisy take needs help, `print12@50` (a 50% blend) was the best compromise.
55 
56---
57 
58## Two ordering rules that silently defeat the filters
59 
601. **The denoiser must run BEFORE the trims.** Its `asendcmd` timestamps point at silence
61 in the ORIGINAL take, and the edit throws that silence away. Applied after the cut, the
62 sample window falls outside the clip, the command never fires, and afftdn **quietly
63 reverts to blind mode** — the exact thing that sounded fake. The floor betrays it:
64 −54 dB (blind) vs −64.8 dB (learned).
65 
662. **Gain must precede ANY denoiser.** RNNoise is trained on speech at normal levels. Fed
67 −68 dBFS audio it sees silence and does **literally nothing** (measured: 0 dB of extra
68 reduction). Gain it first and the same filter removes 23 dB.
69 
70---
71 
72## What did NOT work
73 
74- **A noise gate.** Intuitive — mute the gaps — and useless: after the edit the cut is
75 **96% speech**. There are no gaps left to gate. The audible noise is *under* the voice.
76- **Notch filters.** The noise looked like 60Hz mains harmonics at coarse FFT resolution.
77 At fine resolution it isn't: **69% of the voice-band noise is broadband** room tone.
78 Notching mangled the voice (correlation 0.77) to buy 3 dB.
79 
80## The mono-SFX clipping trap
81 
82`amix` negotiates a common channel layout. A **mono** SFX bed makes it pick mono, which
83silently downmixes the stereo voice — and that downmix pushed the peak from −1.62 dB to
84**+0.83 dB (clipping)**. Pin `aformat=channel_layouts=stereo` on **both** sides of the mix.
85 
86## Known tradeoff: the clips are quiet (−18 to −23 LUFS)
87 
88Peak-normalizing with **no limiting and no compression** lands below the −14/−16 social
89norm. That is the honest ceiling for zero dynamics processing; getting louder means
90compressing, which is what was rejected. Platforms normalize on playback.
91 
92The real fix is at the source: **raise the input gain when recording.**
93 
View all files on GitHub →

Details

License
MIT
Stars on the repo
★ 37
Checked
Source
timscheuerai/content-vault ↗
Creator
timscheuerai · 15 listings
View creator

Similar skills

See all →

More from timscheuerai

SkillLaunch Video Creatortimscheuerai/content-vault · by timscheueraiBuild a 30-60s motion-graphics launch video for a <YOUR_BRAND> product or feature. Remotion 4 React composition + ElevenLabs AI narration + sound effects + background music, beat-anchored timing, brand-aligned design system. Use when asked to "create a launch video", "make a product video", "video for X feature", "launch a new feature", or "/launch-video".★ 37 GitHub starsSkillLinkedIn Voice Copywritertimscheuerai/content-vault · by timscheueraiDraft LinkedIn posts in YOUR voice. Pulls hook frameworks, structural patterns, and CTA shapes from your real top-performing posts (corpus.md), runs the draft through a strict AI-slop blacklist, and outputs a post that reads like you wrote it. Use when asked to "write a linkedin post", "draft a post about X", "linkedin copy", "post idea", or "/linkedin-copywriter".★ 37 GitHub starsSkillLong-Form Draftertimscheuerai/content-vault · by timscheueraiDraft written long-form content (newsletter issue, blog post, Substack issue) in your voice. 800-2000 words, structured intro + body + CTA, paragraph-by-paragraph not list-by-list. Pulls voice from /linkedin-copywriter's corpus (same author, same register · longer arc). Runs the brand-doc skill checklist before output. Logs the row in the Notion Content DB and (for newsletters) drafts a separate punchy subject line. Use when asked to "write a newsletter", "draft a blog post", "long-form X", "Substack issue about Y", "weekly newsletter", or "/long-form". For spoken video scripts (YouTube longs / shorts) use /youtube-script instead · the cadence is fundamentally different.★ 37 GitHub starsSkillMathematical Animation Pipelinetimscheuerai/content-vault · by timscheueraiProduction pipeline for mathematical and technical animations using Manim Community Edition. Creates 3Blue1Brown-style explainer videos, algorithm visualizations, equation derivations, architecture diagrams, and data stories. Use when users request: animated explanations, math animations, concept visualizations, algorithm walkthroughs, technical explainers, 3Blue1Brown style videos, or any programmatic animation with geometric/mathematical content.★ 37 GitHub starsSkillContent Repurposertimscheuerai/content-vault · by timscheueraiTake one master content piece (Notion row, transcript, video, paragraph, URL) and spin off variants across channels. Hub-and-spoke repurposing engine. Reads the source, identifies key insights / hooks / quotable moments, then creates child rows in the Notion Content DB with drafts already written by calling sub-skills (linkedin-copywriter, x-copywriter, lead-magnet-creator, etc.). Use when asked to "repurpose this", "spin off variants", "turn this into LinkedIn + X + ...", "make derivatives of this webinar / video / post", or "/repurpose".★ 37 GitHub starsSkillContent Idea Pipelinetimscheuerai/content-vault · by timscheueraiThe single idea-generation pipeline for marketing content. Three input modes converging on Notion Status=Idea rows. Trend scan (X + LinkedIn creators + topic search) finds what's hot in the world. Performance scan (your own published rows + their engagement metrics) finds what's working for you so you can double down. Customer scan (HUMAN NOTES DB user-interview transcripts) finds the words, pains, and themes from real customer conversations. Hybrid mode runs all three, dedupes, and outputs a balanced backlog. Use when asked to "find content ideas", "what's working", "what's hot", "what are customers saying", "research", "scan trends", "give me ideas for the week", "/researcher", or proactively when the Notion Idea queue is empty.★ 37 GitHub stars