執筆バージョン: Unreal Engine 4.24
|
ヘイガイズ!あけましておめでとうございます!エンジニアの片平です。
先日、リリースされたUE4.24のリリースノートに目を通していると、個人的にひと際興味を引く機能がありました。
Audio Synesthesia(ベータ)
Synesthesia…、直訳で”共感覚”…。(かっこいい…。)
「Audio Analyzer モジュールと Audio Synesthesia プラグインの追加により、ゲームプレイ スクリプトに使用できる抽出されたオーディオ分析データを公開することで、ゲーム内で再生されるサウンドに密接に結合されたアニメーション、エフェクト、およびその他の要素を操作できるようになりました。」
ん~、概要を読んでも正直よくわからないですね。
実際にどんなことができるのか試してみました。
例によってベータな機能ですので、今後のアップデートによっては仕様が変更される可能性があります。ご留意ください。
できること
どうやらベータ版では、非リアルタイム解析のみをサポートしており、以下の3つの解析方法があるようです。
①ラウドネス解析
音の大きさを解析します。
厳密にはラウドネス値とは音圧を人の聴感特性(等ラウドネス曲線)で補正したものです。
②定Q解析
音の特定周波数ごとの大きさを解析します。
この手法はスペクトル解析と呼ばれ、それを可視化できるスペクトラムアナライザは昔のオーディオコンポや、音楽再生ソフトなどにもビジュアライザとして搭載されたりしています。
定Q(constant-Q)とはスペクトル解析手法の一種で、一般的な高速フーリエ変換と比べより音楽信号に適した変換方法らしいです。
③音節解析
音の始まる位置を解析します。
音の立ち上がりを検出してその再生位置が特定できます。
多くのDAWにもトランジェント検出機能などの名称で備わっている機能です。
それでは、次の項目から実際に解析を行う手順を見てみましょう。
プラグインの有効化
本機能はプラグインで提供されているため、新規プロジェクトを作ったらまずAudio->Audio Synesthesiaプラグインを有効化します。

Unreal Editorの再起動を求められるため再起動します。
オーディオのインポート
解析するサウンドファイルをインポートします。

NRTアセットの作成・設定
NRT(ノンリアルタイム)解析用のアセットを作成します。
コンテンツブラウザを右クリックし、Sounds -> Analysis -> SynesthesiaNRTを選択します。

3つの解析手法ごとのクラスが表示されますので、使用するクラスを選択するとNRTアセットが作成されます。

作成したSynesthesiaNRTを開いてSoundに解析したいオーディオを設定します。
SynesthesiaNRTSettingを指定することで解析の詳細設定もできます。
オーディオ再生
新しいActorを作成し、Audioコンポーネントを追加します。
以下のようにノードを組みます。(クリックで拡大できます。)

これでサウンドが再生されている間は毎フレーム PlaybackPercentEvent が実行されます。
PlaybackPercent(全体の何%再生したか)にDuration(オーディオの長さ)をかけることで現在の再生時間も取得できます。
各解析結果の視覚化
ここからは各解析手法ごとに解析結果を視覚化した例をご紹介します。
①ラウドネス解析
LoudnessNRTの変数を追加し、予め作成したNRTアセットをデフォルト値に設定します。
以下のようにノードを組みます。

現在の再生時間を Get Normalized Loudness at Time ノードに入れると、その時点の正規化されたラウドネス値を返してくれます。
解析結果のラウドネス値×3の値をスケールのZに入れてメータアクタをスポーンします。
毎フレーム スポーンする必要はないので0.05秒毎に1回スポーンするようGateで制御してます。
メータアクタは立方体のスタティックメッシュを持ち、一定速度で移動し、一定時間で DestroyActor されます。
Playすると以下のようになります。
スネアやキックなどの大きい音が再生されるところでメータも大きくなっていることがわかります。
②定Q解析
ConstantQNRTの変数を追加し、予め作成したNRTアセットをデフォルト値に設定します。
Construction Scriptで立方体のコンポーネントをバンド数(デフォルトで48個)分位置をずらして追加して、それを配列に入れます。

以下のようにノードを組みます。

現在の再生時間を Get Normalized Channel Constant Q At Time ノードに入れると、その時点のバンド毎の値を配列で返してくれます。
配列を展開した値×5の値でConstruction Scriptで作った立方体のスケールを変えます。
Playすると以下のようになります。
基音の変化や倍音のうねりがわかりますね。
③音節解析
OnsetNRTの変数を追加し、予め作成したNRTアセットをデフォルト値に設定します。
以下のようにノードを組みます。

Get Channel Onsets Between Timesノードは、指定した区間にある音節の再生時間を配列で返してくれます。
このBPでは配列の要素の再生時間を過ぎたらメーターアクタをスポーンし、配列からその要素を消す、ということをしています。
メーターアクタはラウドネス解析のものと一緒で、立方体のスタティックメッシュを持ち、一定速度で移動し、一定時間で DestroyActor されます。
Playすると以下のようになります。
音が鳴ると同時にメーターが生成されていますね。単音なら結構な精度で検出できているようです。
使ってみた感想
現状では非リアルタイム解析のみの機能ですので、NRTアセットを作成する煩雑さがあったりインタラクティブなことができなかったりします。
ちなみにインタラクティブ性を考えるならSound Visualization Pluginでも音量の解析やスペクトル解析はできます。
[UE4] UE 4.22 の新機能!Sound Submix のスペクトル解析について
反面、予め解析した結果を読み出す方式なのでマシンスペックが低いモバイル等でも効果的な演出ができるようになるのではないかなと思いました。
あと音節解析は音ゲーの譜面自動生成に使えそうとか思いました。
公式フォーラムの開発者の発言によると、将来的にはリアルタイム解析のサポートや新しい解析手法の追加も予定されているみたいです。
これからが楽しみな機能ですね!