uLipSync icon indicating copy to clipboard operation
uLipSync copied to clipboard

uLipSyncTimelineEventの挙動の修正

Open mkc1370 opened this issue 2 years ago • 3 comments

概要

現在、Timelineとの連携の際に以下のような問題があります。

  • TimelineのProcessFrameのタイミングでリップシンクを動かすことができない(全てUpdateのタイミングになってしまう)
  • uLipSyncClipが無い箇所を再生していてもLipSyncUpdateEventが呼ばれてしまう

そこで、uLipSyncClipがある箇所を再生しているときだけ、uLipSyncTimelineEventのLipSyncUpdateEventをProcessFrameのタイミングで呼び出すように変更しました。

この変更は本来の実装の意図と異なっている可能性がありますので、ご意見頂けますと幸いです:bow:

詳細

uLipSyncMixer側

再生している箇所にuLipSyncClipがある場合のみ、OnFrameを呼び出すようにしました。

uLipSyncTimelineEvent側

OnFrameが呼び出された直後にLipSyncUpdateEventを発火させるだけの実装に変更しました。

問題点

uLipSyncTimelineEventのLipSyncUpdateEventに自作のイベントを登録している場合は挙動が変わってしまいます。 そのため、アナウンスをするか従来の挙動をするイベントを用意する必要があるかもしれません。 (個人的には従来の挙動をするイベントもあると分かりづらくなってしまうと思うので、アナウンスだけで良いかもしれません)

mkc1370 avatar Jun 01 '22 10:06 mkc1370

プルリクありがとうございます🙇 問題点把握いたしました。 仰るように Update() タイミングだと微妙ですね。何かしら修正が必要そうです。。 ただ現在の仕様は、Timeline での情報を受け取って uLipSyncBlendShape が動いてくれるように実装しています。 その関係で BakedFrame をキャッシュしておいて毎フレーム呼び出す、という実装になってしまっております。 (ただ今の実装もタイムライン実行にも関わらずフィルタでぬる〜〜っと口が動いて目的位置に到達する、みたいな挙動をするのでここも改善したい次第です…) OnFrame() タイミングでのみイベントを受け取るけれどタイムライン上で uLipSyncBlendShape がプレビューできる、みたいな実装がなにかあれば良いのですが…、すぐには思いつかないためもう少し時間をいただけると助かります。

現在の実装

lipsync-01

ご提案いただいた実装

lipsync-02

hecomi avatar Jun 02 '22 15:06 hecomi

なるほど…確かにそうですね… ありがとうございます 僕の方でも良い方法が無いか考えてみます:bow:

mkc1370 avatar Jun 06 '22 09:06 mkc1370

ありがとうございます!🙇‍♂️

おそらく根本としては私の設計が悪いところがあります... 毎フレーム更新前提の uLipSyncBlendShape をそのまま流用できるように、解析結果を保存した BakedData のフレーム情報を流し込む、という手法をとっていますが、あるフレームを指定するとそのフレームの結果が決まるようなタイムラインの手法と相性が良くないのですよね... (フィルタでスムージングしたりするので前の方のフレームの影響を受けるため)。

後は uLipSyncTrack のパラメタとして更新方法を指定するのもありかもしれません。毎フレーム呼ぶか、クリップがあるときだけ呼ぶかみたいな設定を持ち、Mixer でその設定に従って処理をして、その設定も含め uLipSyncTimelineEvent へ流す、というイメージです。もう少し推敲してみます。

hecomi avatar Jun 09 '22 17:06 hecomi