VR空間でASMR録音する方法

#使う技術スタック
・TouchDesinger
・vsthost
・MIDI
・SteamVR

#実際に使った動画（イヤフォンでの視聴推奨）
こちらの動画は、インカムマイクで録音しております。VRアプリはバーチャルキャストです。
つまり、私の声は3号ちゃんの位置を基準として聞こえますが__マイクの位置は常に私の口元にあります__。
今回は、このようなASMRな音声の収録をリアルタイムで行う方法について記載します。
<iframe width="360" height="640" src="https://www.youtube.com/embed/cWFn64nyuoc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

#はじめに
例えば、VRChatでは相手の位置から相手の声が聞こえます。これがリアリティ感を紡ぎ出す重要な要素となっております。
今回、配信や動画の作成において__自分の声をカメラの位置にマイクがあると仮想させて録音すること__を目指したものです。

##Unityだけでは難しかった
本当はUnity内で完結できたら良かったのですが、Unityの3Dオーディオ機能では相手の音を、相手の位置から聞くことはできるのですが、__自分の声を自分じゃない位置から3Dオーディオで聞くことができませんでした__。（もしもやり方をご存知でしたらご教授願いたいです。）
そのため、今回はアプリの外部・SteamVRとvstを使ってASMRの録音環境を実現します。

おかげで__どのVRアプリであってもASMR録音環境を構築することができます__。

#私の環境図解と今回話す箇所について
まずは大きな画像になりますが、私の音声出力環境図になります。
今回はそのうちのSteamVRを使ったASMR部分（__<font color ="Red">赤枠</font>__で囲っている箇所）について解説します。
![ボイチェン環境.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/b2e9dc55-1d0e-d543-c7b3-bd5c345c5a96.png)

#技術選定(及びその価格)について
今回やりたいこととしては、SteamVRからヘッドセットの位置情報を取得して、そこからキャリブレートしたマイクの位置を基準点としたXYZの距離情報を、立体音響プラグインvstであるOculusSpatializerに流し込むことです。
この情報の受け渡し及び計算にはTouchDesignerを使用しました。SteamVRの情報の取得とMIDIの出力が容易であったことが主な理由となります。
今回のTouchDesignerのアプリ(.toeファイル)の作成は実質2日でできました。この短期間で目的のものが作れたのは間違いなくTouchDesignerのおかげです。
TouchDesingerとOculusSpatializerの間に流す仮想MIDIポートはLoopMIDIを使います。
OculusSpatializerを起動するvsthostについてはCantabile Soloを使っていますが、こちらは別のvsthostで構いません。
価格については以下になります。
###OculusSpatializer
無料。sleepfreaksさんのサイトになりますが、こちらがインストールの分かりやすい手順になります。
https://sleepfreaks-dtm.com/sale/oculus-spatializer/
###TouchDesigner
非商用なら無料。商用の場合は、実行だけなら300ドル、開発を含めると600ドル。
https://derivative.ca/
###LoopMIDI
無料
https://www.tobias-erichsen.de/software/loopmidi.html
###Cantabile Solo
有料（69ドル）、vsthost（無料）で代用可能
Cantabile https://www.cantabilesoftware.com/
vsthost https://www.hermannseib.com/english/vsthost.htm
#環境構築手順
##1.必要なアプリケーションをインストールする
技術選定について記載した各アプリケーションをインストールします。
そして、私が作成した.toeファイルをダウンロードします。下記githubにあります。
https://github.com/feathVR/VR-hand-to-Spatial
##2.LoopMIDIで仮想MIDIデバイスを作成する
まず右下のNew port-nameの場所に適当な名前を記述してから、下画像右下の＋マークをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/5253b907-7c2a-fce3-4df7-311390b2d1aa.png)
すると、仮想MIDIポートが作成できます。
##3.TouchDesingerの設定
まず、TouchDesingerを起動して、DialogsからMIDI Device Mapperをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/305c5c8f-889d-96cb-8fa1-6d99f81fb6fd.png)
そして、デバイスがない場合はCreate New Mappingで1.0のデバイス項目を作成してOut Deviceに、先程作成した仮想MIDIポートを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/1edaae0c-8fd3-6edb-3eb4-159f0ee7ac4c.png)
あとは、F1キーを押せばOKです。
__キャリブレート時の右手の位置__がマイク位置になります。
・Aボタン同時押し
・Bボタン同時押し
・AorBボタン同時押し
でキャリブレートができるようになっています。これは両手で同じボタンを押す必要があります。そのときに使用しているVRアプリで、操作に支障が出ない方のボタンで同時押しすると良いです。

また、右手の方向について
・対面
・同一方向
を選択することができます。基本的には対面で良いと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/8df4d71d-e0eb-46fd-89c0-21a11317f3ef.png)
##4.loopMIDIからvsthostにMIDIの情報を流し込む
これはvsthostによるのですが、今回はCantabile soloを使った連携方法について解説します。
###a.MIDIポートを追加する
Cantabile Soloのreferenceを開いて、MIDI PortsからLoopMIDIで作成したデバイスを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/197ce81e-1860-95b6-0779-d5e50d23d870.png)
###b.OculusSpatializerを追加する
OculusSpatializerを使用するプラグインとして追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/78ad3e20-01e7-4b1a-4822-01034af83d04.png)
###c.OculusSpatizlierにMIDIを繋げる
OculusSpatializerのxpos,ypos,zposに作成した仮想MIDIポートをつなげます。
渡すデータは1バイトではないので、その点は注意！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/a9243d98-ab88-c759-20ff-7f56ba7b5fb0.png)
##5.これで完成！
あとはお好きなVRアプリを起動して、マイクの位置に右手を重ねてAボタンかBボタンを両手で同時押しすればその位置がマイクになります。
##動画で解説しました
<iframe width="560" height="315" src="https://www.youtube.com/embed/NYUk4DYcxjw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>