サントリー

  • サントリーウエルネスオンライン

DMM.COM

  • DMM

SECOND HAND(セカハン)

« FFmpegで音声の加工。GeminiとClaudeで試してみたよ | トップページ | PowerAutomate、Windowsでの話です »

2026/04/03

音声の変換劇。Gemini、Claude、FFmpeg、そして、Premiere Pro

今回の音の調整。GeminiやClaudeにFFmpegを使ったバッチや、PowerShell を書いてもらって実行しました。

色々勉強になりました。

ボリュームのみに注目して調整しても、実際音声を聞いた時に同じ大きさに感じないこと。

まずは、GeminiとBatchを作った話をGeminiにまとめてもらいました。

6c4c2acf1f344957ba51cbea88ef0d3a_1_105_c



【FFmpeg】動画の「音割れ・ノイズ・音量バラつき」をバッチ処理で一気に解決する方法

動画を撮影した後、編集ソフトで一つずつ音を調整するのは骨が折れる作業ですよね。

特にホワイトノイズの除去やコンプレッサー、音割れの補正などは、できれば**「一括で、かつ自動で」**終わらせたいものです。

今回は、コマンドラインツール FFmpeg を使い、Windowsのバッチファイルで動画の音質を劇的に改善するワークフローをご紹介します。

音声編集の「鉄則」とフィルター構成

音を整えるには順番が重要です。ノイズを消す前に音量を上げてしまうと、ノイズまで強調されてしまうからです。今回は以下の4ステップを1コマンドで実行します。





  1. adeclip(歪みの補正): 音割れ(クリップ)した箇所を補完して滑らかにする。

  2. afftdn(ノイズ除去): 「サーッ」というホワイトノイズをFFT解析で除去する。

  3. acompressor(コンプレッサー): 大きすぎる音を抑え、小さな音を持ち上げて均一にする。

  4. loudnorm(音量の正規化): 最終的な音量をYouTubeなどの放送規格レベルに自動調整する。



Windows用の一括処理バッチファイル

メモ帳を開き、以下のコードを貼り付けて audio_fix.bat という名前で保存してください。処理したい動画があるフォルダに置いて実行するだけで、processed フォルダに調整済み動画が生成されます。

バッチファイルのコード


コード スニペット


@echo off
setlocal enabledelayedexpansion

:: 出力用のフォルダを作成
if not exist "processed" mkdir "processed"

echo --- 音声一括最適化処理を開始します ---

for %%f in (*.mp4) do (
echo 処理中: %%f
:: 映像は再エンコードせず(copy)、音声フィルター(af)のみ適用
ffmpeg -i "%%f" -af "adeclip,afftdn,acompressor=threshold=0.125:ratio=4,loudnorm" -c:v copy "processed\%%f"

if !errorlevel! equ 0 (
echo [成功]: %%f
) else (
echo [エラー]: %%f
)
)

echo --- 全ての処理が完了しました ---
pause


フィルターの役割を詳しく解説

1. adeclip(デクリップ)

マイクの入力レベルが強すぎて音がバリバリと割れてしまった際、その波形の頂点を推測して丸めてくれます。完全に壊れた音は直せませんが、聞き苦しいトゲを丸めるのに効果的です。

2. afftdn(デノイズ)

高精度なノイズ除去フィルターです。静かな場所で録音した際に入る「サーッ」という環境音を自然に消し去ります。

3. acompressor(コンプレッサー)

音量のダイナミックレンジを圧縮します。





  • threshold: 圧縮を開始する音量。

  • ratio: 圧縮率。4:1程度が自然で聞き取りやすくなります。

4. loudnorm(ラウドネス正規化)

これが非常に強力です。単純な音量アップではなく、人間の耳に聞こえる「ラウドネス(音の大きさ)」を計算し、YouTubeなどで最適な音量(-14 LUFS前後)に自動で合わせてくれます。



まとめ

FFmpegを使えば、高価なプラグインを買わなくても、コマンド一つでプロに近い音声処理が可能です。映像部分は -c:v copy でそのままスルーパスさせているため、画質劣化もなく、処理も一瞬で終わります。

こちらはClaudeとPowerShellスクリプトを作るまでをClaudeにまとめてもらいました。

しかし、このバッチでの音量調整に満足いきませんでした。オリジナルの音声のばらつきが酷すぎたためです。

バッチファイルで変換する結果をもらうよりも、文字化け、文字解析がうまくできない時があり、そちらにストレスを感じました。

そんな状態ではありましたが、Claudeに興味を持ったため、Claudeでも変換スクリプトを書いてもらうことにしました。

 

2a3680d6139d4aa6b6c94b5b9b98a0cd_1_105_c

次は、Claudeと作ったPowerShellスクリプトです。

楽しい試みですね!まとめてみます。


AIと一緒にPowerShellスクリプトを作った話

はじめに

「MP4動画の音声を自動で補正したい」——そんなシンプルな動機から始まったこのプロジェクト。ffmpegとPowerShellを使って、AIと二人三脚でスクリプトを育てていった記録です。


第1章:最初の一歩

最初の要件はシンプルでした。

  • 音量をラウドネス方式で上げる
  • ホワイトノイズを消す

それだけのはずでした。

AIがサクッとスクリプトを生成。afftdn(ノイズ除去)とloudnorm(音量正規化)を組み合わせた基本的な構成です。「これで完璧!」——そう思っていた時期が、私にもありました。


第2章:次々と出てくる要望

動かしてみると、あれも欲しい、これも欲しいと要望が膨らんでいきます。

「ごわごわして聞き取りにくい」 → WN除去が強すぎた。nr=25nr=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段階:

  1. volumeフィルターで事前補正:調整幅を20dB以内に収める
  2. パディング秒数を動的に変更
入力音量 パディング
> -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

 

Dsc09578

といった感じで、頑張りましたが、どうしても20ファイルほど、音声の立ち上がりが機になるファイルがありました。

結局、Premiere Proで音声を調整し、クリックノイズを除去し、クロマノイズを書けて、完成させました。

Premiere Proで基本的に音量の最大は30d B(もしかして45d B行けたかも)ですが、クリップの上で、G。ゲインを呼び出すと限界を突破できます。30d Bで足りなかったファイルはゲインで上げました。

作業的にはPowerShellの変換を待っているよりも早かったかもしれません。クリップを載せて、書き出すまで、ファイル名を間違えたり、シーケンス名とファイル名を間違う可能性はありましたが。

どうしても消せなかった頭のボーッというホワイトノイズ(ピンクノイズと言われてるノイズだったのかもしれません)もPremiere Proでは喋る直前まで、ミュートしておけば、問題なく対応できました。

ClaudeやGeminiを使って非常に勉強になりましたが、変換されたデータの質に関してはPremiere Proの手作業が一番よかったと思いました。

クロマノイズがそれなりにホワイトノイズを消してくれたことと、元のデータにそれほど大きなホワイトノイズが乗っていなかったことが、幸いだったのですが。

 

 

« FFmpegで音声の加工。GeminiとClaudeで試してみたよ | トップページ | PowerAutomate、Windowsでの話です »

日記・コラム・つぶやき」カテゴリの記事

2026年7月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

カテゴリー

無料ブログはココログ