トマシープが学ぶ

Unity/VR/AR/デザイン好きのミーハー 記事内容は自分用のメモです

VRMモデルにOVRLipSync使って口パクさせる

OVRLipSync

Oculusのリップシンク

OVRLipSync自体は昔使ったことがある。

bibinbaleo.hatenablog.com

https://cdn-ak.f.st-hatena.com/images/fotolife/b/bibinbaleo/20171228/20171228232322.png

WinMR with プロ生ちゃんでVtuberになる。 - トマシープが学ぶ

ただ、VRMには適用したことなかった。

なんかVRMとORLipSyncを変換するものが必要らしい

VRM+リップシンクのサンプルスクリプトなど

VRMLipSyncContextMorphTarget

OVRLipSyncを使ったシンプルなスクリプト1枚

github.com

VRMLipSync_CorrespondOVRLipSync

ねこますさんの

github.com

ご本人による解説記事

qiita.com

VRMLipSyncSample

SALSAというリップシンクアセットを使ったバージョンとOVRLipSyncを使ったもの両方ある

github.com

qiita.com

昔はOVRLipSyncがiOSに対応していなかったのでSALSAを使うしかなかったぽい

qiita.com

assetstore.unity.com


だがOVR1.36.0でiOSサポートしたので、SALSAを使う必要はないかも

f:id:bibinbaleo:20200716110234p:plain

OVRLipSyncで動かす

過去のOVR記事を見ると微妙に使用が違ったりする。

OVRLipSyncのアップデートによるもの。こちらが詳しい

qiita.com

 

ここからOVRLipSyncをダウンロード。私は最新版1.43.0をダウンロードした

developer.oculus.com

使い方の記事。VRM用には一番上で紹介したスクリプトを使っている。

shinrinmusic.com

設定

下の3つのスクリプトをつける。モデル本体である必要はなく、空のオブジェクトに付けた

f:id:bibinbaleo:20200716150345p:plain

OVRLipSyncContextMorphTargetのSkinnedMeshRendrerにVRMのFaceを指定。

f:id:bibinbaleo:20200716150842p:plain

すると勝手に音のところにBlendShapeがセットされるが正しくない

f:id:bibinbaleo:20200716150342p:plain

とりあえずaa E ih oh ouにはAEUOUAをセットしたけど、他のところを空にできない

MTH_CLoseを選べば口閉じそう。とりあえずこんな感じにしてみた。

f:id:bibinbaleo:20200716160059p:plain

この状態で実行。しゃべると反応する。VRMとOVRを変換するスクリプト付けなくていいのか?

f:id:bibinbaleo:20200716160626g:plain

無音の時の表情

無音のとき意図せぬ変な顔になる。FunがMaxになってた。

f:id:bibinbaleo:20200716162132p:plain

他の記事では怒り表情になるって書いてた。

注意点としては、アニメーションで上書きされることを防ぐために、OVRLipSyncContextMorphTargetのUpdate()をLateUpdate()に変更することが必要となることです。
また、OVR Lip Sync Context Morph Targetをデフォルトのままにしていると怒り顔がデフォルトになってしまうのでViseme To Blend Targetsの各要素を指定しなおしましょう。(私は要素0を26にしました。)

VirtualCharacterTools作成2(リップシンク) : 情報系男子の備忘録

 MorphTarget全部変えているんだけどなー

VRM

坪倉さんのVRMLipSyncContextMorphTargetを付けて、OVRLipSyncContextMorphTargetを消す。LipSyncContextにOVRLipSyncContextをセット

GitHub - TsubokuLab/VRMLipSyncContextMorphTarget: OVRLipSyncでVRMモデルのリップシンクをさせるシンプルなやつ。

f:id:bibinbaleo:20200716165054p:plain

すると変な表情もならないし、モーフは勝手にスクリプトの中で設定してくれる!

f:id:bibinbaleo:20200717084038g:plain

 

sotanmochiさんのVRMLipSyncMorphTarget.csのほうもつけてみた

https://github.com/sotanmochi/VRMLipSyncSample/blob/master/Assets/VRMLipSync/VRMLipSyncOculusLipsync/Scripts/VRMLipSyncMorphTarget.cs

f:id:bibinbaleo:20200717084619p:plain

同じように動いた。

こちらはVRMアバターについているBlendShapeを付ける必要がある。

坪倉さんのはシーンにあるBlendShapeを取得する

proxy = FindObjectOfType<VRMBlendShapeProxy>();

 

最後に

OVRだけでもできるけど、VRM用のを使ったほうが良さそう

bibinbaleo.hatenablog.com