らくとあいすの備忘録

twitter : lactoice251

VRC_SpatialAudioSourceの音響特性

またまた、VRC_SpatialAudioSourceの話。 毎回もう使わないって言ってる気がするけど、代替を考えるためには良く知る必要がある...。 今回は、そもそもVRC_SpatialAudioSourceってどのぐらいちゃんと「Spatialization」してるんだろうかという話。 ドキュメントには逆二乗減衰しか書いてないので本当にわからない。

角度に対する応答の検証

Head-related transfer function (HRTF) の畳み込みなどのちゃんとしたSpatializationの効果が入っているとすると、前後左右上下で周波数特性に差が出るはず。さらに左寄りまたは右寄りの位置の音源に対しては、波が左右の耳に到達するまでの時間差から左右位相差が現れるはず。これらを確かめるため、VRChatで記録したデータからVRC_SpatialAudioSource有/無の場合を比較する。

実験は前後左右上下の6つのAudioSourceから、ホワイトノイズを発することによって行う。体の向きによってAudioSourceと受聴点の関係が変わらないように、常にプレイヤーの頭に全てのAudioSourceが追従するようにU#Scriptで制御した。また、Spatializationが非有効かつSpread=0のとき、左90度の音源に対して右側での音量は0となるが、比較の分かりやすさのため、Spread=70まで上げて、音源と反対側のチャネルにおいて、Spatializationが有効の時と同程度のゲインが得られるようにした。

周波数特性

まずは周波数特性から。図は左チャネルについて2D-Audioに対する各周波数帯域でのゲイン比を示す。 Spatializationが非有効の場合、レベル差は現れるものの周波数特性は全く変化しない。一方、Spatializationが有効の場合、1000Hzより上の帯域で音源方向によって異なる周波数特性が見られる。特に、4000Hzから10000Hz付近に見られる大きなノッチが特徴的だがこれはスペクトラルキューと呼ばれるもので、人はこの高域に表れるノッチやピークの変化から音源の方向を捉えていることが知られている。

f:id:Raku_Phys:20210710202925p:plain
ホワイトノイズに対する周波数応答。(上) Spatialization非有効。(下) Spatialization有効。

位相差

次に、左右の耳の位相差を調べる。図は右チャネルの位相から左チャネルの位相を引いた位相差の時間平均を示している。これを見ると、Spatializationが非有効の場合は左右の耳の間でまったく位相差がない一方で、Spatializationが有効の場合位相差が現れているのがわかる。ここでは、位相差の物理的妥当性までは検討しないが、少なくともLeft/Rightで位相が逆転していることはもっともらしい。こうした、低域における左右耳の位相差も、人が音源方向を認知する上で重要であることが知られている。

f:id:Raku_Phys:20210710205100p:plain
左右チャネルの位相差。(上) Spatialization非有効。(下) Spatialization有効。なお、高域の位相差は空間エイリアシングの影響で、意味を持たないため1000Hzまでを示している。

距離に対する応答の検証

距離による周波数特性の変化を調べる。実験は、プレイヤーの正面方向、0.1, 0.5, 1.0, 3.0, 10.0, 30.0mの6地点に配置したAudioSourceから発したホワイトノイズを記録することによって行う。

周波数特性

図は、音源距離を変化させたときの、周波数応答を示している。ごく近接では高域のノッチが浅くなりフラットな周波数分布となっているのに対して、離れた距離では高域に深いノッチが現れることがわかる。逆に3m以降ではほとんど周波数特性は変化していない。これは頭部の大きさに対して十分離れているためと考えられる。

f:id:Raku_Phys:20210710214427p:plain
音源距離を変化させたときの、ホワイトノイズに対する周波数応答。

まとめと感想

今回は、そもそもVRC_SpatialAudioSourceってどのぐらいちゃんと「Spatialization」してるんだろうか、ということでVRC_SpatialAudioSourceの角度と距離に関する応答を調べた。 あまり信用していなかったが、やってみるとそれなりにちゃんとHRTFをシミュレートしているらしいことがわかった。 これでなんでドキュメントに逆二乗則ですとしか書いてないのか理解できない。

全然ダメだったら代替を考えるかと思ったが、こうデータを見ると使わないのは勿体ないと思わざるを得ないので悩ましい...。特に位相差を手で入れるのはかなり困難...。 あと、今回色々と音を比較していて思ったのは、もしSpatializationを有効にするのであればそれを前提として音作りをする必要がありそうということ。 イヤホンで聴いて音を作ると、つい耳に馴染むように外から聴こえてきたような音を作ってしまいがちだが、それをしてしまうと二重で頭部の影響を受けたようなものになってしまって音がぼやけてしまうかもしれない。音を作る時は、Spatializer的なプラグインを入れながら最終的な聴こえを確認しつつ進めるのが良さそうだと思う。