silenceremove は名前のとおり無音を削るフィルタですが、パラメータの意味が直感と違うため「先頭しか削れない」「後半が丸ごと消えた」という事故が起きやすいフィルタです。本記事では、無音の位置と長さが分かっている音声を用意して、各設定で出力が何秒になったかを実測し、それをもとに設定の意味を説明します。
動作確認: FFmpeg 8.1 / Windows — 本記事のコマンド 11 件を検証スクリプトで実行し、全て成功しました(2026-09-06)
実測に使った音声
gaps.wav(8.0 秒): 音 1 s → 無音 2 s → 音 1 s → 無音 3 s → 音 1 spadded.wav(14.0 秒):gaps.wavの前に無音 2 s、後ろに無音 4 s を足したもの
「音」は 440 Hz の正弦波、「無音」はデジタル無音(完全な 0)です。実録音の「無音」は暗騒音を含むので、後述の閾値 -50dB 程度に緩める必要があります。
先頭の無音だけ削る: start_periods=1
ffmpeg -i input.wav -af "silenceremove=start_periods=1:start_threshold=-50dB" output.wav
| 入力 | 出力 | 説明 |
|---|---|---|
| padded.wav 14.0 s | 12.0 s | 先頭の無音 2 s だけが消えた。末尾の 4 s と途中の無音はそのまま |
start_periods=1 は「先頭で音が始まるまでの無音を 1 回削る」という意味で、末尾の無音は削れません。「先頭・末尾を削る」と説明している記事を見かけますが、それは誤りです(末尾の削り方は後述)。
start_duration と start_silence
start_duration=0.5— 「0.5 秒以上音が続いたら音の開始とみなす」。短いノイズで誤検出しないための設定ですが、判定に使った 0.5 秒分の音も削られます。実測: 14.0 → 11.5 s(音が 0.5 秒短くなった)start_silence=0.3— 削らずに残す無音の長さ。実測: 14.0 → 12.3 s(先頭に 0.3 秒の無音が残る)。いきなり音が始まるのを避けたいときに使います
ffmpeg -i input.wav -af "silenceremove=start_periods=1:start_duration=0.5:start_silence=0.3:start_threshold=-50dB" output.wav
途中の無音を詰める: stop_periods=-1
ポッドキャストや講義録音で、話の間の長い沈黙を短くしたい場合です。
ffmpeg -i input.wav -af "silenceremove=stop_periods=-1:stop_duration=1:stop_threshold=-50dB" output.wav
| 入力 | 出力 | 説明 |
|---|---|---|
| gaps.wav 8.0 s | 5.04 s | 2 s と 3 s の無音がそれぞれ 1 s に。1+1+1+1+1 = 5 s |
| padded.wav 14.0 s | 8.06 s | 途中の無音と末尾の 4 s が 1 s に詰まった。先頭の 2 s は残っている |
stop_periods=-1 は「音が止まった後の無音を全て対象にする」、stop_duration=1 は「1 秒を超える無音を 1 秒まで詰める」です。ここでも先頭は対象外なので、先頭も削るなら start_periods=1 を併用します。
ffmpeg -i input.wav -af "silenceremove=start_periods=1:start_threshold=-50dB:stop_periods=-1:stop_duration=1:stop_threshold=-50dB" output.wav
詰めた後に残す無音の長さ
stop_silence は詰めた後に追加で残す無音です。stop_duration=1:stop_silence=0.5 なら各無音は 1.5 秒になります(実測: gaps.wav 8.0 → 6.04 s)。逆に stop_duration=0.5 にすると各無音が 0.5 秒に詰まり 8.0 → 4.04 s でした。
会話の間を自然に残すなら stop_duration=1:stop_silence=0.3 程度、機械的に詰めるなら stop_duration=0.3 程度が目安です。
落とし穴: stop_periods=1 は「後半を全部消す」
ffmpeg -i input.wav -af "silenceremove=stop_periods=1:stop_duration=1:stop_threshold=-50dB" output.wav
これを「末尾の無音を 1 回削る」と読みたくなりますが、実測結果は gaps.wav 8.0 s → 1.02 s。最初の無音が見つかった時点でそれ以降の音声がすべて捨てられます。正の stop_periods は「N 回目の無音で出力を終了する」という意味だからです。
途中の無音を詰めたいなら stop_periods=-1(負の値)、末尾だけ削りたいなら次の areverse を使ってください。
末尾の無音を削る: areverse で挟む
silenceremove は先頭にしか start_* を適用できないので、音声を逆順にして先頭を削り、また逆順に戻すのが定番です。
ffmpeg -i input.wav -af "silenceremove=start_periods=1:start_threshold=-50dB,areverse,silenceremove=start_periods=1:start_threshold=-50dB,areverse" output.wav
実測: padded.wav 14.0 s → 8.0 s(先頭 2 s と末尾 4 s が消え、途中の無音は残る)。
areverse は音声全体をメモリに保持するので、数時間の録音では GB 単位のメモリを使います。1 時間程度の音声なら実用範囲です。
事前に無音の位置を確認する: silencedetect
どこが無音判定されるかを先に確かめるには silencedetect を使います。何も出力せず、ログに位置を表示します。
ffmpeg -i input.wav -af "silencedetect=noise=-50dB:d=0.5" -f null -
[silencedetect @ ...] silence_start: 1
[silencedetect @ ...] silence_end: 3.000023 | silence_duration: 2.000023
[silencedetect @ ...] silence_start: 4
[silencedetect @ ...] silence_end: 7.000023 | silence_duration: 3.000023
noise が閾値、d が「この長さ以上続いたら無音とみなす」です。ここで見つかる区間が silenceremove の stop_threshold / stop_duration を同じ値にしたときの対象になります。検出結果の読み方は 無音検出の記事 に詳しくまとめています。
閾値の決め方
| 音源 | start/stop_threshold の目安 |
|---|---|
| デジタル生成音、DAW 書き出し | -60dB 〜 -70dB |
| 静かな部屋でのマイク録音 | -45dB 〜 -50dB |
| 環境音の多い録音、古いカセット | -35dB 〜 -40dB |
閾値を高く(-30dB など)しすぎると、小声や語尾が無音判定されて切れます。silencedetect で確認しながら 5 dB 刻みで調整してください。
動画の無音部分を削りたいとき
silenceremove は音声フィルタなので、動画に適用しても映像は削れません。音声だけ短くなって映像とずれます。
ffmpeg -i input.mp4 -af "silenceremove=start_periods=1:start_threshold=-50dB" -c:v copy output.mp4
このコマンドは成功しますが、映像はそのまま・音声だけ先頭が詰まった状態になります。動画の無音区間を映像ごと削るには、silencedetect で無音区間の時刻を取り、trim / atrim か -ss/-to で音のある区間を切り出して concat する手順になります。区間が多い場合はスクリプト化が必要で、Auto-Editor のような専用ツール(内部で FFmpeg を使っています)を使うほうが現実的です。
音量正規化と組み合わせる
無音を削った後に音量をそろえる場合、loudnorm は silenceremove の後に置きます。先に正規化すると、無音判定の基準が変わってしまいます。
ffmpeg -i input.wav -af "silenceremove=start_periods=1:start_threshold=-50dB:stop_periods=-1:stop_duration=1:stop_threshold=-50dB,loudnorm=I=-16:TP=-1.5:LRA=11" output.wav
MP3 / AAC に出力する
ffmpeg -i input.wav -af "silenceremove=start_periods=1:start_threshold=-50dB" -c:a libmp3lame -q:a 2 output.mp3
ffmpeg -i input.wav -af "silenceremove=start_periods=1:start_threshold=-50dB" -c:a aac -b:a 160k output.m4a
よくある質問
先頭の無音が全然削れない
閾値が低すぎる(-90dB など)か、入力の「無音」にノイズが乗っているのが原因です。silencedetect=noise=-50dB で無音として検出されるか確認し、閾値を上げてください。
音の途中でブツッと切れる
start_duration / stop_duration が短すぎて、単語の間の一瞬の沈黙を無音と判定しています。stop_duration を 0.5〜1 秒に伸ばすか、stop_silence で余韻を残してください。
window オプションは何ですか
閾値判定に使う RMS 計算の窓長(デフォルト 0.02 秒)です。通常は触る必要がありません。極端に短いパルス音を拾いたいときだけ小さくします。
関連ツール
無音カットツールは、この記事の silenceremove をブラウザ内で実行します。ファイルは端末から出ません。
関連記事
- 無音区間を検出する(silencedetect) — 検出結果の読み方と CSV 化
- ラウドネス正規化 —
loudnormの 2 パス手順 - 動画を切り出す —
-ss/-toの使い方(音声ファイルにも同じ) - 音量を調べる —
volumedetectで閾値の目安を決める