ポッドキャストや収録音声から無音区間を見つけたい——自動カットやチャプター分割の前処理として、まずは「どこが無音か」を正確に把握する必要があります。FFmpeg の silencedetect フィルタは、指定したしきい値と継続時間に基づいて無音区間の開始・終了・長さを書き出します。この記事ではコマンドの基本、noiseduration の調整、出力の読み方、自動カットへの応用までを解説します。

動作確認: FFmpeg 8.1 / Windows — 本記事のコマンド 4 件を検証スクリプトで実行し、全て成功しました(2026-09-06)


基本コマンド

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.49秒以上を無音と判定

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 でトリミングする流れ:

  1. silencedetectで silence_start / silence_end を取得
  2. 無音区間を避けた時間範囲を計算
  3. ffmpegのトリミングコマンドで実際にカット

この工程をシェルスクリプトや Python で自動化することで、ポッドキャストや講義動画の無音部分を一括除去できます。


よくある設定パターン

用途 noise duration
ポッドキャストの無音除去 -40dB 0.3
録画映像の長い無音スキップ -50dB 3
音楽ファイルのトラック境界検出 -60dB 1
収録時の無音部分のみ検出 -30dB 0.5

実測: 処理時間とサイズ

計測したのは次のコマンドです。

ffmpeg -i input.mp4 -af silencedetect=noise=-40dB:duration=0.5 -f null -
項目 実測値
処理時間 7.07 秒
実時間比 16.97 倍速
出力ファイル なし(解析のみ)

計測環境: Core i9-14900KF(32スレッド)/ FFmpeg 8.1 (gyan.dev) / 素材は 1920x1080・30fps・120秒・351.4MB(Big Buck Bunny をループ、CC BY 3.0)。実行は逐次、2026-09-05。生データはデータセットで公開しています。

なぜ 7.07 秒なのか

出力ファイルを一切書かないからです。同じ素材・同じマシンで、フィルタを何もかけずに再エンコードするだけの ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -an output.mp4 は 27.97 秒かかり、86.26MB を書き出します。silencedetect は音声を解析してログを出すだけで、-f null - は映像フレームを受け取ってそのまま捨てます。x264 のエンコードにかかる時間がまるごと消える、というのが 7.07 秒の正体です。

ただしゼロ秒にはなりません。同じ計測で -c copy を使う操作は桁がひとつ違います —— ストリームマッピングが 0.41 秒、moov アトムの移動が 0.49 秒、音声フェードの適用が 1.03 秒です。いずれも映像ストリームをコピーするだけでフレームをデコードしません(音声フェードは音声だけを再エンコードし、映像には触りません)。対して silencedetect は 120 秒ぶんのストリームを最後までデコードして通さないと答えが出ません。7.07 秒という数字は「再エンコードよりはるかに速いが、ストリームコピーほど瞬時ではない」という解析パス特有の位置にあります。

言い換えると、無音検出はカット作業そのものではなく下調べです。7 秒はパイプライン全体から見れば安い部類で、時間を食うのは検出結果を受けたあとの処理です。同じ計測では 720p へのスケールが 18.43 秒、VP9 への変換が 729.16 秒かかっています。見積もるべきはそちらです。

なお計測したのは noise=-40dB:duration=0.5 という 1 条件だけです。閾値を変えると検出される区間の数は変わります。閾値を下げる(-50dB など)ほど小さな音も「音あり」と判定されて無音区間は減り、上げる(-30dB など)ほど小さな環境音まで無音扱いになって区間は増えます。この素材での実数は測っていないので、自分の素材で 2〜3 段階試して決めてください。

自動カットに使う場合は、検出した無音区間をそのまま削るのではなく、前後に100〜300ms程度の余白を残すと会話の頭切れを避けやすくなります。

複数人収録では、片方のマイクだけが無音でも会話全体は続いていることがあります。ミックス後の音声で検出するか、チャンネル別に確認するかを先に決めてください。


関連記事


動作確認: FFmpeg 8.1 / Windows — 本記事のコマンド 4 件を検証スクリプトで実行し、全て成功しました(2026-09-06) 一次ソース: ffmpeg.org/ffmpeg-filters.html#silencedetect / trac.ffmpeg.org/wiki/AudioVolume


よくある質問

無音判定の閾値は?

FFmpegのデフォルトは noise=0.001、つまり約 -60dB です。実用上は録音環境のノイズフロアより 5〜10dB 上を目安にしてください。スタジオ録音なら -50dB、屋外録音なら -25dB 程度から調整します。

無音区間を自動でカットしたい

silenceremove フィルタを使います。-af "silenceremove=start_periods=1:start_silence=0.5:start_threshold=-30dB"先頭の無音をカットできます(start_periods は先頭専用で、末尾は削れません)。途中の無音を詰めるには stop_periods=-1:stop_duration=1、末尾は areverse で挟みます。設定ごとの出力秒数を実測した 無音部分を自動でカットする を参照してください。

無音タイムスタンプの取得方法

ffmpeg -i in.mp4 -af silencedetect=noise=-30dB:d=0.5 -f null - 2>&1 | grep silence で無音区間の開始・終了時刻が出力されます。

長さ(duration)はどう設定?

d=0.5(0.49 秒以上の無音を検出)が一般的です。短くしすぎると瞬きや息継ぎを検出してしまいます。Vlog なら 1 秒以上、ナレーションなら 0.3 秒など用途で変えてください。

BGM 入りでも無音検出できる?

BGM があると常時音が出ているため、そのままでは検出できません。BGM が別トラックに入っている素材なら、-map 0:a:0 のように会話トラックだけを選んでから silencedetect にかけます。1 本のトラックにミックス済みの場合、FFmpeg 単体で BGM を分離することはできません。