今回の音の調整。GeminiやClaudeにFFmpegを使ったバッチや、PowerShell を書いてもらって実行しました。
色々勉強になりました。
ボリュームのみに注目して調整しても、実際音声を聞いた時に同じ大きさに感じないこと。
まずは、GeminiとBatchを作った話をGeminiにまとめてもらいました。

【FFmpeg】動画の「音割れ・ノイズ・音量バラつき」をバッチ処理で一気に解決する方法
動画を撮影した後、編集ソフトで一つずつ音を調整するのは骨が折れる作業ですよね。
特にホワイトノイズの除去やコンプレッサー、音割れの補正などは、できれば**「一括で、かつ自動で」**終わらせたいものです。
今回は、コマンドラインツール FFmpeg を使い、Windowsのバッチファイルで動画の音質を劇的に改善するワークフローをご紹介します。
音声編集の「鉄則」とフィルター構成
音を整えるには順番が重要です。ノイズを消す前に音量を上げてしまうと、ノイズまで強調されてしまうからです。今回は以下の4ステップを1コマンドで実行します。
-
adeclip(歪みの補正): 音割れ(クリップ)した箇所を補完して滑らかにする。
-
afftdn(ノイズ除去): 「サーッ」というホワイトノイズをFFT解析で除去する。
-
acompressor(コンプレッサー): 大きすぎる音を抑え、小さな音を持ち上げて均一にする。
-
loudnorm(音量の正規化): 最終的な音量をYouTubeなどの放送規格レベルに自動調整する。
Windows用の一括処理バッチファイル
メモ帳を開き、以下のコードを貼り付けて audio_fix.bat という名前で保存してください。処理したい動画があるフォルダに置いて実行するだけで、processed フォルダに調整済み動画が生成されます。
バッチファイルのコード
フィルターの役割を詳しく解説
1. adeclip(デクリップ)
マイクの入力レベルが強すぎて音がバリバリと割れてしまった際、その波形の頂点を推測して丸めてくれます。完全に壊れた音は直せませんが、聞き苦しいトゲを丸めるのに効果的です。
2. afftdn(デノイズ)
高精度なノイズ除去フィルターです。静かな場所で録音した際に入る「サーッ」という環境音を自然に消し去ります。
3. acompressor(コンプレッサー)
音量のダイナミックレンジを圧縮します。
4. loudnorm(ラウドネス正規化)
これが非常に強力です。単純な音量アップではなく、人間の耳に聞こえる「ラウドネス(音の大きさ)」を計算し、YouTubeなどで最適な音量(-14 LUFS前後)に自動で合わせてくれます。
まとめ
FFmpegを使えば、高価なプラグインを買わなくても、コマンド一つでプロに近い音声処理が可能です。映像部分は -c:v copy でそのままスルーパスさせているため、画質劣化もなく、処理も一瞬で終わります。
こちらはClaudeとPowerShellスクリプトを作るまでをClaudeにまとめてもらいました。
しかし、このバッチでの音量調整に満足いきませんでした。オリジナルの音声のばらつきが酷すぎたためです。
バッチファイルで変換する結果をもらうよりも、文字化け、文字解析がうまくできない時があり、そちらにストレスを感じました。
そんな状態ではありましたが、Claudeに興味を持ったため、Claudeでも変換スクリプトを書いてもらうことにしました。

次は、Claudeと作ったPowerShellスクリプトです。
楽しい試みですね!まとめてみます。
AIと一緒にPowerShellスクリプトを作った話
はじめに
「MP4動画の音声を自動で補正したい」——そんなシンプルな動機から始まったこのプロジェクト。ffmpegとPowerShellを使って、AIと二人三脚でスクリプトを育てていった記録です。
第1章:最初の一歩
最初の要件はシンプルでした。
- 音量をラウドネス方式で上げる
- ホワイトノイズを消す
それだけのはずでした。
AIがサクッとスクリプトを生成。afftdn(ノイズ除去)とloudnorm(音量正規化)を組み合わせた基本的な構成です。「これで完璧!」——そう思っていた時期が、私にもありました。
第2章:次々と出てくる要望
動かしてみると、あれも欲しい、これも欲しいと要望が膨らんでいきます。
「ごわごわして聞き取りにくい」 → WN除去が強すぎた。nr=25をnr=10に下げる。
「ファイルに応じた処理をしてほしい」 → RMS測定で5段階自動判定を実装。ファイルごとにWN除去強度が変わるように。
「末尾のノイズを消せない?」 → silencedetectで末尾の無音区間を検出して2秒フェードアウト。
「パリパリ音を消したい」 → adeclick + acompressor + alimiter をフィルターチェーンに追加。
気づけばフィルターチェーンはこんな長さに:
adeclick → afftdn → loudnorm → acompressor → alimiter → afade
第3章:loudnormとの戦い
このプロジェクト最大の難敵がloudnormでした。
「冒頭20秒あたりから音量が上がってくる」
これはloudnormの仕様です。リアルタイムで音量を測定しながら処理するため、冒頭は内部バッファが安定するまで音量が変動します。
試した解決策その1:volume+compressor方式 → 冒頭は安定したが「ファイルごとに音量のムラが出る」問題が発生。
試した解決策その2:一時WAVファイル方式 → loudnormの処理結果をWAVに書き出してから使う。でも冒頭の収束問題はWAVの時点で起きているので意味がなかった。
試した解決策その3:無音パディング方式 → 冒頭に25秒の無音を追加してloudnormを収束させてから削除する。これが正解でした!
[無音25秒] + [元音声] → loudnorm処理 → 冒頭25秒を削除 → 完成
第4章:日本語パスという伏兵
パディング方式を実装したところで、新たな敵が現れました。
Error opening input file X:\繝輔か繝ォ繝\繝輔ぃ...
日本語パスの文字化けです。
C:\Users\XXXXXXXXXX\TEST というフォルダ名に日本語が含まれているため、ffmpegにパスが正しく渡らない。
解決策を探して右往左往しました。
- バッチファイルをANSIで保存 → 効果なし
chcp 65001を追加 → 効果なし
$PSScriptRootの問題 → -NoExitで空になる場合がある
- ジョブ内に
[Console]::OutputEncoding = UTF8を追加 → 部分的に改善
そして判明した本当の原因——adeclickフィルターのパラメーターo=25が範囲外(有効範囲は50〜95)だった!
[Parsed_adeclick_0] Value 25.000000 for parameter 'o' out of range [50 - 95]
文字化けのせいだと思っていたら、全然別の原因でした。o=75に修正して解決。
第5章:Start-Jobとの格闘
高速化のためにStart-Job(並列処理)を使っていましたが、これが問題の温床でした。
- ジョブ内では文字コード設定が引き継がれない
- エラーが発生してもジョブが戻り値を返さずクラッシュ
- ログに詳細が出ない
デバッグのため、一時的にジョブを廃止してシーケンシャル処理に切り替え。すると画面にエラーが直接表示されるようになり、ようやくadeclickの問題が発覚しました。
**「ぐるぐる回ってない?」**というユーザーの一言が印象的でした。ffmpegの分析コマンドが57分の動画を全部デコードしていて、30分待っても終わらなかったのです。
第6章:音が小さすぎるファイル問題
「1分過ぎまでじわじわと音量が上がっているように思います」
I=-54 LUFSという極端に小さいファイルが問題でした。目標の-16 LUFSとの差が38dB。これだけ差があるとloudnormの収束に時間がかかります。
解決策は2段階:
volumeフィルターで事前補正:調整幅を20dB以内に収める
- パディング秒数を動的に変更:
| 入力音量 |
パディング |
| > -30 LUFS |
25秒 |
| -30〜-40 LUFS |
45秒 |
| -40〜-50 LUFS |
60秒 |
| ≤ -50 LUFS |
90秒 |
完成したスクリプトの全機能
長い旅を経て完成したSimpleAudio.ps1の機能一覧:
- loudnorm 2-pass:ファイルごとに分析して音量を均一化
- 動的パディング:入力音量に応じてパディング秒数を自動調整
- 事前ゲイン補正:極端に小さいファイルをvolumeで事前補正
- adeclick:パチパチ音の除去
- afftdn:RMS測定による5段階自動WN除去
- acompressor + alimiter:パリパリ音対策
- 末尾FO:silencedetectで検出して2秒フェードアウト
- ログ出力:処理詳細を自動保存
- バージョン表示:画面起動時に確認できる
おわりに
「シンプルなものを作ろう」と思っていたのに、気づけば400行のスクリプトになっていました。
AIとの会話の中で印象に残った言葉:
「ぐるぐる回ってない?」
「音がごわごわして聞き取りにくい」
「さっきの話に戻っていい?」
「プログラム間違えてない?_」
技術的な問題だけでなく、「どんな音にしたいか」「どう聞こえるか」というユーザーの感覚を言語化しながら一緒に作り上げていく過程が、このプロジェクトの醍醐味でした。
ffmpegは奥が深い。PowerShellも奥が深い。そしてAIと会話しながら作るのは、思った以上に楽しいものです。
使用技術:PowerShell 5 / ffmpeg / loudnorm / afftdn / adeclick / acompressor / alimiter

といった感じで、頑張りましたが、どうしても20ファイルほど、音声の立ち上がりが機になるファイルがありました。
結局、Premiere Proで音声を調整し、クリックノイズを除去し、クロマノイズを書けて、完成させました。
Premiere Proで基本的に音量の最大は30d B(もしかして45d B行けたかも)ですが、クリップの上で、G。ゲインを呼び出すと限界を突破できます。30d Bで足りなかったファイルはゲインで上げました。
作業的にはPowerShellの変換を待っているよりも早かったかもしれません。クリップを載せて、書き出すまで、ファイル名を間違えたり、シーケンス名とファイル名を間違う可能性はありましたが。
どうしても消せなかった頭のボーッというホワイトノイズ(ピンクノイズと言われてるノイズだったのかもしれません)もPremiere Proでは喋る直前まで、ミュートしておけば、問題なく対応できました。
ClaudeやGeminiを使って非常に勉強になりましたが、変換されたデータの質に関してはPremiere Proの手作業が一番よかったと思いました。
クロマノイズがそれなりにホワイトノイズを消してくれたことと、元のデータにそれほど大きなホワイトノイズが乗っていなかったことが、幸いだったのですが。