podcast-splitter について
podcast-splitter は、無音検出に基づいて音声を分割し、無音部分を編集するスキルです。ポッドキャストや録音の処理向けに、検出設定、プレビュー、セグメント出力、複数ファイルの処理に対応します。
主な機能
- 01無音検出の設定
- 02間での音声分割
- 03無音の削除または短縮
- 04個別セグメントの出力
- 05検出した無音のプレビュー
- 06複数ファイルの一括処理
活用シーン
- 01ポッドキャストの章分け
- 02録音の無音部分の削除
- 03長い音声からクリップを作成
- 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 dBFS | 500ms | 非常に高感度 |
| 一般的なポッドキャスト | -40 dBFS | 1000ms | デフォルト |
| ノイズの多い録音 | -35 dBFS | 1500ms | 低感度 |
| 休止を含む音楽 | -30 dBFS | 2000ms | 話し声の休止向け |
感度の調整
- 分割数を増やす:しきい値を下げ(例:-50)、min_silence を短くします
- 分割数を減らす:しきい値を上げ(例:-30)、min_silence を長くします
- 自然な仕上がり:keep_silence を長くします(500~1000ms)
- タイトな編集:keep_silence を短くします(100~200ms)
依存関係
pydub>=0.25.0
注:システムに FFmpeg がインストールされている必要があります。
制限事項
- 音声コンテンツ(音楽ではなく)に最適です
- ノイズの多い録音では、しきい値の調整が必要になる場合があります
- 長いファイルは大量のメモリを使用します
- チャプター名は自動で付けられません(手動での名前変更が必要です)
コメント
Markdown 対応