らくとあいすの備忘録

twitter : lactoice251

VRの世界に音を存在させる

こんにちは。らくとあいすです。 VRChatワールド探索部 Advent Calendar 2022 12日目の記事です。

本記事では、VRChatをはじめとするVRの世界において、「音をそこに存在させる」ための技術と、そのVRChatでの利用方法を紹介します。想定する読者としては、

  • VRChatで音のあるワールドを作ってみたい人
  • VRChatのワールド探索や音楽ライブを音の視点からもっと楽しみたい人
  • 立体音響についてごく基礎的な事項を知りたい人

などになると思います。ただし私は、立体音響やゲームサウンドの専門家ではないため、いちVRChatのワールド制作者として、種々の文献等を頼りに記事を執筆しております。誤った情報がないように努めておりますが、学術的な信頼性を期待出来る水準の記事ではない点ご留意いただければと思います。

1. はじめに

現実の私たちの生活空間にはたくさんの音があります。音は、物体の振動や空気の流れによって空気が揺らされることによって発生します。揺らされた空気は波として伝播し、部屋の床や壁などの物体に反射し、共鳴し、一部は吸収されます。それらが、最終的には耳介によって耳の中に集められ、鼓膜を揺らすことで人間に認知されます。従って、音はその発生源の性質はもとより、音の発生源から鼓膜に到るまでの環境や、自身の耳の形状といった多くの情報を含んだ形で、私たちに届けられることになります。例えば、トンネルに入った時の足音の変化で、私たちは目をつぶっていてもその環境の変化をうかがい知ることが出来ます。

一方で、イヤホン、またはヘッドホンといった耳に直接取り付けるデバイスを用いた場合は、そうした現実空間の影響をほとんど受けない形で音を聴くことになります。予めデジタルデータとして記録した音の粗密を、スピーカーの振動として現実空間に再現し、スピーカーと鼓膜の間のごく短い経路を通って我々に届けられます。スピーカーやその筐体の特性を受けるため、デジタルデータそのものの形の波面が耳に届くわけではありませんが、少なくとも良く調整された一定以上の品質のヘッドホン・イヤホンでは高い再現度で音を再生出来ます。

VRChatをはじめとしたVRの世界では、ほとんどの場合イヤホンやヘッドホンから再生された音を聴くことになります。当然、VRの世界の環境の影響を、直接的に音が受けることはありません。左右2チャンネルのステレオ音源が用意されたのであれば、再生装置はそれを律儀に再生するのみで、頭をふっても、トンネルに入っても勝手に音が変わることはありません。

従って、作られたVRの世界の中で、あたかもその世界で発された音が存在しているように感じさせるためには、その状況で我々が聴く音を計算によって再現する必要があります。これは、非常にシンプルな状況であればあまり難しいことではありません。例えば、反射も吸収もない無響室のような部屋の中 (自由空間) で、ある一点から発される音 (点音源) は、距離の二乗に比例して減衰します。しかし、現実的な状況を考えると、ある地点で観測する音には、わずかに遅れて到達する無数の反射音が重ね合わされるほか、頭部での遮蔽や耳介での反射の影響を受けて変化します。音源も点音源ではなく、一般には大きさをもっています。これらの条件を近似無しに計算して聴こえる音を計算することは現実的には不可能であるので、実際には様々な近似のもとでの計算を行うことになります。

本記事では、実際にVRの世界におけるいくつかの状況を想定しながら、各状況において適切な音提示の手法について紹介します。

2. 空間に存在するように音を鳴らす手法

2.1 オブジェクトベースの立体音響

VR空間で特定のオブジェクト (例えばハンドベル) から音が鳴るような状況を考えます。この時期待される挙動は、

  • オブジェクトの見えている方向から音が聴こえてほしい
  • 音の聴こえ方は、頭の回転に追従して変わってほしい
  • 近づいていけば、今度は耳元の近くで鳴っているように聴こえてほしい

といったようなものだと思います。この挙動を再現するためにはまず、人は何故左右や上下、距離感を感じ取れるのかということを考える必要があります。

音源の水平回転方向 (方位角) の認知においては直感的にも明らかなように、左右の耳に届く音の大きさの差 (Inter level difference; ILD) が影響を及ぼします。これは、右から来る音は右耳で大きく聴こえるという、ごく単純な話です。しかし、低い音、すなわち波長の長い音については回折によって頭部を回りこんで反対側の耳に届く割合が大きいため、ILDが方向知覚にあまり役に立たなくなります。そこで活用されるもう一つの情報が、左右の耳に届く音の時間差 (Inter time difference; ITD) です。我々の耳は1ms以下の非常に小さな音の時間差を聴きとることが出来るため、左右の耳に音が届く僅かな時間差の情報を音の方向を捉えるのに活用出来ます。ここで、110Hzのサイン波について、左耳より右耳の音を10dB小さくしてILDを再現したものと、それに対してさらに右耳の音を2ms遅らせてITDを再現したものを聴いていただきます。ITDの付与により、より明確に音源方向が感じ取れることが分かると思います。

  • ILDの再現のみ

  • ILD + ITDの再現

音源の垂直回転方向 (仰角) の認知については、一般に方位角と比べて弁別が難しい。これは、我々が左右二つしか耳を持っていないために、垂直方向の音源の移動に対してはILDやITDが顕著な特徴として表れないためです。それでも、我々の頭は上下方向に対称な形をしていないため、上から来る音と下から来る音では、耳に入るまでの反射や吸収のパターンがわずかに変化します。この変化は、特定の周波数の音の吸収 (ノッチ) に現れることが知られており、スペクトル的手がかり (Spectral cue; SC) と呼ばれています*1。なお、このSCは音の前後判定にも寄与しています。音源との距離の認知については一般的にあまり容易ではありません。ただし、こちらも左右の耳に届く音の角度差によって変化するスペクトラルキューや、ILD、ITDとの関連があることが報告されています*2。また、実環境においては、遠くの音ほど部屋の反響の影響を受けて音像がぼやけるといったことも距離を認知する手がかりとなります。

VRChatでは珍しくないが、耳が4つ付いている場合は、上下方向のITDが利用出来るため、仰角知覚の精度が向上するかもしれない。写真提供:えなじーさん、モデル:翠蓮

VR空間において、音の方向や距離感を再現するためには、人間が利用している音の手掛かり (ILD、ITD、スペクトラルキュー) を、頭部トラッキングに基づいて算出される頭の角度、音源との距離等に応じて変化させれば良いと考えられる*3。そのために、現在最も良く用いられる方法が、実際に人間の耳内にマイクを装着して測定した、頭部インパルス応答 (Head-Related Impulse Response; HRIR)を利用するものです。

インパルス応答についてや、その測定方法はより詳しい文献を紹介するにとどめさせて頂きますが*4、HRIRは簡単に言えば無響室内に居る人の近くでごく短い音 (パルス音) を鳴らした時に耳内に到達する音波を測定したものです (ただし、実際の測定には短い音ではなく、Swept-sineやM系列等を用いる)。誤解を恐れずに言えば、あらゆる音は無限に短いパルス音を強さを変えながら連続的に足し合わせたようなものであり、耳に届く音はそれぞれのパルス音に対するHRIRを足し合わせたものと言えます。このような演算を、畳み込み (Convolution) と言います。

VR空間内においてある距離・角度に音源が現れた際には、事前にその距離・角度に最も近い場所で収録されたHRIRを選び出し、それを音源に畳み込むことによってその位置から到来した音の聴こえを再現出来るというわけです。とはいえ、この方法にもまだ課題はあり、例えばVR空間上で音源が発生する位置は (少なくともfloat精度程度には) 連続であり、その細かさで現実空間のHRIRを測定することは不可能です。これには、インパルス応答の補完などの手法の利用が研究されています。またHRIRは、耳や頭の形状に影響を受けるため、他人の頭部によって収録されたHRIRを用いた場合に期待する定位感が得られない場合があることが知られています。この影響の軽減のため、多くの場合複数人のHRIRを平均した応答が立体音響の生成に用いられています (おそらくVRC_SpatialAudioSourceもこの方式) *5。また、近年では耳の画像等の情報を利用して、個人に最適なHRIRを選び出す方式も登場しています*6

最後にVRChatにおいて、このHRIRに基づく立体音響を利用する方法についても触れます。これは、シーン上に配置したAudioSourceにVRC_SpatialAudioSourceコンポーネントを取り付けるだけで実現されます。ただし、以下のいくつかの設定を確認する必要があります:

  • VRC_SpatialAudioSourceコンポーネント内、Enable Spatializationにチェックを入れる
  • AudioSourceのプロパティでSpatial Blendを3Dにする

ちなみに、Enable Spatializationにチェックを入れない状態でAudioSourceのプロパティ上でSpatial Blendを3Dとした場合HRIRの畳み込みは行われず、ILDのみを用いて音の方向が提示されます。これらの比較については、過去の記事で実験結果を共有しているため必要に応じて参照して頂ければと思います。実在感のあるオブジェクトベース立体音響を目指す場合、ほとんどの場合はEnable Spatializationにチェックを入れるべきですが、次のようなケースではチェックを外す選択肢もあるかもしれません:

  • VRChat上での配信ライブ
    • TopazChatやTwitchを経由してVRChat上に音を配信する形式のライブにおいて、配信の音を最も変化なく伝える方法は、AudioSourceのSpatialBlendを2Dとしてステレオ再生することです。しかし、これでは観客の頭の運動等に音がまったく連動しないため、臨場感が削がれるかもしれません。一方で、AudioSourceのSpatialBlendを3DとしてEnable Spatializationを有効にした設定を用いた場合、「配信の音がスピーカーの方向から鳴っていてそれを実際に耳で聴いたときの音」に近いものが聴こえることになるため、配信の音そのものとは若干音が変わってしまいます。それは正しい音の変化とも言えますが、そのような変化を嫌い・かつ頭の運動に伴う音像の変化が欲しい場合については、AudioSourceのSpatialBlendを3Dにして、かつEnable Spatializationを非有効にする手もあるかもしれません。ここは演者と主催者のポリシーによるところであると思います。(切り替えUIが標準的に設けられるようになると良いかもしれない。)
  • 非常に大量の音源がある、かつ低演算量を目指す場合
    • 演算量については、検証出来ていないためたしかな事は言えませんが、HRIRの信号への畳み込みに一定のCPUリソースを食われることはたしかです。音源が大量に存在する場合、負荷はその分増大するため、低演算量を要求されるプロジェクトの場合、Enable Spatializationを非有効とすることは一つの選択肢になりうるかもしれません。(もちろん、実際のプロファイルに基づいて行われることが望ましい。)

VRC_SpatialAudioSourceの音響特性の調査。(上図) VRC_SpatialAudioSourceを用いない3DAudioSourceを頭の周囲で移動させた時の、左耳での周波数応答。(下図) VRC_SpatialAudioSourceを用いた場合での同様の測定。3DAudioSourceでは単に再生音量が変わるだけなのに対して、VRC_SpatialAudioを用いることで、周波数応答に方向に特有のノッチやピーク (SC) が出現することがわかる。(詳細は過去の記事を参照)

2.2 残響について

2.1節では、音の伝搬における頭部や耳の影響を取り込むことで、方向や距離を感じ取ることの出来る音を作り出す手法について述べました。ただし、ここでは部屋の壁や天井といった、体以外の物体による音の伝播への影響が考慮されておらず、ほとんどの場合でHRIRは無響室において収録されたものが用いられています。

部屋の影響を取り入れるためのもっとも直接的な方法は、音源から耳に届くまでのあらゆる音の反射経路を取り出し、それらの経路において耳に届くまでの時間と減衰・吸収を求めることです。これは、部屋形状がごくシンプルな場合にはある程度現実的な計算量で計算可能であり、例えば「鏡像法」というアルゴリズムが良く知られています。鏡像法や、Unity上での鏡像法のシミュレーションについては、よしたかさんによるこちらの講演資料に詳しいです*7

ただし、鏡像法等の方法によって、逐次に音源から人までの反射経路と遅延を計算することは非常にコストが高く、部屋形状が複雑であったり音源が複数個となった場合はさらに困難です*8。そこで多くの場合は (頭部の場合と同様) 室内の物体の音への影響をインパルス応答として測定 (または生成)し、このインパルス応答を音源に畳み込むことによって、残響 (リバーブ) を表現します。このような方式のリバーブをコンボリュージョン・リバーブと呼びます。

VRChat(Unity) において利用出来るリバーブもコンボリュージョン・リバーブです。これは、AudioSourceにAudioReverbFilterを取り付けるか、Audio Listenerを取り付けたMain CameraにAudioReverbFilterを取り付けることで適用可能です。前者は、取り付けたAudioSourceのみへのリバーブ、後者は聴こえる全ての音へのリバーブとなります。

ちなみに、VRChatにおいてPost processing stack (PPS) とMainCameraに取り付けるリバーブを併用する場合、VRC Scene DescriptorのReference Cameraとして設定したPost-process layerを設定したCameraに、AudioReverbFilterを追加してしまうと、この効果が反映されないという問題がある。この場合は、「Main Camera」という名前のCameraを一つ用意してこちらに、AudioListenerとAudioReverbFilterを取り付け、Reference Cameraとして設定するPPS付きのCameraにはAudioListenerやAudioReverbFilterを取り付けないようにする必要がある。

UnityのAudioReverbFilterでは、プロパティからコンボリュージョン・リバーブの設定を変更出来ます。これは、部屋の形状や壁面の反射率に合わせてリバーブをコントロールするために用いることが出来ます。プロパティの詳細は公式ドキュメントに記載されている通りですが、ここでもそれぞれの設定項目について簡単にまとめておきます。

  • Reverb Preset: プリセットとしていくつかの環境を想定したリバーブのバラメータが用意されています。"User"を選択した場合は、下記パラメータを用いて自分でリバーブの調整を行うことが可能となります。
  • Dry Level: 元信号 (リバーブを適用しない信号) のレベルです。
  • Room: リバーブを適用した信号のレベルです。
    • ところで、ドキュメントには"Room effect level at low frequencies"と記載されているが、一方でRoom LFにも"Room effect low-frequency level"と記載されています。こちらは、"at low frequencies"ではなく全体のレベルなのではないかと思っているのですが、実際のところは不明です。
  • Room HF (LF): リバーブを適用した信号のレベルの高音 (低音) 域成分のレベルです。
  • HF (LF) Reference: 高音域 (低音域) として設定する周波数の範囲を決めます。
  • Decay Time: 低音域での残響減衰時間です (何Hzを基準にしているかは不明。おそらく一般的には500Hzなど?)
  • Decay HFRatio: 低音域にたいする高音域の残響減衰時間の比です
    • 一般に現実空間であれば、高音域の方が物質に吸収されやすいため、残響成分では低音域が大きくなりやすい。 したがって、Decay HFRatioを1.0以上の値にするのは、物理的には考えづらい状況です。(そのような効果を狙うのであれば1.0を超えても良いと思います。)
  • Reflections Level: 初期反射のレベル
  • Reflections Delay: 初期反射の遅延時間
  • Reverb Level: 後部残響のレベル
  • Reverb Delay: 後部残響の遅延時間
    • 反射音として到来する音のうちはじめ (の方) にやってくる音を初期反射、後の方にやってくる音を後部残響といいます
    • 初期反射の遅延時間が大きい (= 直接音が到来してから反射音が到来するまでの時間が長い) ということは、音源との距離に対して部屋のサイズが大きいことを意味します

2.3 シーンベースの立体音響

ある程度遠方に、非常に多くの音源があるような場合を考えます。例えば、森の中で木々の葉がこすれたり、街中で無数の人が話したり歩いたり、雨が降っていたりといった状況が当てはまります。この状況は、2.1のオブジェクトベースの立体音響において非常に多数の音源が存在するケースとも言えるが、雨粒一つ一つの音に対してHRIRの畳み込み演算を行い立体音響を生成することは現実的ではありません。

このようなケースで現状 (VRChatワールドとして) 最も良く用いられている手段は、おそらく(Spatial blendを2Dとして、Enable Spatializationを非有効にしたAudioSourceを用いて) ステレオ音源を2D音源として再生する方式だと思います。この方法では、当然頭部の回転やプレイヤーの移動によって音が変化することはありませんが、雨音のように方向感のあまりない音に対しては多くの場合十分と言えます。ただし、建物の中から雨の降る屋外に移動したり、森を抜けて草原に出たりといったように、環境音がプレイヤーの動きによって動的に変化することが期待される状況は十分にあり得ます。このようなケースには、2DのAudioSourceの音量や、Low Pass Filter (LPF) 等の設定をプレイヤー位置に応じて変化させることで、ある程度対応可能です。2D AudioSourceの制御による環境音の遷移については過去の記事にも書いているため興味があれば参照して頂ければと思います。

より臨場感ある環境音の表現を得るために立体音響を導入するための手法としては、アンビソニックスの利用が挙げられます。アンビソニックスの詳細についてはより詳しい文献*9 を紹介するにとどめますが、ごく簡略化して言えば (同一球面上に配置された) 多数のマイクロフォンを利用して、観測地点からみた全天球上の音場を記録するフォーマットです。もう少し言えば全天球上の音場を、球面調和関数の各成分に展開して記録するものです。アンビソニックスの現在最も普及している形式は、一次アンビソニックス (First Order Ambisonics; FOA) と呼ばれるものです。これは、球面調和関数展開の1次までの項を利用するもので、無指向W (0次) と、X, Y, Z (1次) の4つのチャンネルから構成されます。アンビソニックス形式で記録された全天球の音場は、後から回転して再生することが可能です。アンビソニックスを利用すれば、VR空間においてプレイヤーの頭部回転に対して音場を逆方向に回転させることで、頭部の動きに追従した立体的な環境音を再生することが可能となります。ただし、アンビソニックスはあくまでも全天球上の音場を記録しているに過ぎないため、プレイヤーの並進運動に対応することは出来ません。従って、6DoFのVRコンテンツに用いる場合においては、プレイヤーのごく近くで鳴っているような音にはあまり適さない点に注意が必要です。

VRChatでのアンビソニックス形式の音の再生方法については、こちらの動画 が詳しいですが、簡単に日本語で手順を書いておきます:

  1. アンビソニックス形式の音源を用意する
  2. Unityのプロジェクトにimport
  3. Edit>Project settings>Audio>Ambisonic Decoder Plugin>Oculus Spatializerを選択します
  4. アンビソニックス音源のimport settingsでAmbisonicsにチェック、Load TypeをStreamingに変更しからApplyします
  5. シーンにAudio Sourceを設置し、Spatial blendを2D、VRC_SpatialAudioSourceのEnable Spatializationを非有効にします
  6. 上記AudioSourceのAudioClipとしてアンビソニックス音源を設定します
  7. アンビソニックス音源の正面方向を向けたい方向に、AudioSourceのZ軸を向けます

以上でアンビソニックス形式の音の再生が可能となり、実際にVRChatワールド内において頭を動かすことで音が変化することが確認出来ます。

3. さいごに

本記事では、主にVRChatで音のあるワールドを作る人に向けて、立体音響にまつわる基礎的な事項を紹介しました。非常に奥の深い分野で、書ききれていないところ、知識の至らないところ多々あったかとは思いますが、より詳細な文献に至る前段階として、少しでも理解の助けになれば幸いです。また、ワールドを探索する人にとっても、この記事がワールドを音の観点からより楽しめるようなきっかけとなれば幸いです。

*1:K. Iida+, "Median plane localization using a parametric model of the head-related transfer function based on spectral cues", Applied Acoustics vol. 68, 2007, URL: http://www.iida-lab.it-chiba.ac.jp/literature/research.papers/14.median.plane.localization.using~.aa-2007.pdf

*2:金 海永 他 (2000)、拡張輻輳角モデルを用いた音像距離定位の制御 日本バーチャルリアリティ学会論文誌 vol.5 No.3、URL: https://www.jstage.jst.go.jp/article/tvrsj/5/3/5_KJ00007553639/_pdf/-char/ja

*3:谷幸雄 (2017)、頭部伝達関数による音像定位 日本音響学会誌73巻3号 小特集—頭部伝達関数とその応用—、URL: https://www.jstage.jst.go.jp/article/jasj/73/3/73_173/_pdf

*4:河原英紀 (2020)、インパルス応答の基本概念 日本音響学会誌 76 巻 3 号、URL: https://www.jstage.jst.go.jp/article/jasj/76/3/76_148/_pdf

*5:平均HRIRを用いた場合、当然そのデータの平均から外れた頭部・耳の形状の場合は立体音響の質が下がってしまう。おそらく、ほとんどの日本人にとってVRChat上での音は十分な立体音響として聴こえていないのではないかと思う。実際私も、VRChat上で上下や前後の判定を行うことは結構難しいと感じた。

*6:SONY 360 Reality Audio: https://www.sony.jp/headphone/special/360_Reality_Audio/

*7:吉高 弘俊、VR音響のための鏡像法による距離減衰の再現、URL: https://learning.unity3d.jp/2121/

*8:とはいえ、近年は計算機パワーの増大に伴って動的に変化するようなリバーブについても導入がはじまっているらしい

*9:西村竜一 (2014)、特集記事「アンビソニックス」 映像情報メディア学会誌 Vol. 68 No. 8、 URL: https://www.jstage.jst.go.jp/article/itej/68/8/68_616/_pdf