FFmpeg の silencedetect フィルタを使うと、音声や動画の無音区間の開始・終了・長さを調べられます。無音かどうかは、指定したしきい値(noise)と継続時間(duration)で判定します。ポッドキャストや収録音声を自動カットしたり、チャプターに分けたりする前に、どこが無音かを確認するのに使います。

基本コマンド

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

  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)に、128 kb/s の AAC 音声(サイン波)を加えたもの(353.29MB)。1つずつ順に実行、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 秒で終わります。この 7.07 秒の大半は、捨てるための 1080p 映像のデコードにかかっています。音声だけを調べるなら -vn を付けると映像をデコードしないので、もっと速く終わります。

ただしゼロ秒にはなりません。同じ計測で -c copy を使う操作は桁がひとつ違い、ストリームマッピングが 0.41 秒、moov アトムの移動が 0.49 秒、音声フェードの適用が 1.03 秒です。いずれも映像ストリームをコピーするだけで、フレームをデコードしません(音声フェードは音声だけを再エンコードし、映像には触りません)。一方 silencedetect は、無音区間をすべて見つけるために、120 秒ぶんのストリームを最後までデコードします。silencedetect のような解析だけの処理は、再エンコードより速く、ストリームコピーよりは遅くなります。

無音検出はカット作業そのものではなく、その前の下調べです。7 秒は作業全体から見れば短く、時間がかかるのは検出結果を受けたあとの処理です。同じ計測では、720p へのスケールが 18.43 秒、VP9 への変換が 729.16 秒かかっています。処理時間を見積もるときは、こちらを基準にしてください。

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

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

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

関連記事

よくある質問

無音判定の閾値は?

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.5 秒以上の無音を検出)が一般的です。短くしすぎると、息継ぎや単語の間の短い沈黙まで検出します。Vlog なら 1 秒以上、ナレーションなら 0.3 秒など、用途に合わせて変えてください。

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

BGM がしきい値より大きい音量で鳴り続けていると、会話の途切れを無音として検出できません(しきい値より小さい BGM なら、その部分は無音として検出されます)。BGM が別トラックに入っている素材なら、-map 0:a:0 のように会話トラックだけを選んでから silencedetect にかけます。1 本のトラックにミックス済みの場合、FFmpeg 単体で BGM を分離することはできません。