UE4では、マイク入力やオーディオインターフェースの入力をリアルタイムに取り込んで、音の解析結果をビジュアライズすることができるということが以下の動画からわかります。
しかし、実際に音をデバイスからリアルタイムに取り込む方法や、Blueprint/Niagaraでそれぞれどのようなことが実現できるかといった情報が断片的であったりします。なのでこのあたりを個人的なメモとしてまとめます。本記事では、
- オーディオインターフェースなどのデバイスから音をリアルタイムに取得する方法
- 既存のBlueprintノードでできる解析(可視化)
- 既存のNiagaraノードでできる解析(可視化)
を扱います。間違いなどあればご指摘ください。
執筆時のバージョン: 4.26.2
-> 5.2.1
でも確認
以下は、BlurprintやNiagaraでオーディオを用いたエフェクトの例です。
0. オーディオミキサーの注意点
UE4のオーディオシステムは強力で、様々なDSP処理をゲームプレイにおける負荷を感じさせずに実現できます。空間に応じたリバーブや減衰などの動的な処理はその端的な例です。ミキシングにおいても Sound Class と Submix というエンティティを用いて細かく調整できます。Sound Class
は音源をグループ化してボリュームなどのパラメータを一括で乗算をするのに対して、Submix
がオーディオシグナルのミキシングをつかさどる単位でミキサーのチャンネルに近いエンティティとなります。Submix
にエフェクトをアサインできたり、解析をしたりすることができます。様々な音源再生は全て Submix
にアサインされてミックスされます。
全ての音源や Submix
はフラットな状態で Master Submix
にデフォルトでアウトされます。Master Submix
は Project Settings
> Engine
> Audio
> Master Submix
で指定します。Submix
自体の説明は、公式ドキュメントやHistoria様の記事を読むと理解がはかどります。
デフォルトで設定されている MasterSubmixDefault
は Engine Content
配下にある Submix
です。Masterも上げ下げしたかったりする場合は Engine Content
のものよりも Content
配下に自前でつくってしまったほうが良いでしょう。
理解するのに時間がかかったのは、 全ての音源の Master Submixへのアウトは暗黙的である ということです。音源がわたる Submix
指定を None
にしても音が聞こえる、つまり内部で暗黙的に Master Submix
にアウトしているということです。この特性は Submix
それ自体にもあてはまるので、 Master Submix
に結線されていなくても暗黙的に拾われてしまいますし、そのままだとPlay中に音が聞こえてしまいます。
具体的に説明するために、新規の Submix
として RealTimeAudioSubmix
と MasterSubmix
をそれぞれ作成し、 MasterSubmix
をプロジェクトのマスターに設定してる状態で2つを結線します。
この場合の RealTimeAudioSubmix
は当然 MasterSubmix
にアウトされるのは理解できるのですが、
線を切ってしまっても、 MasterSubmix
から RealTimeAudioSubmix
の音が聞こえるのです。Submix
をユースケースとして意識しない場合は暗黙的に出力されるほうが楽ですが、Submix
をミキサーとして使っていきたい場合はその点が少し困ったりもします。
1. デバイスから音を取り込む
ここでは、オーディオインターフェースやVoiceMeeterのようなバーチャルデバイスの入力を想定します。
1.1. デバイス選択
デバイス入力の取得は Media Player
経由で行います。
Media Player
作成時、ビデオを出力する Media Texture
を作成するか選べますが、今回はオーディオデバイスなのでチェックをはずします。
Media Player
を作成して開くと、左上のフォルダアイコンから入力デバイスを手動で選ぶことができます。とりあえず確認だけしたい場合は、ここから選んで出力を確認することができます。しかし PIE
での動作やビルドしたときの実行ファイルで音をひろいたい場合は、 Blueprint
などで明示的に選択する必要があります。
グローバル関数の Enumerate Audio Capture Devices
で Media Capture Device
構造体の配列を取得でき、 Display Name
をキーに該当のデバイスを探します。
探したら構造体の Url
メンバーを使って Media Player
の Open Url
関数を使ってオーディオデバイスを開きます。
1.2. MediaSound
コンポーネント
Media Player
でURLを開いただけでは、ゲーム内で音は聞こえません。MediaSound
コンポーネントを持ったアクターをレベル内に配置します。コンポーネントの設定項目に、 Media Player
があるので、ここにデバイスを開く用途の Media Player
を設定します。
Base Submix
という設定項目には、新規に作成した Submix
を指定します。この Submix
に明示的に出力することで、 Media Player
で得られた音が Submix
にルーティングされ、エフェクトをかけたり解析をおこなったりすることができます。なお、ゲーム内で解析のみ行い音を出力させたくない場合は、この Submix
ではなく(ここで指定すると解析もおこなえないため)、ひとつ下流の Submix
や Master Submix
の Output Volume
を0にしてやればOKです。
2. 既存のノードでできる解析
ここではオーディオリアクティブを実現することを念頭に、既存のノードでできうる可視化について簡単に説明します。現状は、Submix
を起点に解析を行うようなデザインになっているように見受けられます。Submix
は、ローパス、ハイパス、バンドパスのフィルターやイコライジングもできるために、たとえば、一つの音源からバスドラを強調したSubmix
とメロディーを強調したSubmix
を別々に取得して別々に描画する、といったことができます。
2.1. Blueprintノード
周波数成分の取得: Add Spectral Analysis Delegate
Submix
の関数で、音の波形を特定のアルゴリズムを用いて周波数成分に分解できます。非同期で実行し、コールバックから、成分の値を配列で取得できます。どの周波数帯域をどのような間隔で欲しいかを引数で指定します。コールバックを受け取るには、事前に Submix
の Start Spectral Analysis
関数を呼ぶ必要があります。
エンヴェロープの取得: Add Envelope Follower Delegate
エンヴェロープは音量の変化曲線を指します。Submix
の関数で、非同期で実行し、チャンネル毎の音量を取得できます。コールバックを受け取るには、事前に Submix
の Start Envelope Following
関数を呼ぶ必要があります。
ただどうやら、オーディオをそのままサンプリングした波形データを取得するような関数は Submix
には無いようでした。
2.2. Niagaraノード
周波数成分の取得: Audio Spectrum
波形の取得: Sample Audio Buffer
2つとも、Submix
を指定して、波形サンプルや解析結果を受け取り、浮動小数の配列から正規化座標(0-1の値)で指定してサンプル値を取得します。エンヴェロープの値の読み出しは無いので、必要であればBlueprintなどからパラメータとして渡して上げる必要があります。 Submix
を指定しない場合は、デフォルトのMaster Submixが指定されます。
注意としては、Niagaraの場合、Submixの中の設定項目である Auto Deactivate
のチェックを外さないと値の読み出しが動きません。
参考
公式ドキュメント
ヒストリア様のSubmixに関する記事