LoginSignup
10
7

[UE] オーディオインターフェースからの入力と可視化

Last updated at Posted at 2021-05-02

UE4では、マイク入力やオーディオインターフェースの入力をリアルタイムに取り込んで、音の解析結果をビジュアライズすることができるということが以下の動画からわかります。

しかし、実際に音をデバイスからリアルタイムに取り込む方法や、Blueprint/Niagaraでそれぞれどのようなことが実現できるかといった情報が断片的であったりします。なのでこのあたりを個人的なメモとしてまとめます。本記事では、

  • オーディオインターフェースなどのデバイスから音をリアルタイムに取得する方法
  • 既存のBlueprintノードでできる解析(可視化)
  • 既存のNiagaraノードでできる解析(可視化)

を扱います。間違いなどあればご指摘ください。

執筆時のバージョン: 4.26.2 -> 5.2.1 でも確認

以下は、BlurprintやNiagaraでオーディオを用いたエフェクトの例です。

0. オーディオミキサーの注意点

UE4のオーディオシステムは強力で、様々なDSP処理をゲームプレイにおける負荷を感じさせずに実現できます。空間に応じたリバーブや減衰などの動的な処理はその端的な例です。ミキシングにおいても Sound ClassSubmix というエンティティを用いて細かく調整できます。Sound Class は音源をグループ化してボリュームなどのパラメータを一括で乗算をするのに対して、Submix がオーディオシグナルのミキシングをつかさどる単位でミキサーのチャンネルに近いエンティティとなります。Submix にエフェクトをアサインできたり、解析をしたりすることができます。様々な音源再生は全て Submix にアサインされてミックスされます。

全ての音源や Submix はフラットな状態で Master SubmixにデフォルトでアウトされますMaster SubmixProject Settings > Engine > Audio > Master Submix で指定します。Submix 自体の説明は、公式ドキュメントHistoria様の記事を読むと理解がはかどります。

prjsettings.png

デフォルトで設定されている MasterSubmixDefaultEngine Content 配下にある Submixです。Masterも上げ下げしたかったりする場合は Engine Content のものよりも Content 配下に自前でつくってしまったほうが良いでしょう。

理解するのに時間がかかったのは、 全ての音源の Master Submixへのアウトは暗黙的である ということです。音源がわたる Submix 指定を None にしても音が聞こえる、つまり内部で暗黙的に Master Submix にアウトしているということです。この特性は Submixそれ自体にもあてはまるので、 Master Submix に結線されていなくても暗黙的に拾われてしまいますし、そのままだとPlay中に音が聞こえてしまいます。

具体的に説明するために、新規の Submix として RealTimeAudioSubmixMasterSubmix をそれぞれ作成し、 MasterSubmix をプロジェクトのマスターに設定してる状態で2つを結線します。

image.png

この場合の RealTimeAudioSubmix は当然 MasterSubmix にアウトされるのは理解できるのですが、

image.png

線を切ってしまっても、 MasterSubmix から RealTimeAudioSubmix の音が聞こえるのです。Submix をユースケースとして意識しない場合は暗黙的に出力されるほうが楽ですが、Submix をミキサーとして使っていきたい場合はその点が少し困ったりもします。

1. デバイスから音を取り込む

ここでは、オーディオインターフェースやVoiceMeeterのようなバーチャルデバイスの入力を想定します。

1.1. デバイス選択

デバイス入力の取得は Media Player経由で行います。

image.png

Media Player作成時、ビデオを出力する Media Texture を作成するか選べますが、今回はオーディオデバイスなのでチェックをはずします。

mediadevice.png

Media Playerを作成して開くと、左上のフォルダアイコンから入力デバイスを手動で選ぶことができます。とりあえず確認だけしたい場合は、ここから選んで出力を確認することができます。しかし PIE での動作やビルドしたときの実行ファイルで音をひろいたい場合は、 Blueprint などで明示的に選択する必要があります。

image.png

グローバル関数の Enumerate Audio Capture DevicesMedia Capture Device 構造体の配列を取得でき、 Display Name をキーに該当のデバイスを探します。

image.png

探したら構造体の Url メンバーを使って Media PlayerOpen Url 関数を使ってオーディオデバイスを開きます。

1.2. MediaSound コンポーネント

Media Player でURLを開いただけでは、ゲーム内で音は聞こえません。MediaSound コンポーネントを持ったアクターをレベル内に配置します。コンポーネントの設定項目に、 Media Player があるので、ここにデバイスを開く用途の Media Player を設定します。

image.png

Base Submix という設定項目には、新規に作成した Submix を指定します。この Submix に明示的に出力することで、 Media Player で得られた音が Submix にルーティングされ、エフェクトをかけたり解析をおこなったりすることができます。なお、ゲーム内で解析のみ行い音を出力させたくない場合は、この Submix ではなく(ここで指定すると解析もおこなえないため)、ひとつ下流の SubmixMaster SubmixOutput Volume を0にしてやればOKです。

out.png

2. 既存のノードでできる解析

ここではオーディオリアクティブを実現することを念頭に、既存のノードでできうる可視化について簡単に説明します。現状は、Submix を起点に解析を行うようなデザインになっているように見受けられます。Submixは、ローパス、ハイパス、バンドパスのフィルターやイコライジングもできるために、たとえば、一つの音源からバスドラを強調したSubmixとメロディーを強調したSubmixを別々に取得して別々に描画する、といったことができます。

2.1. Blueprintノード

周波数成分の取得: Add Spectral Analysis Delegate

Submixの関数で、音の波形を特定のアルゴリズムを用いて周波数成分に分解できます。非同期で実行し、コールバックから、成分の値を配列で取得できます。どの周波数帯域をどのような間隔で欲しいかを引数で指定します。コールバックを受け取るには、事前に SubmixStart Spectral Analysis 関数を呼ぶ必要があります。

image.png

エンヴェロープの取得: Add Envelope Follower Delegate

エンヴェロープは音量の変化曲線を指します。Submixの関数で、非同期で実行し、チャンネル毎の音量を取得できます。コールバックを受け取るには、事前に SubmixStart Envelope Following 関数を呼ぶ必要があります。

image.png

ただどうやら、オーディオをそのままサンプリングした波形データを取得するような関数は Submix には無いようでした。

2.2. Niagaraノード

周波数成分の取得: Audio Spectrum

image.png

波形の取得: Sample Audio Buffer

2つとも、Submix を指定して、波形サンプルや解析結果を受け取り、浮動小数の配列から正規化座標(0-1の値)で指定してサンプル値を取得します。エンヴェロープの値の読み出しは無いので、必要であればBlueprintなどからパラメータとして渡して上げる必要があります。 Submix を指定しない場合は、デフォルトのMaster Submixが指定されます。

image.png

注意としては、Niagaraの場合、Submixの中の設定項目である Auto Deactivate のチェックを外さないと値の読み出しが動きません。

Untitled.png

参考

公式ドキュメント

ヒストリア様のSubmixに関する記事

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7