Automatically cut silent pauses from long talking-head, course, tutorial, or screen-recording videos before you start editing in Final Cut Pro.
The script analyzes your video, detects pauses, and generates a cuts.fcpxml file. After importing that XML into Final Cut Pro, you get a new event and a ready-made project where the pauses are already removed and the remaining takes are split into editable clips.
This saves a lot of routine editing time. Instead of manually trimming silence across the whole timeline, you can jump straight to reviewing the prepared segments, selecting bad takes, and deleting them with one keypress. In one real example, an 83-minute recording became a 65-minute Final Cut project, with about 18 minutes of pauses removed automatically.
The script uses FFmpeg's silencedetect filter to find pauses, converts the remaining speech regions into frame-aligned FCPXML clips, and writes a timeline that can be imported into Final Cut Pro.
- Removes silence before the manual editing stage.
- Turns long recordings into a pre-cut Final Cut Pro project.
- Keeps repeated takes separated so failed takes are easy to delete.
- Helps with recordings where the background noise changes over time, such as fan or computer cooler noise.
- Reduces repetitive timeline trimming and speeds up the first rough cut.
- Detects silence with FFmpeg.
- Supports automatic noise threshold estimation.
- Supports adaptive per-window noise thresholds for recordings where background noise changes over time.
- Quantizes all clip boundaries to timeline frames.
- Adds configurable padding before and after speech regions.
- Shrinks detected silence before inversion to protect word edges.
- Generates Final Cut-friendly FCPXML format resources such as
FFVideoFormat1080p30.
- Python 3.9 or newer
- FFmpeg with
ffmpegandffprobeavailable inPATH - Final Cut Pro for importing the generated
.fcpxml
On macOS, FFmpeg can be installed with Homebrew:
brew install ffmpegpython3 make_fcpxml_silence_cuts.py input.mp4 -o cuts.fcpxml \
--adaptive-noise \
--min-silence 0.5 \
--pad-pre 0.06 \
--pad-post 0.16Then import cuts.fcpxml into Final Cut Pro.
During processing, the script prints adaptive-noise windows, the local silence threshold for each window, and an overall progress bar. When processing finishes, it writes cuts.fcpxml.
In Final Cut Pro, choose File -> Import -> XML....
Select the generated cuts.fcpxml file.
Final Cut Pro creates a new event and a cut project with the detected pauses removed.
For example, an 83-minute source recording becomes a 65-minute Final Cut project after silence removal. About 18 minutes of pauses are already cut out, and repeated takes are split into separate clips.
From there, editing is much faster: instead of manually trimming pauses throughout the whole video, you can review the prepared segments, select failed takes, and delete them with a single keypress.
For a 1080p30 timeline with short pauses and protected word edges:
python3 make_fcpxml_silence_cuts.py input.mp4 -o cuts.fcpxml \
--auto-noise --min-silence 0.5 \
--format-width 1920 --format-height 1080 --format-fps-num 30 --format-fps-den 1 \
--shrink-silence-pre 0.04 --shrink-silence-post 0.12 \
--pad-pre 0.06 --pad-post 0.16For noisy recordings, add a detector prefilter:
python3 make_fcpxml_silence_cuts.py input.mp4 -o cuts.fcpxml \
--auto-noise \
--prefilter "highpass=f=50"For recordings where the background noise changes during the video, use adaptive noise detection. This is useful when a fan, air conditioner, or computer cooler is audible for part of the recording and then disappears:
python3 make_fcpxml_silence_cuts.py input.mp4 -o cuts.fcpxml \
--adaptive-noise \
--adaptive-window 300 \
--adaptive-sample 20 \
--adaptive-probes 7 \
--adaptive-quantile 0.35 \
--adaptive-min-noise -45 \
--adaptive-max-noise -35 \
--auto-noise-margin 6 \
--min-silence 0.2 \
--pad-pre 0.25 \
--pad-post 0.25--noise: Manual silence threshold in dBFS.--auto-noise: Estimate one threshold for the whole file.--auto-noise-margin: Margin added to the estimated noise floor.--adaptive-noise: Estimate a separate threshold for each time window.--adaptive-window: Window duration in seconds for adaptive threshold detection.--adaptive-sample: Length of each probe sample inside an adaptive window.--adaptive-probes: Number of probe samples per window.--adaptive-quantile: Probe percentile used as the local noise floor. A value around0.35ignores isolated digital silence while still avoiding speech-heavy probes.--adaptive-min-noise: Lower clamp for adaptive silence thresholds in dB. Raise it when quiet noise is kept as speech.--adaptive-max-noise: Upper clamp for adaptive silence thresholds in dB.--min-silence: Minimum silence duration in seconds.--min-clip: Minimum generated clip duration in seconds.--pad: Base padding before and after each generated clip.--pad-pre: Padding before each generated clip.--pad-post: Padding after each generated clip.--shrink-silence-pre: Shorten the start of every detected silence interval.--shrink-silence-post: Shorten the end of every detected silence interval.--prefilter: FFmpeg audio filter chain applied beforesilencedetect.--format-width,--format-height,--format-fps-num,--format-fps-den: Override the generated timeline format.
The generated FCPXML references the original media file by absolute file:// URL. Keep the source video in place when importing into Final Cut Pro, or relink the media after import.
Generated media and XML outputs are ignored by git by default.
In the next version, I want to add a local LLM model that transcribes the video into text. The goal is to detect and remove failed duplicate takes automatically, not only cut silent pauses. This may become a separate repository.




