見出し画像

ASMRアップデートに関する開発ボランティア担当「ラズベリー」からの舞台裏話

くろしすちゃんからの前振りと「ラズベリー」さんの紹介

今回のASMRアップデートは、初のX-Oasisボランティア体制下の元、開発が進行しました。

社内のエンジニア駆動でシステム開発を進めるのではなく、Gitを活用したプロジェクト単位で流動的かつ分散型の開発を推進していく為の実験的な試みの結果となっております。

現在のところは、ボランティアスタッフのメンバーは一人のみとなっております。匿名コードネーム「ラズベリー」さんから頂いたASMRアップデート裏話しをこちらに残させていただくことにしました。

ボランティアスタッフの募集に関しては、運営管理者である「バーチャルAV女優Karin」のGitに関するレベルアップ及び既存のプロジェクトの有料アセットの切り出し等が済み次第、公募させて頂く事で準備を進めております。(夏には公募できると嬉しいな的感覚)

本編

問題提起

X-Oasisにおいて、キャストのボイスをステレオ環境で生成しても、平均化されたステレオ音声としてゲスト側で再生されている事は、サービス開始からの長年の大きな問題でした。

X-Oasisのキャスト⇔ゲスト間の通信に使用されている「WebRTC Video Chat」というアセットは、マイク入力としてステレオ入力を流しても、自動的にモノラル的に統合して送信してしまう為、キャスト側でMixerを使用して解決する事ができなかったのが根本的な問題でした。

この為、アセット制作者に連絡をし、当方の要望を満たす3つの実装方法の概要を伝えました。

そのうち、OBSにもあるようなStereoPan(LeftRightBalanceとか言ったりもする)を設定できるAPIを用意していただく事で解決してくださる方向性に落ち着きました。

それから一か月ほどかけて、何度かプログラムのやり取りと連絡が続き、当方の要望を満たす事ができる対応を頂く事が出来ました。

Stereo Panについて技術的な補足をしておくと…
-1であれば、左からのみ出力
0であれば、左右同音量で出力
1であれば、右からのみ出力
と音声出力デバイスの左右の音量を指定するパラメータになります。

これをアセット側で対応いただけたので、後はX-Oasis側でこの-1から1の値がなんであるべきかをクライアントに送り、設定をリアルタイムに更新させる事ができれば良いという事になります。

この数値をキャスト側のVR空間から送るのは、WebRTCのDataChannelを使用して送信するだけですので、詳細は割愛するとして、問題はこの数値をどうやって取得するかになります。

既存ソリューション探索編

VR/3D向けの空間音響を実現するSpatilizerというUnity向けのサブシステムが、Meta社をはじめ、様々な会社が無料提供してくださっているのですが、いずれもUnityのAudio ListnerやAudio Sourceに作用するものであり、AudioSourceとしてマイク入力を扱わない当アセットでは扱えませんでした。

そこで、二つのTransformの位置と回転から、StereoPanを計算してくれるスクリプトが存在しないかを探し始めました。

こんなの絶対誰か世の中に出しているだろうとルンルンで探しましたが、一向に公開されたモノどころか有料アセットでも見つかりません。

一向に見つからない為、せめて、アルゴリズムだけでも…と思い、Unity/C#に限定せず、他の言語でも半日探しましたが、理論すら見つける事ができませんでした。(ほんとに言ってる?)

仕方がないので腹を括って、自分で理論から構築し、アルゴリズムを書くことにしました。

わたくし、ラズベリーは、面倒くさがり屋さんなので、理論から考えるみたいな事をやりたくありません。既に様々な人の手でテストされたものを導入して、さくっと結果が出るのが何よりです。

理論編

さて、僕には当然の事ながら、Oculus Spatilizerのようにリアルな挙動に近いシステムを作る必要もないし、そんなに複雑な事を処理させる程のPCリソースをキャストに課す事も許されません。

ただ、キャストの口とゲストの耳(またはカメラ)を入力として、-1から1の値を「X-Oasis的にいい感じ」返せば良いだけです。

その為、音とはなんであるか?とか反響はどうなっているか?等と哲学レイヤーで思考する必要はありません。

様々な理論を考えましたが、僕が行きついたのは以下のちゃっちい図です。

X-Oasisで十分な超簡易ASMR理論

赤い矢印は、話し手(キャスト)の位置と向きを示しています。この場合は、三通りの向きを示しています。
緑の矢印は、聞き手の向きです。
白い点は、「音」の可視化されたものです。

この図が表しているのは、話し手の口から見えない泡が出てきて、それは直線に進む力を持っており、それが緑の矢印に向かって吸い込まれていく様子です。

そして、この白い点が緑の矢印に吸い込まれる時の入る角から、左右どちらか来ているか、またはその入る時の角度から-1 ~ 1の間の数値を捉える事ができるというものです。

アルゴリズム編

理論はこれで完成しましたので、次はアルゴリズムです。

挙動としては、前進する力と引力が必要なので、物理エンジンを使うのが簡単そうですが、数フレームかけて結果を出すようでは、既にキャストの音声はゲストに届いてしまっています。

その為、Unityの物理エンジン(RigidBody等)は使わず、演算で出す必要があります。

一番良いのは数学的に方程式を組んで、理論を実装する事でしたが、僕の数学力では難しかったので、物理エンジンの挙動を演算でシミュレートする事にしました。

  1. 「白い点」は、「聞き手」との距離のA%前進する

  2. 「白い点」は、「聞き手」の耳と角度をB%合わせる(RotationがLerpする)

  3. 1.2.をC回繰り返す

  4. 「白い点」と「聞き手」との入角を算出する

こうして、微調整を繰り返していくうちに、返される-1と1の値が「いい感じ」になっていきました。

この微調整を繰り返しているうちに、「いい感じ」がなんであるかをユーザーが決めるのに有意義な変数が浮き彫りになってきた為、この変数に「ASMR効果距離減衰倍率」という名前を付け、ライブデート予約時に指定できるようにする事で、「好み」を吸収する仕組みが出来上がりました。

「ASMR効果距離減衰倍率」はざっくりというと、先の白い点と聞き手の入角をどれだけ尊重するべきかが距離によって異なるのですが、それの影響を増やしたり、減らしたりするための変数になります。

そして、この理論を実装し、アルゴリズムに使用されている細かい実数の調整為に、シミュレーションを行うプロジェクトの結果動画がこちらです。

考慮されてない点&なぜこれで「いい感じ」といえるのか

考慮されない点は多々あります。
まずは、ワールドの環境です。隣に壁があるとか全て無視します。

そして、ワールド状況を無視しているように、「リアルであるか」をほぼ無視しています。

実際に人と対面していて、50cm先に立っている人が、左向きに話したからと言って、普通は左から聞こえてきません。相当特殊な実験場を用意しないと実現しないと思われます。

これは先ほどの「ASMR効果距離減衰倍率」で調整可能ではありますが、そもそも今回採用している理論がリアルの音の反射の仕方や聞こえ方と大きく事なる為、「リアル」ではありません。

あくまでこの理論は、「ファンタジー」であり、ファンタジーで良い…むしろファンタジーの方が良いという価値観の元判断しています。

ユーザーに見えている映像がそもそもファンタジー(アニメ調)であり、ユーザーは映像を見て、リアルを想起しません。音がむしろリアルである事の方が、映像に対して違和感を感じさせてしまう可能性もあるという事です。

細かい調整はまだまだ必要かも知れませんが、私は、この理論と今回の調整で「いい感じ」であると概ね考えています。

これからも、私の中では、X-Oasisでの出来事は、全く新しいファンタジーとして取り扱い、現実ベースを目指した場合に発生する小難しい事をファンタジーにサボりながら、次のプロジェクトでもボランティアを楽しんでいけたらと思います。

私自身もX-OasisのASMRを楽しんでいきます!
またお会いしましょう!

PS. ASMRテストレポートのお願い

WebRTCの挙動的に非常に機種ごと音声機材ごとの挙動が不安定なので、多くのテストデータを必要としております!

非常に複雑な問題な為、現状「自分でテストしてからASMRに挑んでね」でお願いしてますが、公認された一覧対応表をご用意したいので、是非ご協力お願いします!!!

X-Oasisを利用した事がない方、ユーザー登録すらしなくてもテスト可能です。

当アップデートの特設ページのこちらからお願いします。


いいなと思ったら応援しよう!