<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>音量正規化 on もざぶれなるままに</title><link>https://mitz17.com/tags/%E9%9F%B3%E9%87%8F%E6%AD%A3%E8%A6%8F%E5%8C%96/</link><description>Recent content in 音量正規化 on もざぶれなるままに</description><generator>Hugo -- gohugo.io</generator><language>ja-JP</language><lastBuildDate>Wed, 18 Mar 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://mitz17.com/tags/%E9%9F%B3%E9%87%8F%E6%AD%A3%E8%A6%8F%E5%8C%96/index.xml" rel="self" type="application/rss+xml"/><item><title>MP3の音量がバラバラな問題、ffmpegで一発解決｜Python製ツールの使い方と仕組み</title><link>https://mitz17.com/blog/mp3-normalizer-devlog/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0900</pubDate><guid>https://mitz17.com/blog/mp3-normalizer-devlog/</guid><description>&lt;p&gt;GitHub: &lt;a class="link" href="https://github.com/mitz17/mp3-normalizer" target="_blank" rel="noopener"
 &gt;mitz17/mp3-normalizer&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="mp3の音量がバラバラで困っていませんか"&gt;MP3の音量がバラバラで困っていませんか？
&lt;/h2&gt;&lt;p&gt;昔作った MP3 を久しぶりに再生したら「あれ、音ちいさくない？」と感じたことはありませんか。ファイル自体は壊れていないのに、曲ごとに音量がまちまちで、再生のたびにボリュームを手動調整している──そんな悩みを &lt;strong&gt;ffmpeg の &lt;code&gt;loudnorm&lt;/code&gt; フィルタ&lt;/strong&gt; と &lt;strong&gt;Python 製ツール「mp3-normalizer」&lt;/strong&gt; で丸ごと解決します。&lt;/p&gt;
&lt;p&gt;このツールでできることを先にまとめます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;フォルダ内の MP3 を &lt;strong&gt;まとめて -14 LUFS に正規化&lt;/strong&gt;（業界標準値）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GUI でも CLI でも&lt;/strong&gt; 同じエンジンで処理できる&lt;/li&gt;
&lt;li&gt;ID3 タグ・歌詞・アートワークを保ったまま再エンコード&lt;/li&gt;
&lt;li&gt;処理済み履歴を JSON で管理し、&lt;strong&gt;二重処理・上書きを自動防止&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="ffmpeg-の-loudnorm-とは"&gt;ffmpeg の &lt;code&gt;loudnorm&lt;/code&gt; とは？
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;loudnorm&lt;/code&gt; は ffmpeg に組み込まれた音量正規化フィルタです。波形のピーク値ではなく &lt;strong&gt;LUFS（Loudness Units Full Scale）&lt;/strong&gt; という人間の聴感に近い指標を基準にするため、曲ごとの「うるさい・静かすぎる」問題を自然に解消できます。&lt;/p&gt;
&lt;p&gt;パラメータや 1pass / 2pass の仕組みを先に把握したい場合は、&lt;a class="link" href="../../blog/ffmpeg-loudnorm-guide/" &gt;ffmpeg loudnorm 完全解説：LUFS正規化と2passノーマライズの仕組み&lt;/a&gt;にまとめています。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="対象読者前提環境"&gt;対象読者・前提環境
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;古い MP3 アーカイブを大切にしていて、&lt;strong&gt;音量だけさっと手直ししたい&lt;/strong&gt;人&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ffmpeg&lt;/code&gt; のコマンドを覚えていないけど、まとめて処理したい人&lt;/li&gt;
&lt;li&gt;Python が書ける人で、実装の中身まで確認したい人&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;動作には &lt;strong&gt;Python 3.11 以上&lt;/strong&gt; と &lt;strong&gt;ffmpeg 6.x&lt;/strong&gt; が必要です。ffmpeg の導入は &lt;a class="link" href="https://qiita.com/Tadataka_Takahashi/items/9dcb0cf308db6f5dc31b" target="_blank" rel="noopener"
 &gt;この Qiita 記事&lt;/a&gt; を OS ごとに手順をたどれば OK です。正規化したい &lt;code&gt;.mp3&lt;/code&gt; はフォルダにまとめておいてください（WAV など他形式は事前に変換するか、後述の拡張子設定で対応できます）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="セットアップ"&gt;セットアップ
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1. リポジトリを取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/mitz17/mp3-normalizer
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2. 仮想環境を作成・有効化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python -m venv .venv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source .venv/bin/activate &lt;span style="color:#75715e"&gt;# Windows: .venv\Scripts\Activate.ps1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3. 依存パッケージをインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pip install -r requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 4. 起動&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python main.py &lt;span style="color:#75715e"&gt;# GUI モード&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python main.py --cli ... &lt;span style="color:#75715e"&gt;# CLI バッチ処理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="使い方gui-編"&gt;使い方：GUI 編
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;入力・出力ディレクトリを指定&lt;/strong&gt;すると、対象 MP3 がリストに表示されます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LUFS と True Peak を入力&lt;/strong&gt;。迷ったらデフォルト（-14 LUFS / -1 dBFS）のままで OK。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;再帰チェック&lt;/strong&gt;（サブフォルダを含むか）や&lt;strong&gt;強制再エンコード&lt;/strong&gt;のトグルで挙動を調整。&lt;/li&gt;
&lt;li&gt;「&lt;strong&gt;実行&lt;/strong&gt;」を押すと進捗ログがリアルタイムで流れ、完了後に結果を確認できます。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="../../images/mp3-normalizer-gui.png" alt="mp3-normalizer GUI" loading="lazy" style="border-radius:16px; box-shadow:0 8px 24px rgba(15,23,42,0.18);"&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;入力/出力パス・ターゲット LUFS・対象ファイル一覧・ログを 1 画面で確認できます。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="使い方cli-編"&gt;使い方：CLI 編
&lt;/h2&gt;&lt;p&gt;GUI なしでバッチ処理したいときはこちら。スクリプトやタスクスケジューラと組み合わせやすいです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 基本（入力・出力ディレクトリを指定）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python main.py --cli --input ./music_in --output ./music_out
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# LUFS と True Peak を変更する場合&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python main.py --cli --input ./music_in --output ./music_out --lufs -16 --tp -1.5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 並列数を指定（デフォルトは CPU コア数）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python main.py --cli --input ./music_in --output ./music_out --workers &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 対象拡張子と出力形式を変更&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python main.py --cli --input ./music_in --output ./music_out --ext flac --format aac
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;処理結果は &lt;code&gt;mp3_normalizer.log&lt;/code&gt; に記録され、実行した ffmpeg コマンドごとの LUFS 値も残ります。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="実装のポイント"&gt;実装のポイント
&lt;/h2&gt;&lt;h3 id="アーキテクチャ概要"&gt;アーキテクチャ概要
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;main.py
├── gui.py ─ Tkinter + ttk。別スレッドで ffmpeg を呼び出し UI フリーズを回避
├── processor.py ─ GUI / CLI 共通エンジン。ファイル走査・重複回避・正規化を担当
└── utils.py ─ パス生成・ログ整形などの汎用ユーティリティ
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;処理済みファイルは &lt;code&gt;processed_history.json&lt;/code&gt; にサイズ・更新日時で記録され、再実行時に自動スキップされます。デフォルト（&lt;code&gt;force=False&lt;/code&gt;）では既存ファイルへの上書きも行いません。&lt;/p&gt;
&lt;h3 id="ファイル走査と重複回避"&gt;ファイル走査と重複回避
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;processor.py&lt;/code&gt; の &lt;code&gt;AudioProcessor.process_directory&lt;/code&gt; では、入力ディレクトリを走査して処理計画を立て、衝突しそうなファイル名に &lt;code&gt;_1&lt;/code&gt;, &lt;code&gt;_2&lt;/code&gt; のサフィックスを付加します（&lt;a class="link" href="https://github.com/mitz17/mp3-normalizer/blob/main/processor.py#L180-L232" target="_blank" rel="noopener"
 &gt;GitHub の該当コード&lt;/a&gt;）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; index, entry &lt;span style="color:#f92672"&gt;in&lt;/span&gt; enumerate(plan&lt;span style="color:#f92672"&gt;.&lt;/span&gt;entries, start&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; destination &lt;span style="color:#f92672"&gt;=&lt;/span&gt; output_dir &lt;span style="color:#f92672"&gt;/&lt;/span&gt; entry&lt;span style="color:#f92672"&gt;.&lt;/span&gt;relative
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ensure_directory(destination&lt;span style="color:#f92672"&gt;.&lt;/span&gt;parent)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; destination &lt;span style="color:#f92672"&gt;=&lt;/span&gt; destination&lt;span style="color:#f92672"&gt;.&lt;/span&gt;with_suffix(&lt;span style="color:#e6db74"&gt;&amp;#34;.mp3&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; destination &lt;span style="color:#f92672"&gt;=&lt;/span&gt; generate_unique_output_path(destination)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;executor&lt;span style="color:#f92672"&gt;.&lt;/span&gt;normalize(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; input_file&lt;span style="color:#f92672"&gt;=&lt;/span&gt;entry&lt;span style="color:#f92672"&gt;.&lt;/span&gt;source,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; destination&lt;span style="color:#f92672"&gt;=&lt;/span&gt;destination,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; target_lufs&lt;span style="color:#f92672"&gt;=&lt;/span&gt;target_lufs,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; true_peak&lt;span style="color:#f92672"&gt;=&lt;/span&gt;true_peak,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; results&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(result)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; result&lt;span style="color:#f92672"&gt;.&lt;/span&gt;success:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;history_service&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mark_processed(entry&lt;span style="color:#f92672"&gt;.&lt;/span&gt;relative, entry&lt;span style="color:#f92672"&gt;.&lt;/span&gt;size, entry&lt;span style="color:#f92672"&gt;.&lt;/span&gt;mtime)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;history_service&lt;span style="color:#f92672"&gt;.&lt;/span&gt;save()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ffmpeg-コマンドの組み立て"&gt;ffmpeg コマンドの組み立て
&lt;/h3&gt;&lt;p&gt;実際に ffmpeg を叩くのは &lt;code&gt;FfmpegExecutor.normalize&lt;/code&gt;（&lt;a class="link" href="https://github.com/mitz17/mp3-normalizer/blob/main/processor.py#L63-L111" target="_blank" rel="noopener"
 &gt;コードはこちら&lt;/a&gt;）。コマンド全体をログに残すため、GUI からでも「裏で何をしているか」が一目でわかります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;command &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ffmpeg_cmd, &lt;span style="color:#e6db74"&gt;&amp;#34;-hide_banner&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-y&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;-i&amp;#34;&lt;/span&gt;, str(input_file),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;-af&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;loudnorm=I=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;target_lufs&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:TP=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;true_peak&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;:LRA=11&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;-c:a&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;libmp3lame&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-q:a&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;-map_metadata&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; str(destination),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;command_str &lt;span style="color:#f92672"&gt;=&lt;/span&gt; format_command(command)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;self&lt;span style="color:#f92672"&gt;.&lt;/span&gt;logger&lt;span style="color:#f92672"&gt;.&lt;/span&gt;info(&lt;span style="color:#e6db74"&gt;&amp;#34;ffmpeg コマンド: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;, command_str)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;completed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;run(command, check&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;, capture_output&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;, text&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-map_metadata 0&lt;/code&gt; で ID3 タグをそのまま引き継ぎ、mutagen ライブラリで歌詞タグを後から上書きコピーすることで、ffmpeg だけでは落ちてしまうタグも保持します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="アップデート履歴"&gt;アップデート履歴
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;日付&lt;/th&gt;
 &lt;th&gt;内容&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-03-04&lt;/td&gt;
 &lt;td&gt;直列処理 → 並列処理対応。145 件の処理が 670 秒 → 207 秒（約 3.2 倍高速化）。Windows での文字コード処理を堅牢化&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-03-05&lt;/td&gt;
 &lt;td&gt;mutagen を用いた歌詞タグのコピー処理を追加。正規化後も歌詞を保持可能に&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-03-08&lt;/td&gt;
 &lt;td&gt;静かなイントロでの音量増大を抑制。入力ビットレートを検出して同等ビットレートで出力。入力拡張子・出力形式（mp3 / aac / flac / wav / ogg）を選択可能に。アートワーク保持を二段構えで強化&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;2026-03-18&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;既知の不具合&lt;/strong&gt;：100 曲に 1 曲程度の割合でアーティストタグが消えるケースを確認。同一アルバム内でも再現条件が定まらず調査中。Issue を立てる予定。&lt;a class="link" href="https://github.com/mitz17/mp3-normalizer" target="_blank" rel="noopener"
 &gt;修正に協力いただける方はこちら&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="まとめ"&gt;まとめ
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Tkinter × ffmpeg という素朴な構成でも、MP3 音量の正規化はかなり快適にできる&lt;/li&gt;
&lt;li&gt;GUI で直感操作・CLI でバッチ自動化、どちらでも同じ品質に揃えられる&lt;/li&gt;
&lt;li&gt;古い MP3 をまだまだ活用したい人は、ぜひ &lt;code&gt;mp3-normalizer&lt;/code&gt; をクローンしてみてください&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="関連記事"&gt;関連記事
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="../../blog/ffmpeg-loudnorm-guide/" &gt;【コマンド例あり】ffmpeg loudnormの使い方｜LUFS正規化と2pass設定を解説&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="../../blog/ansys-version-selector/" &gt;Ansysのバージョン選択ツールを作った理由｜古い解析ファイルを別バージョンで開くリスクを減らす&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>