[お知らせ] MUZIUMの公式ドメインはmuzium.krに変更されました。
既存ドメインmuziument.comとメールアドレスも引き続きご利用いただけます。
Skip to main content

Pythonを使ったLUFS分析

2024.08.22·Study·4 min readMUZIUM
他の言語:
日本語···
Pythonを使ったLUFS分析

Pythonを使ったLUFS分析


今回のテーマ:Pythonを使ったLUFS分析

記事作成日:2024年08月22日

講座作成に使用したコンピューター環境

Apple MAC Studio M1 Max、32GB(2022)
14.6.1 Sonoma
Pro Tools Ultimate 2023.06 / iZotope RX 11 Editor

Mac OSは英語に設定されています。Pro Toolsも英語で進めます。


LUFS分析

実際、シンプルに一つ二つのファイルを整理して作業するなら、LUFS分析はあまり意味がないかもしれません。

作業しながらトラックの末端にAnalyzerを挿しておけば、作業中にすぐ確認できるからです。

しかしゲームのように大量の個別ファイルが生成される作業の場合、少ないもので数百個、多いものでは数千個にも及ぶAudioファイルが生まれるため、作業中にAnalyzerを挿しておくだけでは明らかに限界があります。

さらに、ボリュームが多ければ作業を進める担当者も増えるため、数値を決めておかなければ、A担当者がエディットしたソースは非常に大きく、B担当者がエディットしたソースは非常に小さいという結果になることもあります。

このような問題を解決するためには、LUFSの基準を設けて業務を処理する必要があります。

LUFS ControlでBatch Processingをかければ揃えられるのでは?

ある意味、最も簡単な方法です。

作業したファイルをRX Batch Processorに投げてLoudness Controlで合わせれば終わりじゃないか?という質問は十分出てくるでしょう。

しかしゲームCVの場合、ダイナミックレンジが非常に広いです。

例えばビジュアルノベルでよく登場する「[…]」の表現は、呼吸で代替されるため相対的に小さくなりますし、独り言を言う場合も相対的に小さくなるのは避けられません。

(そして自然な雰囲気を出すためには小さくなければなりません)

一方、叫び声や戦闘シーンで使われる感情表現は相対的に大きくなるのは当然です。こちらも自然な雰囲気を出すためには大きくなければなりません。

しかし残念ながら…すべてのプログラムは分析によってボリュームのみでアプローチし、どのようなセリフか、どのような感情かを把握せず、一律に揃えることに重点を置きます。

そのため、独り言や短い呼吸を大幅に持ち上げてしまい、大きくあるべき気合い声を下げてしまうという惨事が起きます。

(こういった問題を解決するには、AIディープラーニングと台本・ファイル名を把握する機能、STT(Speech To Text)機能を組み合わせることで、ようやく理想のプログラムができるのではないかと思います。)

結果的に、こういったケースのためにBatch Processingをかけた後も、聴きながら問題のあるファイルを個別に修正してやる必要があります。

市場に分析専用のプログラムはないのでしょうか?

思いのほか「分析のみを行う」という選択肢は多くありません。

すぐにLUFSを変えてしまうか、全体の平均を出してくれないというケースがほとんどです。

その中でAlto Studioが比較的近い機能を提供しており、

分析後にReportに進むと、計算したファイルの平均LUFSを算出できるようになっています。

問題は、必ずプロジェクト単位で分析されてしまうため、読み込む際に各フォルダ単位で個別に読み込みを行わなければならないという不便さがあります。

Alto Studioの画面

EP09が選択されているため、そのフォルダのみを分析したように見えますが、実際にはRootフォルダ全体を分析しています。

では作成したスクリプトは?

LUFSコードのスクリーンショット1

GUIのないターミナルで使えるスクリプト形式で作成しました。

GUIまで作るほど専門分野でもなく、正直そこまで必要かどうかという思いから、それ以上は進めませんでした。

スクリプト自体はGPTとClaudeが書いてくれたもので、コードの方向性を丁寧に説明しながら、コードをレビューしつつ仕上げました。

ターミナル画面を見ていただければわかりますが、LUFS Managerと称した実際のボリュームを調整するスクリプトや、さまざまなオーディオ作業を行えるスクリプトが含まれています。

LUFSコードのスクリーンショット2

サンプルはこのように一つのRootフォルダに5つのフォルダ、それぞれ20個のファイルを入れた状態です。

ゲームの階層構造に応じて、フォルダ一つがシナリオになることも、一人のキャラクターになることもあります。

LUFSコードのスクリーンショット3

コマンドライン引数でフォルダのパスを入力して実行すると…

LUFSコードのスクリーンショット4

このようにスクリプトが処理されます。(もちろんターミナル画面に表示されたメッセージは案内用であり、実際の結果物ではありません)

LUFSコードのスクリーンショット5

結果物は入力したフォルダと同じ名前に追加のテキストを付けて、同じ場所に生成されます。

Excelファイルには詳細なデータが含まれており、せっかちな方のためにExcelファイル名には平均LUFSが記載されるよう設定しています。

LUFSコードのスクリーンショット6

最初のファイルはかなりLUFSが低いですね。セリフではなく「[…]」の呼吸です。

Excelにはファイル名、Sample Rate、Bit Depth、Channel、Length、Peak Level、LUFSが記録されています。

平均を算出できる項目は最下段に平均を表示し、Sample RateやBit Depthのようにすべてのデータが同一の場合はO印を、そうでない場合はX印を表示します。

分析したデータをもとに、必要な作業を引き続き進めていただければ構いません。

私たちはLUFSを直接修正するコードも用意しているため、そちらのコードで追加調整を行っています。