Unity向け Steam Audio SDK を使って立体音響を導入しよう
はじめに
Steam Audio とは、VRやMRの開発に伴いより没入感を増すために、Valve社が開発したオーディオ環境です。
物理演算を中心にした音響を生成することができ、立体音響のようなリアルなオーディオ環境を作ることができます。
特別な機材やソフトも必要なく、既存の音声ファイルにエフェクターを付けることで組み込むことができます。
UnityやUnreal Engine 4で、使用できるようにライブラリが提供されています。
どんな感じかわからない人は、デモ動画を見てみてください。
Steam Audio Sound Propagation Demo
使い方
セットアップ
Steam Audioからダウンロードしましょう。
Zip形式でダウンロードできるので解凍し、bin/unityの中にあるSteamAudio.unitypackageをインポートしましょう。
初期設定として、Edit > Project Settings > Audioから
Spatializer PluginをSteam Audio Spatializerに変更する必要があります。
初期設定を終えたら、Windowの中にSteam Audioが追加されているので選択しましょう。
選択すると、Sceneの中にSteam Audio Manager Settingsが追加されます。細かい設定はここで出来ますが、Audio Engineの項目がUnityになっていることを確認したら、デフォルトの設定で問題ないのでそのままウィンドウを閉じてください。
簡易的な立体音響をやってみよう
適当に音を出すオブジェクトを作り、それにAudio Sourceを追加してみましょう。
追加すると、Audio Sourceの中にSpatializeという項目があるので、チェックを入れましょう。
これだけでも実行してカメラの位置を移動させると、立体音響に聞こえます。
ですが、デモ動画のような表現にはなっていません。
細かい設定をしてクオリティを上げよう
Audio SourceにSteam Audio Sourceを追加することで、音源ごとの設定を調整できます。
Steam Audio Sourceを追加していない場合でも以下の設定が適応されています。
Steam Audio uses the following settings by default when spatializing an Audio Source:
• HRTF-based binaural rendering is enabled.
• Physics-based attenuation is off; the distance curve configured on the Audio Source is used.
• Frequency-dependent air absorption is off.
• Occlusion and transmission are off.
• Indirect sound (reflections and reverb) are off.
「Steam Audio Source」のプロパティ
■Direct Binaural:HRTFベースの3Dサウンドを使用する。
■HRTF Interpolation:HRTFを使用した補完処理の方法を以下の二つから選択する。
-
Nearest:最も近い方向の有効な音源から出たHRTFを使用する。
-
Bilinear:複数の方向から得た音源のHRTFを元に計算する。しかしCPUの処理がNearestに比べて2倍以上必要とする。
■Physics-Based Attenuation:物理ベースの距離減衰を使用する。
■Air Absorption:空気吸収を有効にする。有効にすると、音の周波数によって減衰するスピードが変わる。高い周波数であればあるほど早く減衰する。詳しくは「音の空気吸収」で調べてください。
■Direct Mix Level:どのくらい元の音にミックスするか調整します。
■Direct Sound Occlusion:のちに説明します。
ここら辺の値を調整することで、かなりクオリティの高いものになります。
音の反響をさせてみよう
ここからが結構面倒なのですが、Scene全体のオブジェクトを認識させ、音の反射を計算させる方法(オクルージョン計算)を紹介します。
イメージとしてはライティングの設定や調整を思い浮かべていただくとわかりやすいのですが、各オブジェクトの位置や材質を設定し、Bakeすることによって音の反響のモデルを作成することができます。
オブジェクトの設定
Mesh RendererがあるオブジェクトにSteam Audio Geometryを追加すると、音の反響に影響されるようになります。
さらに物体の材質の設定をしたい場合は、Steam Audio Materialをオブジェクトに追加しましょう。あらかじめ用意されているPresetを選べる他、独自の設定も使用することもできます。
なお一個一個設定する必要はなく親オブジェクトに適応した後、Export All Childrenをチェックすると一括して登録されます。
一通りオブジェクトに設定して終わると、Steam Audio Manager Settingsからオブジェクトの設定を反映させてください。
Sceneの中にあるSteam Audio Manager Settingsの中のSteam Audio Manager にあるPre-Export Sceneを押してください。
音源の設定
上記の設定のほか、Steam Audio Sourceにも手を加える必要があります。
Direct Sound Occlusionを変更する必要がありますが、いくつか選択肢があるので紹介します。
■Direct Sound Occlusion:オクルージョン計算の方式を選択できます。
-
Off:オクルージョン計算が無効になります。デフォルトの値です。
-
On, No Transmission:オクルージョン計算が有効になります。閉塞音は聞こえません。
- On, Frequency Independent Transmission:オクルージョン計算が有効になります。閉塞した音は、閉塞しているオブジェクトの材質に基づいて、オブジェクトを通過する際に減衰されます。周波数は考慮されません。
- On, Frequency Dependent Transmission:オクルージョン計算が有効になります。閉塞した音は、閉塞しているオブジェクトの材質に基づいて、オブジェクトを通過する際に減衰されます。減衰する音は周波数に依存するので、高周波数音が物体を通過するときに、低周波数音よりも減衰されたりします。
Off以外のどれかを選択すれば、オクルージョン計算が有効になります。
オクルージョン計算がOn(有効)になると、Occlusion Methodが有効になります。
■Occlusion Method:音源の反射の計算方法を選ぶことができます。
-
Raycast:音源からリスナーに向かって一本の線を引きます。線の間にオブジェクトがあった場合、遮断されていると判断します。
-
Partial:Source Radiusに基づいて、音源からリスナーに複数の線を引きます。遮断される線の割合によって値を決めます。処理負荷は高めです。
Partialを選択している場合のみSource Radiusが設定できます。
Source Radius:音源の見掛け上の音量を設定できます。半径が大きいほど音が遮られにくくなります。
終わりに
紹介した設定は一部ですが、とりあえず一通りの方法を紹介しました。
まだまだ私も勉強不足ですので、良い知見があればまた紹介します。