[MR Dev Tips #8] HoloLens 2 の空間オーディオ (Spatial Audio) を有効にする

# はじめに
今回は HoloLens 2 アプリケーションで **Spatial Audio (空間音響)** を有効にする方法についてご紹介したいと思います。詳しい手順は、MS Learn - [HoloLens 2 アプリケーションの空間オーディオをアクティブ化する](https://learn.microsoft.com/ja-jp/training/modules/spatial-audio-tutorials-mrtk/) でまとめられているので、本記事では要点のみをご紹介いたします。

# 検証環境
- Unity 2020.3.48f1
- MRTK v2.8.2

# 基礎知識
### 空間オーディオ ( Spatial Audio ) とは
空間オーディオとは、複数の特定のスピーカーを設定しなくても、音を周囲全体で知覚できるようにする、さまざまなオーディオ再生技術を指しています。( [空間オーディオ](https://learn.microsoft.com/ja-jp/training/modules/spatial-audio-tutorials-mrtk/2-add-spatial-audio-to-your-unity-project) より引用 )

### HRTF (Head-Relation Transfer Function)
人間は音源から左右の耳に入る音の強弱と時間の微妙なズレによって、一種の三角測量によりその音の発生源を認識することができます。この音源から両耳までの特性を **頭部伝達関数 (HRTF: Head Related Transfer Function)** と呼びます。（ [Sony Japan | 技術解説](https://www.sony.co.jp/Products/vpt/tech/) より引用 ）

- [Sony Japan | 技術解説](https://www.sony.co.jp/Products/vpt/tech/)
- [HRTF エッチアールティーエフ](https://www.g200kg.com/jp/docs/dic/hrtf.html)

HRTF ベースアルゴリズムを使用したオーディオ処理には、大量の特殊の計算が必要となります。HoloLens 2 には、アプリケーションプロセッサへの負荷を回避するために活用できる専用のハードウェアが含まれているため、HRTFベースアルゴリズムの処理をオフロードできる。Microsoft Spatializer プラグインを使用すると、アプリケーションから簡単にHRTF専用ハードウェアを活用できるようになるため、アプリケーションプロセッサの大部分を空間オーディオではなく、アプリケーション操作のために使用できます。

### Microsoft Spatializer
Microsoft Spatializer は、Unity の空間オーディオ用 Audio Source コンポーネントにアタッチされたプロパティを上書きします。HoloLens での空間音響は、Audio Spatializer プラグインを使用して、有効化することができます。プラグインのファイルは Unity にバンドルされており、編集タブから Microsoft HRTF 拡張機能を有効にするだけで空間音響を有効化することができます。Microsoft Spatial Sound は現在48kHz のサンプリングレートのみをサポートしています。

# 手順
Microsoft Spatializer をダウンロードして、プロジェクトにインポートします。Microsoft Spatializer パッケージは GitHub もしくは、Mixed Reality Feature Tool からインポートすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/a1609a71-3a06-f923-22c2-2e4ccf0636fb.png)

``Edit > Project Settings > Audio`` を開いて、Spatializer Plugin を **Microsoft Spatializer** に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/c0a20b21-c2aa-5b49-867b-28cc2392c018.png)


MRTK初期セットアップ済みの空のシーンに **PressableButtonHoloLens2** (prefab) を追加します。

Transform を以下の値に修正します。

- Position (0, -0.4, 2)
- Rotation (0, 0, 0)
- Scale (1, 1, 1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/c3d0f175-397c-d497-f71e-bc991ae5176b.png)

Audio Mixer ウィンドウを開きます。``Window > Audio > Audio Mixer`` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/8bd3bfef-e9d7-4cfa-aca0-97c6f2930123.png)

Mixer の隣にある + ボタンをクリックして新しいミキサーを作成します。新しいミキサーには、Master という名前の標準グループが含まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/41fb5029-6919-3c8e-04e7-ea44bb1f730f.png)

ヒエラルキーウィンドウで PressableButtonHoloLens2 を選択して、インスペクターウィンドウで Audio Source コンポーネントの設定を追加します。必要な設定項目は以下の通りです。

1. 出力プロパティに作成したミキサーを選択する
2. Spatialize (空間化) チェックボックスにチェックを入れる
3. Spatial Blend (空間比率) スライダーを 3D (1) に変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/50503314-a5c2-19b6-f70d-2a048c281fcf.png)

Unity の既定の設定では、聞き手が遠ざかるにつれて空間オーディオを減衰させます。この減衰が対話操作のフィードバック音に適用されている場合、インターフェースが使いづらくなります。この減衰設定を無効にするためには、Audio Source コンポーネントの Volume (音量) 曲線を調整する必要があります。

1. [Volume Rolloff] プロパティを [線形ロールオフ] に設定します
2. [Volume] 曲線 (赤い曲線) のエンドポイントを、y 軸の '0' から '1' にドラッグします
3. [Volume] 曲線の形をフラットに調整するには、白の曲線コントロールを、X 軸に平行になるようにドラッグします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/58a52ef8-1650-f863-65cb-b9baea03a56b.png)

これで作業は終了です。後は HoloLens 2 へデプロイして試してみると、空間オーディオ ( Spatial Audio ) が実現されていました。

# Refs
公式ドキュメント
- [HoloLens 2 アプリケーションの空間オーディオをアクティブ化する](https://learn.microsoft.com/ja-jp/training/modules/spatial-audio-tutorials-mrtk/)
- [microsoft/spatialaudio-unity - GitHub](https://github.com/microsoft/spatialaudio-unity)
- [立体音響の概要](https://learn.microsoft.com/ja-jp/windows/mixed-reality/design/spatial-sound)
- [How to add the plugin to Unity projects](https://github.com/microsoft/spatialaudio-unity/blob/develop/Documentation/QuickStart.md#1-add-the-spatializer-package-reference-to-manifestjson)

補足情報等

- [「空間オーディオ」って何？ アップルとソニーの違いは？ 分かりやすく解説](https://www.moguravr.com/spatial-audio-explanation/)
- [頭部伝達関数（HRTF）](https://xtech.nikkei.com/dm/article/WORD/20060314/114835/#:~:text=%E9%9F%B3%E6%BA%90%E3%81%8B%E3%82%89%E8%80%B3%E3%81%AB%E8%87%B3%E3%82%8B,%E9%83%A8%E4%BC%9D%E9%81%94%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82)
- [音が聞こえる仕組み | 鼓膜ナビ](https://nobelpark.jp/contents/komakunavi/sound/#:~:text=%E9%9F%B3%E3%81%AF%E7%A9%BA%E6%B0%97%E3%81%AE%E6%8C%AF%E5%8B%95,%E3%81%A6%E8%84%B3%E3%81%AB%E4%BC%9D%E3%81%88%E3%81%BE%E3%81%99%E3%80%82)