見出し画像

VRChatでの音の付け方 ~AudioSource周りのあれこれ~

2024/01/30  追記 VRC Spatial Audio SourceのNearとFarについての勘違いをコメントでご指摘いただいたので修正。あとドップラー効果がVRC内で無効化されている話と、VRC Spatial Audio Source付きのAudio SourceでAudio Reverb Zoneが無効化される話を追加。 

はじめに

今月のワールド製作者向け記事ではBGM・効果音などの音の付け方について説明しようと思います。

ワールドのBGMや効果音を扱おうとしたときに、UnityのAudioSourceというコンポーネントを主体に使うことになりますが、設定すべき項目が多く、分かりづらいと思います。

またUnity上では2D音源と3D音源という区分があり、それぞれで設定方法が異なっている上に、VRChat独自のコンポーネントが必要なケースがあります。

そこでこの記事では基本的なAudioSourceの扱い方から、ちょっとした応用などについて初心者向けに嚙み砕いて触れたいと思います。

AudioClipとAudioSourceについて

現実で音楽を聴きたい時、必要なものが二つあります。

1つは音源データ、もう1つは音源データを再生するための機器です。
分かりやすい例でいうとCDとCDプレイヤーなどはそれにあたります。

実はUnity上でも同じ働きをするものがあり、それがAudioClipとAudioSourceです。

音源データと言えばmp3やwav、oggといった音源データの形式がいくつかあることをご存知かもしれませんが、Unity上にそれらのファイルを一度入れるとAudioClipとして一括りで扱われます。

Unity上にインポートされた音源データは、AudioClipの設定に従って再構成されて扱われます。そのためAudioClipの設定項目を適切に設定してあげる必要があります。

そしてAudioSourceはAudioClipをセットして利用するのですが、セットされたAudioClip(音源データ)がどのように再生されるかを決めることが出来ます。

ここにAudioClipをセットします。

一例としては、音源をループするようにしたり、ピッチ(音の高さ)を変えたり等といったようなことが可能です。

VRChatでの音源の作成は、主にこの二つを設定していく必要があります。
(余談:本当はAudioListenerというものも必要なのですが、VRChat上では自動で設定され、特に気にしなくても大丈夫なので割愛しています)

2D・3D音源について

具体的なAudioClipとAudioSourceの設定方法に触れる前に、AudioSourceには2D・3D音源という特殊な概念があるので、先に説明したいと思います。
(実はきちんとした名称はないのですが、便宜上2D・3D音源と呼称します)

普段私たちの生活の中で鳴っている音というのは、必ず音の発生源がありますよね?そして、私たちは鳴っている音を両方の耳で拾い上げているわけです。

音の発生源が、体の右側にあれば右耳のほう、左側にあれば左耳のほうが良く音を拾いますよね?このボリュームの差によって、音の発生源が大体どのあたりにあるのかを私たちは聞き分けることが出来ます。

加えて、体の向きを変えたり、位置を移動したりすると、音の発生源と両耳の位置関係が変わりますので、音の聞こえ方も変わります。

このように音の発生源が決まっていて、位置や向きによって聞こえ方が変わる音源をUnity上では3D音源として扱います。

一方で、2D音源はどのようなものなのかというと、どのような位置・向きにおいても同じ聞こえ方をするものになります。

一般的な使い分けとしては、2D音源はBGMなどに使われ、3D音源は効果音などに使われます。BGMは常に一定に聞こえてほしいケースが多く、効果音は特定の場所からなっていてほしいケースが多いからです。

とはいえ、これは2D音源!これは3D音源!という風にはっきり分かれているわけではなく、中間の性質を持たせることも出来ます。この設定はAudioSourceの項目にあるSpatial Blendでその割合を決めることができます。

この2D・3D音源の使い分けを意識して設定すると、ワールドの体験がグッと良いものになるので、先に説明させていただきました。

具体的な設定方法について

AudioClip並びにAudioSourceには沢山の設定項目があり、キチンと説明するととても長い文章になってしまいます。ですので、いくつかのケースごとに設定すべき項目を説明したいと思います。

AudioClipの設定

AudioClipは状況によってあまり変える必要が無いので、先に説明します。

Force To Mono : ステレオの音源をモノラル音源にする設定です。
イヤホンとかで曲を聞いた時に、左と右で違う音が鳴っていることがあるかもしれませんが、これがステレオ(=立体)音源です。左と右で異なる音を鳴らすことが出来ます。対してモノラル(=単一)音源は左右で同じ音が鳴るようになります。
当然ながら表現力は下がりますが、容量が半分になるという利点もあります。
基本的に3D音源(効果音)はモノラルにして、2D音源(BGM)はステレオにすることが多いです。
Compression Format : 圧縮形式ですが、基本的にVobisで問題ないです。PCMは無圧縮、ADPCMはPCMの1/3.5の圧縮率で、高品質になりますが、容量が非常に大きくなるので注意して使う必要があります。
Quality : 品質です。下げると高音域(15kHz以上)が削られるらしいです(ソース)。重要ではない効果音などはこれを利用することでワールド容量を減らすことが出来ます。私は効果音等は聞いてテストしつつ、結構削ることが多いです。圧縮形式がVobisの時のみ使えます。
Sample Rate Setting : PCM、ADPCM用の軽量化オプション

BGMなどの2D音源

実は2D音源の場合はデフォルトの状態から2カ所調整するだけでOKです。BGMの設定を想定しています。

①Loop:デフォルトのままだと1回再生し終えると終わってしまうので、ループにチェックを入れておきましょう。
②Volume:0~1の値で設定し、0が無音で1がボリューム最大になります。基本的にかなり大きい音が鳴るので小さめの値から調整してあげるといいでしょう。

効果音などの3D音源

2種類設定方法があります。VRC Spatial Audio Sourceと呼ばれるコンポーネントを利用するかしないかで、パラメータの調整方法や聞こえ方などが変化します。

現実では音源からの角度・距離に応じて、左右の耳での音量差だけではなく、左右の耳に届く音質も変化します。その音質の変化を疑似的に再現するのがこのコンポーネントの機能らしいです。

どちらのほうが良い……というの一概に言いづらいのですが、私は基本的にVRC Spatial Audio Sourceを付けたほうで設定を行っています。

一応この記事を書くにあたって、実験環境を作り、聞き比べを行ったところ、『角度の変化に対する応答性』がそちらのほうが良いと感じたので、これからもそっちでいくつもりです(詳しくは記事の最後に書きます)

では肝心の設定方法ですが、まず一つ目はVRC Spatial Audio Sourceを使わない方法についてです。VRC Spatial Audio Sourceを付けないと、VRCSDKのビルド欄に警告が出ますが、付けなくても動きますし、問題なくアップロードできます。

警告

①Volume : 2D音源のと一緒です。
②Spatial Blend:2D音源と3D音源のブレンド具合に関するパラメータで1にすると完全に3D音源になります。
③3D Sound Settings:
名前にある通りここにある5つの項目は全て3D音源のものになるので、3D音源を扱う時はこれらのパラメータを調節する必要があります。順に説明していきます。
(2024/01/30 Doppler Levelが無効化されている仕様であることを確認・修正)
・Doppler Level:
現実だと救急車とかでよくあるドップラー効果の割合です。
Unity上では動いているのですが、VRChat上では一切無効化されているパラメータになります。紛らわしいので0にしておくことを推奨します。
・Spread:
音が聞こえる角度を示していて、0~360°で指定します。180だと均等に聞こえるようになり、180以上だと反対側から聞こえるようになっていきます。このパラメータを少し上げてあげることで、音の発生源をぼやかすことが出来ます。
・Volume Rolloff :
音量や各種エフェクトなどを距離に応じて制御する波形のタイプです。④でまとめて説明します。
・Min Distance :
最大の音量が維持される距離で、この数値より近い距離にいた場合常に最大の音量になります。
・Max Distance :
勘違いしやすいのですが、音量が0になるポイントではありません。波形での制御を行える最大の距離……と言っても分かりづらいと思うので④で一緒に説明します。
④波形グラフ
これが3D音源の最も重要な設定だと思うので、丁寧に説明します。
横軸が音源からの距離で、縦軸が大きさ(0~1)になっています。横軸の長さはMax Distanceに対応しています。

左下に色と対応する文字が書いてあり、グラフの波形がそれに対応しているので何となく分かると思いますが、このグラフは4つのパラメータを距離ごとに設定することができます。
(後ほど説明するエフェクトのフィルタを追加するとその項目が増えます)

パラメータは"Volume(音量)"、"Spatial Blend(2Dと3Dのブレンド量)"、"Spread(音の広がりの角度)"、"Reverb Zone Mix(Reverb Zoneの適応度)"の4つです。4つ目については後ほど説明するとして、他の項目は①~③の中で説明した項目と対応しています。

現実における音の減衰は、距離に比例して直線で減少する……わけではなく、逆二乗で減衰していくと言われています(上のグラフの赤線のような形のことです)

つまり現実に近い音響を作るのに、波形で距離ごとに調節できる機能はとてもありがたい機能です。是非使いましょう。

使い方を説明します。
上のグラフの線をよーく見てみると、点があるのが分かりますか?分かりにくいと思いますが、これが制御点になります。
制御点を左クリックすると以下のようになります。

白い線が出てきたと思いますが、これは曲線の角度を制御できます。簡単に説明するとこの白い線をクリックして動かすと曲線の向きが変わります。

もうちょっと言うと、制御点を右クリックして出てくるメニューから、白い線の制御方法を切り替えることが出来ます……が、私がキチンと説明するよりは、Unityのマニュアルが非常に分かりやすくなっているのでこちらを軽く読むことを推奨します。
Animationのカーブと同じシステムなので、そちらに精通してる人は読む必要はないかもしれません。

あと覚えておくことといえば、制御点が無い場所で右クリックすると、Add keyという選択肢が出てきて、クリックすると制御点を追加することが出来ます。
また、制御点の上で右クリックすると、Delete keyという選択肢があるので、これを押すことで制御点を削除することも出来ます。

これくらい分かれば、上記のマニュアルを読んでなくても、急に折れ曲がるような曲線でなければ、直感的に作れると思います。

ここで少し注意点について、話をします。グラフ自体はFar Distanceに設定した距離で途切れていますので、ここで音量が0になると思うかもしれませんが、外側にずーっと続いているものだと思ってください。

つまり"Volume"の曲線の勾配が、最後の制御点で下がっていない場合、非常に遠方まで音が鳴るようになってしまいます。上げてしまっていると遠くで爆音になってたりします。

このような場合ずーっと遠方でもなり続けます

そのため、遠くで鳴ってほしくない場合はグラフの後ろの勾配を下げて、0になるようにしておきましょう。もしくはグラフ内できちんと0にしておいたほうが安心だと思います。



次にVRC Spatial Audio Sourceを使う方法についてです。
VRC Spatial Audio Sourceはコンポーネントで、AudioSourceのついたゲームオブジェクトに追加する形で使用します。折りたたまれているAdvanced Optionsの部分を広げると以下のようになります。

すでにAudio SourceにVolumeがあるのにGainが増えたり、Max DistanceやMin DistanceやSpreadがあるのに、NearやFarやVolume Radiusといった似た名前のパラメータが増えて混乱しますよね?私もそう思います。
順に説明していきます。

GainはVolumeと同時に機能します。ですが、Gainで音量を上げようとすると音割れしてしまうので、値を0(つまりGainなし)にしたうえでVolumeを設定しなおすのが良いと思われます。
Volumeはもともとの音源が音割れしていなければ、最大値である1にしてても音割れしないのですが、Gainと掛け合わされることでその上限を超えてしまって音割れするケースがあるようです。注意しましょう。
元音源の音量が小さすぎてVolumeの調整でどうにもならない場合は、使う手もあると思いますが、AudioClipの設定でモノラル化すると自動的にNormalize(正規化)が行われて、音量が大きくなるはずです。まずはそれで様子を見るといいでしょう。

(2024/01/30 勘違いを修正)
NearとFarはプレイ中にしかプレビューできないようです。そのためClient Simでのデバッグをしながらの調整が必要になります。
以下の動画を見てもらえれば分かると思いますが、Use AudioSource Volume Curveがオフの時は、NearとFarの値に従った逆二乗の形で波形を制御します。オンにするとユーザー独自の波形グラフの設定ができ、NearとFarの値をいくら動かしても変化しません。
プレイボタンを押していない時は、独自に設定している波形が表示されていますが、一度プレイボタンを押したときにUse AudioSource Volume Curveがオフになっていると、波形グラフが上書きされます。ここらへん、勘違いしやすいので注意が必要です(私も滅茶滅茶勘違いしていました……)


Volumetric Radiusは音が回り込んでくる距離を示したもので、VRC Spatial Audio Sourceを使うと、先ほど上で説明したパラメータの1つ"Spread"が無効化されます。それの代用品と考えて良さそうです。
効果としては結構はっきりと感じられるので、0にしとくのは勿体ない感じがします。

Enable Spatializationのチェックは、これを入れてないとVRC Spatial Audio Sourceを付けていない時と同じになるので、チェックを入れておくのがデフォルトです。

Use AudioSource Volume Curveは、ここにチェックを入れないと波形グラフによるVolumeの調整がNearとFarによる逆二乗の波形で上書きされてしまうので、自分で調整したい時はチェックを入れます。

以上、今回色々検証してみてではありますが、一例としては以下のような感じで自分で波形を設定するスタイルがいいんじゃないかなと思いました。試してみてください。

全ての音源にエフェクトを掛けたい場合

アバターの声も含めた、全ての音に対してエフェクトを掛けたい場合、適当なゲームオブジェクトにAudio Listenerというコンポーネントを付けて、それにつけたいエフェクトのコンポーネントを付けましょう。
Audio Listenerはプレイヤーの『耳』に該当するコンポーネントです。それにエフェクトをかけることで、『耳』に入る全ての音にエフェクトをかけます。

エフェクトのコンポーネントは以下に示す通り結構ありますが、一般的な例としては、水中などの音のこもった表現としてReverb(残響)が使われることが多いです。

Filterで検索すると出てきます

注意点としては、Audio Listenerのついたオブジェクトを後からアクティブにしても、それが有効化になりません。

Filter系はワールド開始時にゲームオブジェクトがオンになってないと動きません。一度オンになったらゲームオブジェクトを非活性にすることでエフェクトをオフにすることができます。

ただし、後からエフェクトをかけるとノイズが乗って、安定するまで時間がかかります。

音源ごとにエフェクトを掛けたい場合

AudioSourceのついたゲームオブジェクトに、エフェクトのコンポーネントを付けることでその音源にだけエフェクトを掛けられます。

エリアごとにリバーブを掛けたい場合

AudioReverbZoneコンポーネントのついたゲームオブジェクトを配置することで、そのAudioReverbZoneの影響範囲内に入った時だけエフェクトを掛けることが出来ます。

内側の球の中に居ると効果が1、内側の球から外側の球に行くにつれて1~0、外側の球の外に出ると効果が0です。
余談ですが、AudioSourceを選択している時も似たような球が出ます。そちらは効果ではなく、音量になります。
(2024/01/30 追記)
VRC Spatial Audio Source付きのAudioSourceではAudioReverbZoneの効果が無効化されるので注意してください。エフェクトのコンポーネントによる効果は問題ないことを確認しているので、そちらを利用するのが良いでしょう。

動画プレイヤーについて

基本的に再生用のAudioSourceが同梱されていますが、そこから音が鳴るようになっています。大体の動画プレイヤーは音の影響範囲を設定変更できるようにUIを作っていると思いますが、仮にそうではない場合は内部にあるAudioSourceの設定をいじってあげることで変えられるはずです。

具体例としてiwaSyncだと
このようにMin DistanceとMax Distanceの制御ができるようになっています。
(画像内、真ん中3つの項目)
スクリプトによって制御されている場合このようなメッセージが出る。

エリアごとにエフェクトを掛ける

リバーブ以外を掛けたい場合や四角い部屋など球でカバーしづらいエリアにどうしても適応したい場合のやり方です。エリアごとに判定を作って、入った時にエフェクトを切り替えます。

これを説明するのは結構大変だなーと思っていたのですがありがたいことに記事がありました。中身を読みましたが、これで問題なく行けると思います。

アバターの声について

アバターなどの声の減衰については、AudioSourceは関係なく、Udonで変更することになります。Boothでギミックが販売・配布されているので、それを使うのが近道だと思います。
適当に見つけてきたのをリンク貼りました(試してはないです。自己責任で)

(2024/03/03 追記 そういえばみみーさんのUdonギミック詰め合わせのやつに、ワールド設定とまとめたものがあったのを思い出したので、リンクを置いておきます。特定のエリアだけっていうのは上のような範囲指定のギミックを使うといいですが、普段の全体設定を弄りたいだけなら下のギミックのほうが他にも色々できて便利かもです)

AudioMixerについて

一般的なUnityにはAudioMixerというコンポーネントがあり、それに関する記事もあるのですが残念ながらVRChatでは使えません。

応用編

フェードイン・フェードアウト

念のためいうと、音量が徐々に消えてったり大きくなったりする演出のことです。これをやりたい場合、地味に大変です。

何かしら音源をいじる手段があり、かつ音源のフェードイン・フェードアウトのタイミングが決まっているなら、Unityに持ち込む前に加工したほうが圧倒的に楽だと思います。

逆にそうではない場合。例えば、フェードイン・アウトのタイミングが決まっていない場合は少々面倒です。

私が使うやり方は二つあり、Udon+AnimationでAudioSourceのボリュームを徐々に下げる(or上げる)か、Udonで毎フレームボリュームの値を代入するか、のどちらかです。

前者はアニメーションでキーフレームが打てて、自在に制御しやすいので、前者でやるのが良いと思います。

簡単に説明するとAnimatorとAnimationは以下のように単純に作っておいて、このAnimatorのついたゲームオブジェクトをオン・オフ(これがUdon部分)するやり方です。

この場合はフェードアウト

ゲームオブジェクトについてるコンポーネントはそのゲームオブジェクトがオフ(非活性)の時に動作せず、オンになると動き始めます。

これを利用して、任意のタイミングでAnimatorのついたゲームオブジェクトをオンにすることで、好きなタイミングでフェードイン・フェードアウトを行うことが出来ます。

おわりに

以上で、VRChat上におけるワールドの音響表現は一通りできると思いますが、何か思い出したりしたら追記しようと思います。

御覧の通り、結構覚えることやパラメータ数が多いので、初心者の頃は結構混乱していたことを覚えています。

が、覚えてしまえば結構単純だったりします。まぁ目的によってはそこからやりたいことに行くのが、難しいかもしれませんが……。

BGM・効果音周りはネットから拾ってくるのが一般的ですが、利用規約だけは違反しないように気を付けましょう。

今回AudioSource並びにVRC Spatial Audio Sourceのパラメータやエフェクト関係は、全て検証を行っています。ですので、誤りは少ないはずです。

AudioSource周りはVRChat公式による仕様の開示が不十分なところがあり、わりとユーザ側で解き明かされてきた事実が多くあります。

ですが、それゆえの伝聞による曖昧さが発生しやすい状態にあると考えています。

そこで、この記事では『他の記事に書いてあったから』という先入観を出来るだけ排除して、検証に基づいて書きあげました。

もし内容に疑問を抱くようでしたら、今回の検証用に作ったワールドリンクを置いておきますので、ご自由にお使いください。自分用なのであまり説明はありませんが。


おまけ

AudioSourceを選択する時の小技

AudioSourceを置いていて、Gizmoを表示状態にしていると、シーン画面上にスピーカーのアイコンが表示されます。

GizmoのオンオフはUnity2022だとこの画像でいうと
一番右上のアイコンで行うことができます。

このスピーカーアイコンをクリックすると、そのAudioSourceを選択した状態になるので覚えておいて損はないです(他のアイコン系についても同じ)

上でちょこっとお話しした、動画プレイヤーのAudioSourceを探したい時とかに役立てると良いでしょう。

波形グラフの位置プレビューと音量について

Unityの再生ボタンを押し、Client Simでのデバッグ中にAudioSourceの波形グラフを確認すると、見えづらいかもしれませんが、以下のように赤い縦線が入ります。

これはプレイヤーがどの距離にいるかを表していて、画像で言えば大体6メートルの位置にいることが分かります。プレイヤーの移動に合わせて、縦線が動きます。

この時のVolumeの値は0.75くらいですので、今聞こえている音は75%の音量であることが分かります。このように距離によってどれくらい下がるのかをデバッグすることが可能です。

ただし、ここからさらにVRChat内での個々人のメニューによる音量調整が入ります。なのでそれを加味した音量調節が必要です。
私はいつもVRChat内音量が50%(つまりさらに音量が半分)なことを想定して、調整しています。

足音について

サックーさんが出している、このFootStepSystemを愛用しています。有料版のほうが、エリア指定が出来て、応用がきくので良いと思います。

自分はワールド全体にデフォルトの足音をエリア指定&優先度は低めにしておいて、局所的に足音を変えたい部分に個別にエリア指定&優先度をデフォルトのものより高めにしています(買った人向けの説明)

水中の音について

ひらびきさんのSwimSystemを使うと泳げる機能のほかに、自動的に飛び込み音と水中の音が付いてくるので便利です。

イベント向けの設定について

とかげさんの記事が設定付きで書いてあって良いかもしれません。

最後にリファレンスがまとめてあるんですが、そこからAudioSource周りの先人達の記事に飛べるのが良いと思っています。個人的にはらくとあいすさんの記事は必見です。

VRC Spatial Audio Sourceの『角度の変化に対する応答性』の良さ

これは今回の記事向けに色々実験していて気が付いたことです。

VRC Spatial Audio Sourceを付けていないAudioSourceの音を聞いている時に、体の向きを45度変えたところ(Comfort Turningの設定を使っているため)、一瞬片耳が塞がるような感覚を得ました。

恐らくですが、大きい音から小さい音へ急激に変化したことによって、そのような錯覚を得たのだと思います。

ところがVRC Spatial Audio Sourceを付けている音源に対して、同様のことをしたのですがこちらはそのような感じは全くなく、シームレスに繋がっている感じがありました。
これはVRC Spatial Audio Sourceの機能を考えると、正しいことのように思います。

一方でVRC Spatial Audio Sourceコンポーネントを付けると、音質が音痩せしたような感じと音質の変化に伴う音量の低下を感じます。

以上より私が得た結論としては、音質が大事なBGMなどはやはり2Dで流し、特定の場所から発生している感覚……すなわち定位感が大事な音についてはVRC Spatial Audio Source付きの3D音源で流すのが良いのではないかと思います。

まとめで貼った一つ目の検証ワールドで確かめることが出来るので、真偽を疑う人は自分の身で体感してみるといいでしょう。

VRC Spatial Audio SourceはUdonからさわれない

今回VRC Spatial Audio Sourceについても、VRChat内でパラメータを変更してチェック出来たら良いなと思ったのですが、なんとUdonでは一切さわれませんでした。

Animator経由で無理やり触ってみようとしたのですが、VRChat内に持ってくとVRC製のコンポーネントなので無効化されてしまいました(エディタ上では行けるので、ClientSimでのデバックは可能。とはいえそれは直接、パラメータをInspectorから触るのと変わらない話ですが……)

Volume Radiusなどは結構感じ方が変わるので、VRChat内で値を変更できるとデバックが捗っていいと思い、Cannyを探したところ、古いし、投票数もほぼありませんが、投稿がありました。

正直VRChat君には他に優先して改善すべきことが沢山ある気がするので、多分修正されるのは当分無いと思いますが、欲しければ投票しましょう。
(実際は、新しく立て直したほうが効果的かもしれません)

2022でVRC Spatial Audio Sourceを付けた時に出る謎のエラー

『Audio spatializerの初期化に失敗』とかいう内容の怪しい警告で、念のため2019で先に検証してからプロジェクトを2022に移行してチェックしてみましたが、VRC Spatial Audio Sourceは問題なく動いてそうな気配でした。

恐らく気にしなくて大丈夫です。
(→2024/02/21 修正されて、出なくなったようです)

オススメワールド

英語ですが、音源が色々な設定で設置してあって体感できるワールドです。


この記事が気に入ったらサポートをしてみませんか?