C++のオーディオ解析ライブラリ「pb_audio_stats」を作った
オーディオ解析のC++ライブラリ「pb_audio_stats」をGitHubで公開しました。BS.1770-4準拠のラウドネス計測、トゥルーピーク検出、RMS分析、ノーマライズ機能があります。
作った経緯
マスタリング作業してて、LUFSとかトゥルーピークを正確に測りたかったんだけど、手軽なツールがなかった。既存のやつはGUIが重いとか、C++から使いにくいとか、Python製でビルド面倒とか。結局自分で作ることにした。
最初は個人用のツールとして作り始めたけど、だんだん機能が増えてきたのでライブラリとして整理して公開することにした。
機能
BS.1770-4 ラウドネス計測
ITU-R BS.1770-4 規格に準拠したラウドネス測定。以下の値が取れる:
- 統合ラウドネス (Integrated Loudness):全体の平均ラウドネス。LUFS単位。配信サービスのターゲット設定に使う。
- 短期ラウドネス最大値 (Short-term Max):3秒ブロックのラウドネス最大値。
- 瞬間ラウドネス最大値 (Momentary Max):400msブロックのラウドネス最大値。
- ラウドネスレンジ (LRA):ラウドネスのダイナミックレンジ。10-95パーセンタイルで計算。
内部処理は K-weighting フィルタ(High-shelf + High-pass biquad)を通してから計測。ゲート処理(絶対ゲート -70 LUFS、相対ゲート -10 LU)も実装済み。
トゥルーピーク検出
インターサンプルピークの検出。アナログ変換後のクリップを予測するため、サンプル間のピークを4倍オーバーサンプリングして検出する。通常のピークメーターでは見逃しがちな「見えないクリップ」を捉えられる。
RMS 分析
SOX 互換のRMS計算。指数移動平均で計算して、タイムコンスタントは50ms(デフォルト)。RMS最小、最大、平均が取得可能。
オーディオノーマライズ
Peak、True Peak、Loudness、RMS の各種ターゲットで正規化できる。LUFSターゲットでのボリューム調整とか、dBTP制限でのクリップ防止とか。
CLI の使い方
コマンドラインツールとしても使える。
基本の解析
# 単一ファイルのラウドネスとトゥルーピークを計測
pb_audio_stats -i -tp input.wav
全情報を出力
# すべての解析項目を出力
pb_audio_stats -f -fe -fea -sr -bt -ch -tm -du -i -s -m -l -pk -tp -rn -rm -ra input.wav
ディレクトリ内のファイルを一括解析
# ディレクトリ内の全オーディオファイルを解析
pb_audio_stats -i -tp ./audio_folder/
CSV エクスポート
# 結果をCSVファイルに保存
pb_audio_stats -i -tp -pk ./audio_folder/ results.csv
ノーマライズ
# -23 LUFS に正規化
pb_audio_stats -norm-i:-23.0 input.wav output.wav
# True Peak -1.0 dBTP でクリップ防止
pb_audio_stats -norm-tp:-1.0 input.wav output.wav
CLI オプション一覧
解析オプション:
| オプション | 説明 | 単位 |
|---|---|---|
-f |
ファイル名(拡張子なし) | – |
-fe |
ファイル名(拡張子あり) | – |
-fea |
フルパス | – |
-sr |
サンプリングレート | Hz |
-bt |
ビット深度 | bits |
-ch |
チャンネル数 | – |
-tm |
総時間 | HH:MM:SS.mmm |
-du |
再生時間 | 秒 |
-i |
統合ラウドネス | LUFS |
-s |
短期ラウドネス最大 | LUFS |
-m |
瞬間ラウドネス最大 | LUFS |
-l |
ラウドネスレンジ | LU |
-pk |
サンプルピーク | dBFS |
-tp |
トゥルーピーク | dBFS |
-rn |
RMS最小 | dB |
-rm |
RMS最大 | dB |
-ra |
RMS平均 | dB |
正規化オプション:
| オプション | 説明 | 例 |
|---|---|---|
-norm-pk:<value> |
Peakで正規化 | -norm-pk:-1.0 |
-norm-tp:<value> |
True Peakで正規化 | -norm-tp:-1.0 |
-norm-i:<value> |
統合ラウドネスで正規化 | -norm-i:-23.0 |
-norm-s:<value> |
短期ラウドネス最大で正規化 | -norm-s:-18.0 |
-norm-m:<value> |
瞬間ラウドネス最大で正規化 | -norm-m:-18.0 |
-norm-rn:<value> |
RMS最小で正規化 | -norm-rn:-12.0 |
-norm-rm:<value> |
RMS最大で正規化 | -norm-rm:-12.0 |
-norm-ra:<value> |
RMS平均で正規化 | -norm-ra:-20.0 |
C++ ライブラリとしての使い方
ライブラリとしてプロジェクトに組み込める。
ビルド
macOS:
mkdir build_mac && cd build_mac
cmake -DCMAKE_BUILD_TYPE=Release ..
make
Windows:
mkdir build_win && cd build_win
cmake -G "Visual Studio 17 2022" -A x64 ..
cmake --build . --config Release
コード例
#include "pb_audio_stats.h"
using namespace pb_audio;
// ファイルを解析
AudioStats stats = analyze("input.wav");
std::cout << "統合ラウドネス: " << stats.integrated_loudness << " LUFS\n";
std::cout << "トゥルーピーク: " << stats.true_peak << " dBFS\n";
std::cout << "RMS平均: " << stats.rms_average << " dB\n";
// -23 LUFS に正規化して保存
Normalizer::normalize_and_save(
"input.wav",
"output.wav",
Normalizer::Target::Integrated,
-23.0
);
対応フォーマット
- WAV
- AIFF
- MP3
動作環境
- C++17 対応コンパイラ
- CMake 3.16+
- macOS: Clang / GCC
- Windows: MSVC 2022
ライセンス
Proprietary(独自ライセンス)
ダウンロード
GitHub: hiroshi-tamura/pb_audio_stats
バグ報告や機能要望は GitHub の Issues へ。