Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Voice/audio cleanup step of the AI Video Editor pipeline — diagnose a video's background noise, pick the right denoise method, and produce a cleaned master (voice isolated, levels preserved, video stream copied). Use when the user wants to "clean the audio / voice", "remove background noise", "denoise", "isolate voice", fix outdoor/room/water/hum/hiss noise, run ElevenLabs Voice Isolator or local RNNoise, A/B denoise methods, or produce a cleaned master for a video-N in this repo. Covers diagnos
.claude/skills/hassancs91-clean-audio/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 24 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 116% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 76% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 37% | 0% |
Take a locked master cut and remove its background noise, producing a cleaned master whose voice sounds natural and whose visuals are untouched. Runs early (once the cut is locked) so everything downstream — TSX bake, SFX mix, final assemble — sits on the clean voice. Work with the user; the final loudness/limiting is the final-mix step's job, this step is "denoise only, levels preserved."
The engine is tools/clean_voice.py; this skill is the judgment around it: diagnose → pick method → A/B → clean → rewire.
| Method | What it is | Use when | Cost | |---|---|---|---| | --method eleven | ElevenLabs Voice Isolator (cloud ML voice/noise separation) | Dynamic, broadband noise in the voice band — outdoor running water, wind, traffic, crowd, cafe. Local tools CANNOT remove these. | ~1000 credits/min (~$1 for a 5.5-min video); needs ELEVENLABS_API_KEY | | --method rnnoise --model sh (or cb) | Local RNNoise via ffmpeg arnndn (models in tools/models/rnnoise/) | Stationary / mild noise (steady hiss, fan, some room tone). Free/offline. Only PARTIALLY removes dynamic noise. | free |
Proven on video-1 (shot outdoors with a stream): afftdn did ~nothing, RNNoise only partially darkened the water bed, ElevenLabs removed it near-completely (pauses to near-silence, voice + breaths intact). Rule of thumb: stationary noise → try local first; dynamic broadband (water/wind/traffic) → ElevenLabs.
videos/video-N/reference/<cut>.mp4 (or the locked cut). Original is NEVER modified;output is a new -clean / -clean-<model> file.
videos/video-N/output/video-N-preview.mp4, to make a cleanin-context preview by swapping audio (its video is identical — no re-bake needed).
videos/video-N/work/timeline.json — its master field; you rewire this to the clean master on approval.ffmpeg -i M -vn -af astats (RMS, peak, noise floor) + ebur128 (integrated LUFS, true peak).edited-transcript.json for the biggest inter-word gaps) and measurethe pure-noise RMS there vs speech RMS → the real SNR.
ffmpeg -i M -vn -lavfi showspectrumpic=s=1500x600:legend=1:scale=log out.png andLOOK at it. Hum = steady horizontal lines (50/60Hz) → notch. Rumble = low band → high-pass. Broadband bed that fills the voice band and fluctuates = dynamic (water/wind) → ElevenLabs. HF hiss = bright top band.
run each candidate method, level-match them to each other, and compare — by ear (the real test) AND by spectrogram (pauses going dark = noise removed) and residual level. Let the user pick.
python tools/clean_voice.py videos/video-N/reference/<cut>.mp4 --method <chosen> [--model sh]→ <cut>-clean.mp4 (or -clean-<model>.mp4). Video stream COPIED (fast, non-destructive, keeps 4K60).
it is gated and inflated by the removed noise, and over-boosts the voice into clipping. The clean file will read a lower integrated LUFS than the noisy original; that is expected (the noise was padding the number), the voice RMS is unchanged. Final loudness to -14 LUFS is the final-mix step's job.
composited preview — ffmpeg -i preview.mp4 -i <cut>-clean.mp4 -map 0:v -map 1:a -c:v copy -c:a aac -shortest preview-clean.mp4 (video identical, no re-bake). For a full A/B, also export FULL_*.mp3 scrub files.
timeline.json "master" at the clean file so every futurebake/mix uses the clean voice; re-bake the preview if needed.
the dead-silent gaps can feel vacuum-sealed. Offer to add back a low-level neutral ambience if wanted.
processed. Prefer the gentlest method that clears the noise; don't over-strip a clean track.
Local spectral/RNNoise can't separate dynamic broadband noise; that's ElevenLabs' job.
python tools/clean_voice.py IN.mp4 [--method eleven|rnnoise] [--model sh|cb] [-o OUT.mp4] [--no-preserve-loudness] [--keep]ffmpeg -i M -vn -af astats -f null - · ffmpeg -i M -vn -lavfi showspectrumpic=... out.png (then Read the png).tools/models/rnnoise/<model>.rnnn (sh, cb).Done = the noise is diagnosed, the method is chosen (A/B'd if needed), the full master is cleaned with levels preserved, the user has approved by ear, and — on approval — timeline.json points at the clean master. Update memory if a noise-type → method lesson emerges.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 7,607 | 20,724 | +172% | 1 | 1 | 0% | 418 | 2,337 | +459% | 0 | 0 | — |
case-02 | fail→fail | 41,482 | 18,428 | -56% | 1 | 1 | 0% | 6,345 | 2,241 | -65% | 0 | 0 | — |
case-03 | fail→fail | 13,488 | 20,382 | +51% | 1 | 1 | 0% | 342 | 2,403 | +603% | 0 | 0 | — |
case-04 | fail→fail | 13,608 | 17,656 | +30% | 1 | 1 | 0% | 1,628 | 2,071 | +27% | 0 | 0 | — |
case-05 | fail→fail | 22,194 | 11,814 | -47% | 1 | 1 | 0% | 2,690 | 2,023 | -25% | 0 | 0 | — |
case-06 | fail→fail | 23,302 | 15,473 | -34% | 1 | 1 | 0% | 3,269 | 2,069 | -37% | 0 | 0 | — |
case-07 | fail→pass | 17,018 | 34,354 | +102% | 1 | 1 | 0% | 2,926 | 6,310 | +116% | 0 | 0 | — |
case-08 | fail→pass | 16,528 | 13,390 | -19% | 1 | 1 | 0% | 1,472 | 2,934 | +99% | 0 | 0 | — |
case-09 | fail→pass | 16,388 | 11,592 | -29% | 1 | 1 | 0% | 1,592 | 2,801 | +76% | 0 | 0 | — |
case-10 | fail→pass | 15,193 | 8,666 | -43% | 1 | 1 | 0% | 1,518 | 2,304 | +52% | 0 | 0 | — |
case-11 | pass→pass | 17,125 | 12,639 | -26% | 1 | 1 | 0% | 1,651 | 2,714 | +64% | 0 | 0 | — |
case-12 | fail→fail | 13,133 | 10,521 | -20% | 1 | 1 | 0% | 1,124 | 2,369 | +111% | 0 | 0 | — |
case-13 | fail→pass | 22,187 | 30,872 | +39% | 1 | 1 | 0% | 2,639 | 3,628 | +37% | 0 | 0 | — |
case-14 | fail→pass | 12,614 | 13,620 | +8% | 1 | 1 | 0% | 2,016 | 3,043 | +51% | 0 | 0 | — |
case-15 | fail→pass | 9,803 | 19,088 | +95% | 1 | 1 | 0% | 1,724 | 2,468 | +43% | 0 | 0 | — |
case-16 | fail→fail | 16,952 | 8,968 | -47% | 1 | 1 | 0% | 1,793 | 2,337 | +30% | 0 | 0 | — |
case-17 | fail→pass | 14,137 | 9,338 | -34% | 1 | 1 | 0% | 2,016 | 2,312 | +15% | 0 | 0 | — |
case-18 | fail→pass | 10,267 | 9,563 | -7% | 1 | 1 | 0% | 1,511 | 2,375 | +57% | 0 | 0 | — |
case-19 | pass→pass | 15,328 | 9,219 | -40% | 1 | 1 | 0% | 2,009 | 2,229 | +11% | 0 | 0 | — |
case-20 | pass→pass | 17,444 | 7,176 | -59% | 1 | 1 | 0% | 2,056 | 2,797 | +36% | 0 | 0 | — |
case-21 | fail→pass | 13,734 | 8,038 | -41% | 1 | 1 | 0% | 2,249 | 2,166 | -4% | 0 | 0 | — |
case-22 | fail→pass | 17,879 | 7,550 | -58% | 1 | 1 | 0% | 2,181 | 2,052 | -6% | 0 | 0 | — |
case-23 | fail→pass | 11,026 | 18,182 | +65% | 1 | 1 | 0% | 1,619 | 2,193 | +35% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 17 counted toward the lift figure. The other 6 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +52 percentage points is the difference between those two pass rates over the 17 comparable cases. 4 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.