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

動作確認: FFmpeg 6.1(検証スクリプトで実 FFmpeg 実行確認)/対象 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この音量以下を「無音」と判定
duration2この秒数以上続く無音のみ報告

カスタム例:-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 で自動化することで、ポッドキャストや講義動画の無音部分を一括除去できます。


よくある設定パターン

用途noiseduration
ポッドキャストの無音除去-40dB0.3
録画映像の長い無音スキップ-50dB3
音楽ファイルのトラック境界検出-60dB1
収録時の無音部分のみ検出-30dB0.5

実測例

48kHzステレオAAC、2分の動画音声に対して noise=-40dB:duration=0.5 で無音検出する例です。

ffmpeg -i input.mp4 \
  -af "silencedetect=noise=-40dB:duration=0.5" \
  -f null /dev/null

この処理は音声デコードと解析が中心で、映像は出力しません。2分程度の素材なら数秒で終わることが多く、ログには無音区間の開始・終了・長さだけが出ます。検出結果のテキストは数KB程度です。

同じ素材でも、noise=-50dB では空調ノイズを音として扱い、無音区間が少なくなることがあります。noise=-30dB では小さな環境音も無音扱いになり、区間が増えます。環境により変動します。

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

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


関連リソース

よく使うオプション・フィルタ・コーデック設定をまとめた PDF チートシートです。手元に置いておくと調べる時間を短縮できます。

FFmpeg チートシート

関連記事


動作確認: ffmpeg 6.1 / Ubuntu 24.04 (検証スクリプトで実行確認) 一次ソース: 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" で先頭・末尾の無音をカットできます。

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

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 を適用してください。