ポッドキャストや収録音声から無音区間を見つけたい——自動カットやチャプター分割の前処理として、まずは「どこが無音か」を正確に把握する必要があります。FFmpeg の silencedetect フィルタは、指定したしきい値と継続時間に基づいて無音区間の開始・終了・長さを書き出します。この記事ではコマンドの基本、noise と duration の調整、出力の読み方、自動カットへの応用までを解説します。
動作確認: FFmpeg 6.1(ubuntu-latest / GitHub Actions CI 検証済み)/対象 OS: Windows / macOS / Linux
基本コマンド
ffmpeg -i input.mp3 -af silencedetect -f null /dev/null
出力ファイルは生成せず、無音区間の情報を標準エラー出力に表示します。
出力の読み方
[silencedetect @ 0x...] silence_start: 5.32
[silencedetect @ 0x...] silence_end: 8.15 | silence_duration: 2.83
[silencedetect @ 0x...] silence_start: 45.7
[silencedetect @ 0x...] silence_end: 47.2 | silence_duration: 1.5
| フィールド | 説明 |
|---|---|
silence_start | 無音開始時刻(秒) |
silence_end | 無音終了時刻(秒) |
silence_duration | 無音の長さ(秒) |
しきい値(noise)と最小継続時間(duration)の調整
デフォルト値
| パラメータ | デフォルト | 説明 |
|---|---|---|
noise | -60dB | この音量以下を「無音」と判定 |
duration | 2 | この秒数以上続く無音のみ報告 |
カスタム例:-40dB以下・0.5秒以上を無音と判定
ffmpeg -i input.mp3 -af "silencedetect=noise=-40dB:duration=0.5" -f null /dev/null
- noise を大きく(-40dB等): 背景ノイズも無音として検出
- duration を短く(0.1秒等): 短い息継ぎも検出
- duration を長く(3秒等): 長い沈黙のみ検出
動画ファイルへの適用
ffmpeg -i input.mp4 -af "silencedetect=noise=-50dB:duration=1" -f null /dev/null
動画ファイルでも音声トラックが解析されます。
出力を絞り込む(grepを組み合わせる)
必要な行だけを抽出する例(Linux/macOS):
ffmpeg -i input.mp3 -af silencedetect -f null /dev/null 2>&1 | grep silence_
Windowsのコマンドプロンプトでは findstr silence_ を使います。
応用:無音区間を使った自動カット
silencedetect の出力から無音区間を取得し、-ss/-to でトリミングする流れ:
- silencedetectで
silence_start/silence_endを取得 - 無音区間を避けた時間範囲を計算
- ffmpegのトリミングコマンドで実際にカット
この工程をシェルスクリプトや Python で自動化することで、ポッドキャストや講義動画の無音部分を一括除去できます。
よくある設定パターン
| 用途 | noise | duration |
|---|---|---|
| ポッドキャストの無音除去 | -40dB | 0.3 |
| 録画映像の長い無音スキップ | -50dB | 3 |
| 音楽ファイルのトラック境界検出 | -60dB | 1 |
| 収録時の無音部分のみ検出 | -30dB | 0.5 |
関連リソース
よく使うオプション・フィルタ・コーデック設定をまとめた PDF チートシートです。手元に置いておくと調べる時間を短縮できます。
関連記事
動作確認: ffmpeg 6.1 / Ubuntu 24.04 (GitHub Actions runner) 一次ソース: ffmpeg.org/ffmpeg-filters.html#silencedetect / trac.ffmpeg.org/wiki/AudioVolume
よくある質問
無音判定の閾値は?
-30dB が一般的なデフォルトです。録音環境のノイズフロアより 5〜10dB 上を目安にしてください。スタジオ録音なら -50dB、屋外録音なら -25dB 程度。
無音区間を自動でカットしたい
silenceremove フィルタを使います。-af "silenceremove=start_periods=1:start_silence=0.5:start_threshold=-30dB" で先頭・末尾の無音をカットできます。
無音タイムスタンプの取得方法
ffmpeg -i in.mp4 -af silencedetect=noise=-30dB:d=0.5 -f null - 2>&1 | grep silence で無音区間の開始・終了時刻が出力されます。
長さ(duration)はどう設定?
d=0.5(0.5 秒以上の無音を検出)が一般的です。短くしすぎると瞬きや息継ぎを検出してしまいます。Vlog なら 1 秒以上、ナレーションなら 0.3 秒など用途で変えてください。
BGM 入りでも無音検出できる?
BGM があると常時音が出ているため検出できません。事前に音声から BGM を分離(-map 0:a:1 など)してから silencedetect を適用してください。