| name | podcast-splitter |
| description | Split audio files by detecting silence gaps. Auto-segment podcasts into chapters, remove long silences, and export individual clips. |
Podcast Splitter
Automatically split audio files into segments based on silence detection. Perfect for dividing podcasts into chapters, creating clips from long recordings, or removing dead air.
Quick Start
from scripts.podcast_splitter import PodcastSplitter
splitter = PodcastSplitter("podcast_episode.mp3")
segments = splitter.split_by_silence()
splitter.export_segments("./chapters/")
splitter = PodcastSplitter("raw_recording.mp3")
splitter.remove_silence(min_length=2000)
splitter.save("clean_recording.mp3")
Features
- Silence Detection: Configurable threshold and duration
- Auto-Split: Divide audio at natural breaks
- Silence Removal: Remove or shorten long pauses
- Chapter Export: Save individual segments as files
- Preview Mode: List detected silences without splitting
- Batch Processing: Process multiple files
API Reference
Initialization
splitter = PodcastSplitter("audio.mp3")
splitter = PodcastSplitter(
"audio.mp3",
silence_thresh=-40,
min_silence_len=1000,
keep_silence=300
)
Silence Detection
silences = splitter.detect_silence()
splitter.print_silence_report()
Splitting
segments = splitter.split_by_silence()
segments = splitter.split_by_silence(min_silence_len=3000)
segments = splitter.split_by_silence(max_segments=10)
Silence Removal
splitter.remove_silence(min_length=2000)
splitter.shorten_silence(max_length=500)
splitter.strip_silence()
Export
splitter.export_segments(
output_dir="./chapters/",
prefix="chapter",
format="mp3",
bitrate=192
)
splitter.export_segment(0, "intro.mp3")
splitter.export_segment(3, "conclusion.mp3")
splitter.save("output.mp3")
CLI Usage
python podcast_splitter.py --input episode.mp3 --output-dir ./chapters/
python podcast_splitter.py --input episode.mp3 --detect-only
python podcast_splitter.py --input raw.mp3 --output clean.mp3 --remove-silence 2000
python podcast_splitter.py --input episode.mp3 --output-dir ./chapters/ \
--threshold -35 --min-silence 2000 --keep-silence 500
CLI Arguments
| Argument | Description | Default |
|---|
--input | Input audio file | Required |
--output | Output file (for silence removal) | - |
--output-dir | Output directory for segments | - |
--detect-only | Only detect/report silences | False |
--threshold | Silence threshold (dBFS) | -40 |
--min-silence | Minimum silence to detect (ms) | 1000 |
--keep-silence | Silence to keep at edges (ms) | 300 |
--max-segments | Maximum segments to create | None |
--remove-silence | Remove silences longer than (ms) | - |
--shorten-silence | Cap silence length at (ms) | - |
--prefix | Output filename prefix | segment |
--format | Output format | mp3 |
--bitrate | Output bitrate (kbps) | 192 |
Examples
Split Interview into Q&A Segments
splitter = PodcastSplitter(
"interview.mp3",
silence_thresh=-35,
min_silence_len=2000,
keep_silence=400
)
segments = splitter.split_by_silence()
print(f"Found {len(segments)} segments")
splitter.export_segments("./questions/", prefix="qa")
Remove Dead Air from Recording
splitter = PodcastSplitter("raw_recording.mp3")
splitter.print_silence_report()
splitter.remove_silence(min_length=3000)
splitter.shorten_silence(max_length=1000)
splitter.save("clean_recording.mp3")
Create Highlight Clips
splitter = PodcastSplitter("episode.mp3")
segments = splitter.split_by_silence(min_silence_len=5000)
for i, segment in enumerate(segments):
duration = segment['end'] - segment['start']
if duration > 30000:
splitter.export_segment(i, f"highlight_{i+1}.mp3")
Batch Process Episodes
import os
from scripts.podcast_splitter import PodcastSplitter
episodes_dir = "./raw_episodes/"
output_dir = "./processed/"
for filename in os.listdir(episodes_dir):
if filename.endswith('.mp3'):
filepath = os.path.join(episodes_dir, filename)
splitter = PodcastSplitter(filepath)
splitter.remove_silence(min_length=2000)
output_path = os.path.join(output_dir, filename)
splitter.save(output_path)
print(f"Processed: {filename}")
Preview Silence Detection
splitter = PodcastSplitter("episode.mp3")
silences = splitter.detect_silence()
print("Detected Silences:")
for i, (start, end) in enumerate(silences):
duration = (end - start) / 1000
start_time = start / 1000
print(f" {i+1}. {start_time:.1f}s - {duration:.1f}s silence")
splitter.print_silence_report()
Detection Settings Guide
| Audio Type | Threshold | Min Silence | Notes |
|---|
| Quiet studio | -50 dBFS | 500ms | Very sensitive |
| Normal podcast | -40 dBFS | 1000ms | Default |
| Noisy recording | -35 dBFS | 1500ms | Less sensitive |
| Music with breaks | -30 dBFS | 2000ms | For spoken breaks |
Adjusting Sensitivity
- More splits: Lower threshold (e.g., -50), shorter min_silence
- Fewer splits: Higher threshold (e.g., -30), longer min_silence
- Natural feel: Longer keep_silence (500-1000ms)
- Tight edits: Shorter keep_silence (100-200ms)
Dependencies
pydub>=0.25.0
Note: Requires FFmpeg installed on system.
Limitations
- Works best with speech content (not music)
- Very noisy recordings may need threshold adjustment
- Long files use significant memory
- No automatic chapter naming (manual rename needed)