Voice isolate
Extracts clean voice samples from a video. Separates the vocal stem with Demucs, gets speech timecodes with faster-whisper, detects the recurring percussive "taka" SFX by its high-frequency signature in the accompaniment stem, drops the whole word under each detected SFX, and exports the remaining clean spoken phrases as individual sample clips plus a concatenated track. Use when the user gives a video and wants the narrator's voice isolated, clean voice samples for cloning/TTS, a voice-only audio track, background music/SFX removed from speech, or mentions "solo la voz", "aislar la voz", "voz limpia", "muestras de voz", "quitar SFX/música", "canal de voz", isolate/extract voice, voice samples, narrator voice, or vocal stem from a video or reel.From its SKILL.md
npx -y skills add puntorigen/avatar-skills --skill voice-isolateAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.6 KB, ~1.6k tokens by cl100k_base, as published. Nobody here has run it
Voice Isolate
Given a video, produce clean voice samples of the narrator: the recurring percussive SFX (a short broadband "taka"/"tk" that bleeds over the voice) is detected and the word it lands on is dropped, so the remaining phrases are clean. The goal is good-quality voice samples (for cloning/TTS), not preserving every word — contaminated words are discarded on purpose.
Pipeline
- ffmpeg extracts the audio from the video.
- Demucs (
htdemucs) splits it into the voice stem and the accompaniment stem (everything that is not voice: music + SFX). - faster-whisper transcribes on the clean voice stem → segments + per-word timecodes (more accurate than transcribing the original mix).
- Taka detection (auto): the SFX is a short broadband transient whose energy spikes in the high band (>5 kHz), while the voice body lives below ~4 kHz. In the accompaniment stem (voice already removed) those transients stand out. The HF energy envelope is peak-picked with an auto-relative threshold, so only prominent taka are flagged — not the near-silent floor.
- Word drop: each detected taka is expanded to the whole word(s) it overlaps and those words are removed from the speech.
- The remaining clean phrases (≥
--min-sample-len) are exported as individualsamples/sample_NNN.wavclips and as one concatenatedvoice_concat.
Requirements
ffmpegon PATH.- Python deps:
pip3 install -r requirements.txt(no librosa/torch beyond Demucs; detection usesscipy.signal). - torch and torchaudio MUST match versions (e.g.
torch==2.5.1+torchaudio==2.5.1). A mismatch makes torchaudio fail to load and Demucs cannot run. Fix withpip3 install "torchaudio==$(python3 -c 'import torch;print(torch.__version__.split("+")[0])')". - First Demucs run downloads model weights (~80MB), cached afterwards.
Quick start
Everything is automatic — taka removal and sample export are on by default:
python3 scripts/extract_voice.py <video> --mp3
- Output goes to
<video>_voice/next to the video (override with-o <dir>). - The deliverable is the
samples/folder (clean clips) plusvoice_concat.mp3(all clean phrases concatenated). accompaniment.wavis kept by default so re-runs can reuse the stems (Tuning).- Add
--language es(oren, …) to skip auto-detection.
Report the final stats printed by the script (taka detected, seconds removed,
number of clean samples) and the path to samples/ and voice_concat.mp3.
Outputs (in <video>_voice/)
| File | What it is |
|---|---|
samples/sample_NNN.wav / .mp3 | Main deliverable: each clean spoken phrase as an individual sample clip |
voice_concat.mp3 / .wav | All clean phrases concatenated (taka + their words removed) |
voice_gated.wav | Voice aligned to the original timeline (taka silenced in place) — with --mode both |
vocals_full.wav | Full Demucs voice stem (whole timeline) |
accompaniment.wav | Non-voice stem (where the taka is detected) |
voice.json | Language, segments, per-word timecodes, sfx_detection, sfx_intervals, kept intervals |
voice.srt | Narrator speech subtitles |
Auto-relative threshold (default, no per-video tuning)
The taka is sparse and sits over a near-silent high-frequency floor, so a fixed threshold — or a MAD-based one — collapses and over-triggers. Instead the threshold uses a robust upper spread of the accompaniment's >5 kHz envelope:
threshold = max(--sfx-min-abs, median + k · (p95 − median))
Only prominent peaks above it (with a minimum spacing) are taken as taka.
The script prints the computed threshold and count each run
(Umbral auto (taka >5000Hz): median … + k*(p95-median) … = …) and stores it in
voice.json (sfx_detection). This is fully per-video and needs no tuning.
Tuning (fast, no re-separation)
Re-running Demucs is the slow part. After a first run (accompaniment is saved by
default), use --reuse-stems to re-cut in ~5s from the saved
vocals_full.wav + accompaniment.wav + voice.json:
# More taka removed → lower k; keep more voice → raise k:
python3 scripts/extract_voice.py <video> --reuse-stems --mp3 --sfx-k 3
Key knobs:
--sfx-k(default4.0): sensitivity. Lower = more taka removed (cleaner remainder, less voice kept); higher = fewer.k≈4removes only the clear taka; drop to3/2if some are still audible, raise to5if too much is cut.--sfx-hf-hz(default5000): the high band where the taka lives. Lower it if the SFX is more midrange; the voice body is below ~4 kHz.--sfx-min-distance(default0.20): minimum spacing (s) between taka peaks.--sfx-half-width(default0.06): half-window (s) around each peak before snapping to the word.--min-sample-len(default0.4): drop clean chunks shorter than this (keeps only usable samples).--sfx-word-pad(default0.04): extra margin when expanding a peak to a word.--no-snap-words: cut exactly the peak instead of the whole word (may leave a half-word; usually not wanted for samples).--no-samples: skip the individual-clip export (keep only the concat).--no-remove-sfx: disable taka detection entirely (raw Demucs voice).
Notes / limitations
- Demucs isolates all vocals, not a specific speaker. With multiple speakers, all voices stay in the stem (no diarization).
- The taka detector targets discrete transient SFX. A continuous music
bed under the voice is not removed by dropping words (it overlaps every word);
for a cleaner stem re-separate with the fine-tuned model
--demucs-model htdemucs_ft(≈4× slower, CPU only — MPS is unsupported for it). --no-demucsskips separation and just trims the original audio by speech VAD (no taka removal).
What ships with it: 2 files
34.4 KB alongside SKILL.md, 1 of them executable
scripts/
- extract_voice.pyruns34.1 KB
- requirements.txt304 B