Unity SDK - Script経由でリップシンクを実現するには?

【Cubism SDKのバージョン】Cubism SDK for Unity R4 6.2
【OS名・バージョン】macOS Ventura 13.3.1
【開発使用ツール】Unity 2021.3.23f1
【不具合の状況】
◯発生事象
Unity SDK - Script経由でリップシンクがなかなか実現しないためご質問です。

◯詳細情報
・Live2dで制作したモデルをWebGLでビルドしてWebアプリケーションに組み込んでいます。
・音声はVoicevoxを使ってTypeScriptを経由してUnity Scriptへ渡すように設定しています。
・Unity Editor上ではこちらのドキュメントの設定は行っており、サンプルの音声をつけるときちんとリップシンクすることは確認済みです。
・SDKの中身を見て、CubismAudioMouthInputのメソッドのUpdate()の中にリップシンクさせる処理が入っているのではないかと推察して、同じ処理をするPublicUpdate()を作ってUnity Scriptで処理するようにしています。
・音声の再生はWebGLビルドして組み込んだUnityからできていることは確認済みです。

◯Unity Scriptの情報

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Live2D.Cubism.Core;
using Live2D.Cubism.Framework;
using Live2D.Cubism.Framework.MouthMovement;
using UnityEngine.UI;
using UnityEngine.Networking;

public class speakWithUrl : MonoBehaviour
{
    private AudioSource audioSource;
    private CubismMouthController mouthController;
    private CubismAudioMouthInput audioMouthInput;

    private void Start()
    {
        GameObject audioObject = GameObject.Find("Audio");
        if (audioObject)
        {
            audioSource = audioObject.GetComponent<AudioSource>();
        }
        else
        {
            Debug.LogError("Audio object not found in the scene.");
        }

        mouthController = GetComponent<CubismMouthController>();
        audioMouthInput = GetComponent<CubismAudioMouthInput>();
    }

    public void PlayVoiceFromUrl(string audioUrl)
    {
        if (!string.IsNullOrEmpty(audioUrl))
        {
            StartCoroutine(DownloadAndPlayAudio(audioUrl));
        }
    }

    private IEnumerator DownloadAndPlayAudio(string audioUrl)
    {
        UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(audioUrl, AudioType.WAV);
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success)
        {
            Debug.LogError(www.error);
        }
        else
        {
            AudioClip audioClip = DownloadHandlerAudioClip.GetContent(www);
            audioMouthInput.AudioInput.clip = audioClip;
            audioMouthInput.AudioInput.Play();
        }
    }

    private void Update()
    {
        if (audioMouthInput.AudioInput.isPlaying)
        {
            audioMouthInput.PublicUpdate();
        }
    }
}

上手い対処法がありましたら教えていただきたいです!!
よろしくお願いいたします。

@kanadyart

いつも弊社製品をご愛顧くださり誠にありがとうございます。
Live2Dスタッフでございます。

CubismAudioMouthInput.Update() は、Unityのイベント関数で、Unityによって呼び出されます。
そのため、 PublicUpdate() を作成して呼び出す必要はありません。

再生しているモーションにリップシンクのカーブが設定されているかをご確認していただけませんでしょうか?
Unityのイベント関数の実行順は Update() が呼び出された後にアニメーションが処理され、その後 LateUpdate() が呼び出されます。
もしCubismのモーションにリップシンクのカーブが設定されていた場合、生成されるAnimationClipから CubismMouthController.MouthOpening の値を操作するので、 Update() で設定した値が上書きされます。

以上、ご確認の程よろしくお願いいたします。

ご回答ありがとうございます。
「リップシンクのカーブ」と仰っているのは、Cubism Editor上で設定するリップシンク設定のことでしょうか。

もし上記の場合は設定済みです。もしくはUnity上で何らか設定する項目でしょうか。

こちらご回答お待ちしております。

@kanadyart

回答が遅れてしまい申し訳ありません。

回答ありがとうございます。
「リップシンクのカーブ」は、提示していただいたページの設定内容で間違いありません。
こちらが設定されている場合、前述の通り Update() のタイミングで操作した値がCubismMouthControllerの OnLateUpdate() が呼び出されたタイミングで上書きされてしまいます。
こちらを回避するには、 CubismMouthController.OnLateUpdate() よりも後に値の操作を行うことで回避できる可能性があります。
ただし、同じ LateUpdate() で処理を行わせてもスクリプトごとの実行順序はUnityが決めるため、その実行順も制御する必要があります。

Cubism SDK for Unityでは、スクリプトの実行順序を制御する機能がございます。
こちらを利用していただくことで意図したタイミングで呼び出すことができます。
実行順を制御させる手順については「独自のコンポーネントの実行順を制御させる」をご覧ください。

もし上記の方法で解決できない場合、検証のため、現象が再現する最小のプロジェクトを提供していただけませんでしょうか?
プロジェクトは以下にアップロードしてください。

よろしくお願いいたします。

@ono-at-live2d-com
頂いたアドバイスをもとに修正しましたが、まだ上手く動作しません。上記にプロジェクトをzipファイルでアップロードしました。ご確認よろしくお願いいたします。

@kanadyart

データの提供ありがとうございました。

UnityはWebGLへビルドした場合、音声再生機能の一部が使用できません。

そのため、Unityの機能によって、再生している音声から取得した値からリップシンクを行うCubismAudioMouthInputはWebGLでは使用できません。
お手数ですが、リップシンクは他の方法で実装してください。

よろしくお願いいたします。

ご回答ありがとうございます。
独自で実装するかWebGLの利用をやめることを検討します。

ご対応いただきありがとうございました。