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

**URL:** <https://creatorsforum.live2d.com/t/topic/1614>\
**Category:** トラブル報告\
**Created:** [2023 年 4 月 24 日午前 10:35 UTC](https://creatorsforum.live2d.com/t/topic/1614 "2023-04-24T10:35:45Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![kanadyart](https://avatars.discourse-cdn.com/v4/letter/k/b4bc9f/32.png) [@kanadyart](https://creatorsforum.live2d.com/u/kanadyart)\
**Post date:** [2023 年 4 月 24 日午前 10:35 UTC](https://creatorsforum.live2d.com/t/topic/1614/1 "2023-04-24T10:35:45Z")

</div>

【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上では[こちらのドキュメント](https://docs.live2d.com/cubism-sdk-tutorials/lipsync/)の設定は行っており、サンプルの音声をつけるときちんとリップシンクすることは確認済みです。  
・SDKの中身を見て、CubismAudioMouthInputのメソッドのUpdate()の中にリップシンクさせる処理が入っているのではないかと推察して、同じ処理をするPublicUpdate()を作ってUnity Scriptで処理するようにしています。  
・音声の再生はWebGLビルドして組み込んだUnityからできていることは確認済みです。

◯Unity Scriptの情報

```auto
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();
        }
    }
}

```

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

---

<div class="post-metadata">

**Author:** ![ono-at-live2d-com](https://sea1.discourse-cdn.com/flex015/user_avatar/creatorsforum.live2d.com/ono-at-live2d-com/32/167_2.png) [@ono-at-live2d-com](https://creatorsforum.live2d.com/u/ono-at-live2d-com)\
**Post date:** [2023 年 4 月 27 日午前 7:30 UTC](https://creatorsforum.live2d.com/t/topic/1614/2 "2023-04-27T07:30:29Z")

</div>

@kanadyart 様

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

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

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

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

---

<div class="post-metadata">

**Author:** ![kanadyart](https://avatars.discourse-cdn.com/v4/letter/k/b4bc9f/32.png) [@kanadyart](https://creatorsforum.live2d.com/u/kanadyart)\
**Post date:** [2023 年 4 月 30 日午前 10:38 UTC](https://creatorsforum.live2d.com/t/topic/1614/3 "2023-04-30T10:38:18Z")

</div>

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

> **[BGMや音声を使用したシーンの作成 | Editorマニュアル | Live2D Manuals & Tutorials](https://docs.live2d.com/cubism-editor-manual/generating-scene-from-audio-file/)**

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

---

<div class="post-metadata">

**Author:** ![kanadyart](https://avatars.discourse-cdn.com/v4/letter/k/b4bc9f/32.png) [@kanadyart](https://creatorsforum.live2d.com/u/kanadyart)\
**Post date:** [2023 年 5 月 16 日午前 7:50 UTC](https://creatorsforum.live2d.com/t/topic/1614/4 "2023-05-16T07:50:10Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![ono-at-live2d-com](https://sea1.discourse-cdn.com/flex015/user_avatar/creatorsforum.live2d.com/ono-at-live2d-com/32/167_2.png) [@ono-at-live2d-com](https://creatorsforum.live2d.com/u/ono-at-live2d-com)\
**Post date:** [2023 年 5 月 17 日午前 8:14 UTC](https://creatorsforum.live2d.com/t/topic/1614/5 "2023-05-17T08:14:31Z")

</div>

@kanadyart 様

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

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

Cubism SDK for Unityでは、スクリプトの実行順序を制御する機能がございます。  
こちらを利用していただくことで意図したタイミングで呼び出すことができます。  
実行順を制御させる手順については「[独自のコンポーネントの実行順を制御させる](https://docs.live2d.com/cubism-sdk-tutorials/using-update-controller/)」をご覧ください。

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

> **[データ便 ｜無料無制限の大容量ファイル送信サービス - ファイルのアップロード](https://biz.datadeliver.net/posts/AJNVOsE6B26I)**
>
> 大容量ファイル転送サービス「データ便」。会員登録不要でも500MB、無料のフリープランで2GB、高速ビジネスプランはファイル容量無制限で100GBを超えるデータでも簡単に送信できます。本人確認機能を備えたセキュリティ充実の「セキュリティ便」もお使いいただけます。

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

---

<div class="post-metadata">

**Author:** ![kanadyart](https://avatars.discourse-cdn.com/v4/letter/k/b4bc9f/32.png) [@kanadyart](https://creatorsforum.live2d.com/u/kanadyart)\
**Post date:** [2023 年 5 月 28 日午前 12:00 UTC](https://creatorsforum.live2d.com/t/topic/1614/6 "2023-05-28T00:00:35Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![ono-at-live2d-com](https://sea1.discourse-cdn.com/flex015/user_avatar/creatorsforum.live2d.com/ono-at-live2d-com/32/167_2.png) [@ono-at-live2d-com](https://creatorsforum.live2d.com/u/ono-at-live2d-com)\
**Post date:** [2023 年 5 月 29 日午前 6:58 UTC](https://creatorsforum.live2d.com/t/topic/1614/7 "2023-05-29T06:58:20Z")

</div>

@kanadyart 様

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

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

> **[Audio in WebGL - Unity マニュアル](https://docs.unity3d.com/ja/2023.2/Manual/webgl-audio.html)**
>
> This page only provides information about audio capabilities in WebGL. To learn how to use audio in your Unity project, see the Audio Overview.

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

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

---

<div class="post-metadata">

**Author:** ![kanadyart](https://avatars.discourse-cdn.com/v4/letter/k/b4bc9f/32.png) [@kanadyart](https://creatorsforum.live2d.com/u/kanadyart)\
**Post date:** [2023 年 5 月 29 日午前 10:28 UTC](https://creatorsforum.live2d.com/t/topic/1614/8 "2023-05-29T10:28:36Z")

</div>

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

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