耳元で囁かれたい!-ResonanceAudio導入-

王子様のささやき朗読VR

はじめに

イケメンテックラボで 「王子様のささやき朗読VR」の メインエンジニアを務めている、茨田と申します。

第4回目になる今回は、現実世界と同じ様に音がなっている方向がわかる技術、立体音響を実現するResonanceAudioをご紹介させていただきたいと思います。

▼以前の記事はこちらから

王子様のささやき朗読VR」で、最初にプランナーから貰ったオーダーは、「2人きり」で、「雰囲気ある」場所で、「囁かれたい」というものでした。

今回も「囁かれたい」というポイントを実現するには、どの様な要素が必要か考えました。

まず、囁かれるといことは、耳元に相手が来ると言うことです。これには、相手との距離感伝わらなければいけません。

また、耳元で囁かれると言うことは、囁かれている耳と、囁かれていない耳では、聞こえ方が違うはずです。これには、相手が自分に対してどの位置で囁いているかが分からなければいけません。

今回は、これらの問題を解決してくれるResonanceAudio使い方をご紹介したいと思います。

立体音響とは?

現実世界で言うと、横断歩道を渡るときに、「右から車が来ている」又は「左から車が来ている」、「音が小さいから遠い」、「音が大きいから近い」など、様々な音を聞き分けていると思います。

これは、音の方向や、音の大きさ距離による減衰など、様々な要素で組み上がっています。

このような様々な要素シミュレーションして、現実世界の様な音の聞こえ方にするのが立体音響です。

王子様のささやき朗読VRでの利用方法

王子様のささやき朗読VRでは、上の画像の様に複数の音を用意していました。環境音暖炉の音や、ビッキーの登場を知らせる扉の音、ビッキーの足音喋る声が設定されています。

王子様のささやき朗読VRではまず部屋に入ると、暖炉の方向からスマホの音が鳴っており、スマホ視線を合わせることで、暖炉を見つめるビッキーが登場することを教えてくれます。暖炉からビッキーが登場する扉へ視線を誘導するために、扉から音がなる様に設定し、自然と音のした方向を向くようにしました。

次に、ビッキーとの距離感を掴むために利用したのが、足音です。足音があることで、ビッキーどっちの方向に居て近づいてくる離れていくなど、距離感を最大限に伝えることができます。

また、環境音の暖炉の音は、ビッキーの声に集中していると、さほど気になっていないかもしれませんが、ちゃんと暖炉のある方向から音が聞こえることによって、意識しておらずとも空間に立体感が生まれます。

そして最重要が、ビッキーの声です。三木が書いた記事でもある通り、ビッキーはだんだん近づいてきてくれます。もちろん、ビッキーの位置で音の大きさも変わってきます。前回紹介したLipSyncも合わさり、終盤にはビッキーがすぐそばで囁いてくれているかの様な表現を実現できました。

王子様のささやき朗読VR導入部分ではこの様になっています。
PCの場合左上のコントローラ操作するか、画面をクリックしながら動かすことで、視点VRの様に動かすことができます。
視線を最初から動かした状態でも再生可能なので、いくつかの方向固定して聴き比べてみる違いがよくわかるかと思います。

ResonanceAudioの使い方

ダウンロードとインポート

まずは、下記のResonanceAudioをサイトからResonanceAudioForUnity_x.x.x.unitypackageDLします。
 ※x.x.xはバージョンです。今回使用したのは1.2.1で、「王子様のささやき朗読VR」では1.2.0を使用していました。

resonance-audio/resonance-audio-unity-sdk
Resonance Audio SDK for Unity. Contribute to resonance-audio/resonance-audio-unity-sdk development by creating an account on GitHub.

Assets > Import Package > Custom packageから、先ほどDLしてきた、ResonanceAudioForUnity_x.x.x.unitypackageを選択してインポートします。

プロジェクトの設定

Edit > Project Settings > Audio を選択すると、InspectorAudioManagerが開かれます。
AudioManagerSpatializerPluginResonance Audioにします。
AudioManagerAmbisonicDecoderPluginResonance Audioにしてプロジェクトの設定は完了です。

音源の設定

音は以前の記事でも紹介したユニティちゃん(© UTJ/UCL)を使用したいと思います。
 ※DL方法やインポートなどは以前の記事の「ユニティちゃんの準備」を参照してください

音源の位置がわかりやすい様に、Sphereを設置して、そこに音源を設定します。
生成したSphereInspectorの下の方にある、AddComponentを選択し、ResonanceAudioと検索して、ResonanceAudioSource選択してアタッチします。

ResonanceAudioSourceを設定すると、同時にAudioSource自動で設定されるため、AudioSource以下の設定を行います。

  1. AudioClip立体にしたい音設定する。
  2. OutputMasterを選択する。
  3. SpatialBlend3Dスライドする。
  4. SpatializeチェックボックスにチェックしてONにする。
  5. SpatializePostEffectチェックボックスにチェックしてONにする。

これで位置距離によって音の聞こえ方変わる様になりました。

音源を動かしながらどの様に聞こえるか試してみる

設定したSphere自動で動く様にスクリプトを書きます。
今回は、カメラの周り自動回って音がどの様に聞こえるか試してみたいと思います。

まずは、上記で設定していた音源のAudioSourceLoopの設定があるのでチェックをいれます。
これで同じ言葉を繰り返してくれる様になりました。

次にAssetの中に新規スクリプトを作成します。
Asset右クリックしてCreate > C# Scriptを選択します。
スクリプト名前MovingSphereとしておきます。

ソースコードを入力する

using UnityEngine;

public class MovingSphere : MonoBehaviour
{
    private readonly float RADIUS = 20.0f;      // 円運動の半径
    // 毎フレーム実行される処理
    void Update ()
    {
        // x,y,zの座標を計算する
        Vector3 pos = new Vector3
            (
                Mathf.Sin(Time.time) * RADIUS,  // X軸の移動量計算(-20~20)
                0,                              // Y軸は移動なし
                Mathf.Cos(Time.time) * RADIUS   // Z軸の移動量計算(-20~20)
            );
        // x,y,zの座標を設定する
        transform.position = pos;
    }
}

作成したMovingSphereをダブルクリックし、上記のソースコードと同じになる様に編集します。

ソースコードの説明

上記のソースコードは、アタッチしたオブジェクトX軸とZ軸上で円運動させるソースコードです。

RADIUSオブジェクトが動く半径でこれを小さくすると、オブジェクトの移動範囲も狭くなります。

Time.time開始ボタンを押してからの経過時間なので、どんどん増加しています。
これにより、SinとCosの値はそれぞれの周期に対応した-1から1の幅常に変化する様になります。

SinとCosそれぞれの周期で、-1から1の値になるので、半径が20の場合、XとZは-20から20の間の値になります。

ソースコードが完成したら設定したSphereInspectorの下の方にある、AddComponentを選択し、MovingSphereと検索して、MovingSphereのスクリプトを選択してアタッチします。

これで再生すると、カメラの周りSphere自動で回転しながら音を再生する様になります。

サンプル動画

サンプル動画では上記までの設定を行って確認がしやすい様に、カメラの代わり赤いキューブにAudioListener(音の受信機)を設定して、その周り青いスフィアが回る様にし、上空からカメラで撮影しています。
あえてキューブを円運動の中心に配置しなかったので、スフィアとキューブの位置関係で、音の強弱方向などが動画で確認できるかと思います。

以上で、ResonanceAudio導入紹介は終了です。

ResonanceAudioとUnityのバージョンによる不具合

王子様のささやき朗読VR」の開発当時Unity2017.3.xResonanceAudioSdk(ver1.2.0)の組み合わせで 、Android実機シーン遷移すると音が聞こえなくなる問題がありました。
Unity2017.2.1で新たに入ったAndroid固有のビルド問題があるらしいのでUnity2017.2.0f3以前なら動作するらしいです。
Unity2017.4.0f1以降でも動作することを確認したので、新しいUnityを使っている場合は気にしなくても大丈夫なはずです。

参考URL
https://github.com/resonance-audio/resonance-audio-unity-sdk/issues/15

おわりに

今回は、現実の様な音響再現するResonanceAudio導入方法と、開発時に実際に起きた問題や解決方法を説明させていただきました。

今回説明した機能のにも、ResonanceAudioには、壁の材質を選んで反響させるなど、様々な機能があります。

興味がある方は是非、検索などして試してみてください。

次回以降も、「王子様のささやき朗読VR」で使った技術Tipsなどを紹介させていただきますので、よろしくお願いいたします。