podcast-splitter

安装量: 41
排名: #17526

安装

npx skills add https://github.com/dkyazzentwatwa/chatgpt-skills --skill 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

# Auto-split by silence
splitter = PodcastSplitter("podcast_episode.mp3")
segments = splitter.split_by_silence()
splitter.export_segments("./chapters/")

# Remove long silences
splitter = PodcastSplitter("raw_recording.mp3")
splitter.remove_silence(min_length=2000)  # Remove silences > 2 seconds
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")

# With custom settings
splitter = PodcastSplitter(
    "audio.mp3",
    silence_thresh=-40,    # dBFS threshold
    min_silence_len=1000,  # Minimum silence length (ms)
    keep_silence=300       # Silence to keep at segment edges (ms)
)

Silence Detection

# Detect silence regions
silences = splitter.detect_silence()
# Returns: [(start_ms, end_ms), (start_ms, end_ms), ...]

# Print silence summary
splitter.print_silence_report()

Splitting

# Split at all detected silences
segments = splitter.split_by_silence()

# Split at silences longer than threshold
segments = splitter.split_by_silence(min_silence_len=3000)

# Limit number of segments
segments = splitter.split_by_silence(max_segments=10)

Silence Removal

# Remove silences longer than threshold
splitter.remove_silence(min_length=2000)  # Remove >2s silences

# Shorten silences to max length
splitter.shorten_silence(max_length=500)  # Cap at 500ms

# Remove leading/trailing silence only
splitter.strip_silence()

Export

# Export all segments
splitter.export_segments(
    output_dir="./chapters/",
    prefix="chapter",       # chapter_01.mp3, chapter_02.mp3
    format="mp3",
    bitrate=192
)

# Export specific segments
splitter.export_segment(0, "intro.mp3")
splitter.export_segment(3, "conclusion.mp3")

# Save modified audio
splitter.save("output.mp3")

CLI Usage

# Split podcast into chapters
python podcast_splitter.py --input episode.mp3 --output-dir ./chapters/

# Detect and list silences (no splitting)
python podcast_splitter.py --input episode.mp3 --detect-only

# Remove long silences
python podcast_splitter.py --input raw.mp3 --output clean.mp3 --remove-silence 2000

# Custom sensitivity
python podcast_splitter.py --input episode.mp3 --output-dir ./chapters/ \
    --threshold -35 --min-silence 2000 --keep-silence 500

CLI Arguments

| --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,     # Less sensitive (louder threshold)
    min_silence_len=2000,   # Only split on 2+ second pauses
    keep_silence=400        # Keep some silence for natural feel
)

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")

# Show what would be removed
splitter.print_silence_report()

# Remove silences longer than 3 seconds
splitter.remove_silence(min_length=3000)

# Cap remaining silences at 1 second
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)

# Export only segments longer than 30 seconds
for i, segment in enumerate(segments):
    duration = segment['end'] - segment['start']
    if duration > 30000:  # > 30 seconds
        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)

        # Remove long silences
        splitter.remove_silence(min_length=2000)

        # Save cleaned version
        output_path = os.path.join(output_dir, filename)
        splitter.save(output_path)
        print(f"Processed: {filename}")

Preview Silence Detection

splitter = PodcastSplitter("episode.mp3")

# Get detailed silence info
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")

# Print summary
splitter.print_silence_report()

Detection Settings Guide

| 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)

返回排行榜