pb_audio_stats

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 へ。

カテゴリー: 未分類 タグ: , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です