mcpField
P
podcast-splitter

podcast-splitter

github.com/dkyazzentwatwa创意与媒体12456 次安装29 周前更新
代码仓库

关于 podcast-splitter

podcast-splitter 是一款根据静音检测拆分音频并编辑停顿的 skill,适用于播客和录音处理,提供可调检测参数、预览、片段导出及批量处理。

主要功能

  1. 01可配置静音检测
  2. 02在停顿处拆分音频
  3. 03删除或缩短静音
  4. 04导出独立音频片段
  5. 05预览检测到的静音
  6. 06批量处理文件

适用场景

  1. 01将播客拆分为章节
  2. 02删除录音中的空白段
  3. 03从长音频制作片段
  4. 04编辑前预览停顿

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/dkyazzentwatwa/chatgpt-skills --skill podcast-splitter

安装后在 Claude Code 中输入/podcast-splitter确认已加载。

附带文件scripts/podcast_splitter.pyscripts/requirements.txt

详细介绍

播客分段器

根据静音检测自动将音频文件拆分为多个片段。非常适合将播客分成章节、从长录音中创建片段,或去除无声片段。

快速开始

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

功能

  • 静音检测:可配置阈值和时长
  • 自动拆分:在自然停顿处拆分音频
  • 去除静音:删除或缩短较长的停顿
  • 导出章节:将各个片段保存为文件
  • 预览模式:列出检测到的静音,不进行拆分
  • 批量处理:处理多个文件

API 参考

初始化
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)
)
静音检测
# Detect silence regions
silences = splitter.detect_silence()
# Returns: [(start_ms, end_ms), (start_ms, end_ms), ...]

# Print silence summary
splitter.print_silence_report()
拆分
# 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)
去除静音
# 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 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 用法

# 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 参数
参数描述默认值
--input输入音频文件必填
--output输出文件(用于去除静音)-
--output-dir片段的输出目录-
--detect-only仅检测并报告静音False
--threshold静音阈值(dBFS)-40
--min-silence检测静音的最短时长(ms)1000
--keep-silence边缘保留的静音时长(ms)300
--max-segments要创建的最大片段数None
--remove-silence去除超过此时长的静音(ms)-
--shorten-silence将静音时长限制为(ms)-
--prefix输出文件名前缀segment
--format输出格式mp3
--bitrate输出比特率(kbps)192

示例

将访谈拆分为问答片段
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")
去除录音中的无声片段
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")
创建精彩片段
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")
批量处理单集
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}")
预览静音检测
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()

检测设置指南

音频类型阈值最短静音时长备注
安静的录音室-50 dBFS500ms灵敏度极高
普通播客-40 dBFS1000ms默认值
嘈杂的录音-35 dBFS1500ms灵敏度较低
有间奏的音乐-30 dBFS2000ms适用于口播间隙
调整灵敏度
  • 拆分更多:降低阈值(例如,-50),缩短 min_silence
  • 拆分更少:提高阈值(例如,-30),延长 min_silence
  • 听感自然:延长 keep_silence(500-1000ms)
  • 紧凑剪辑:缩短 keep_silence(100-200ms)

依赖项

pydub>=0.25.0

注意:需要在系统上安装 FFmpeg。

限制

  • 最适合语音内容(不适用于音乐)
  • 嘈杂的录音可能需要调整阈值
  • 长文件会占用大量内存
  • 不会自动命名章节(需要手动重命名)

评论

支持 Markdown