LoginSignup
1
2

More than 3 years have passed since last update.

[Unity+Live2D]再生する音に合わせてリップシンクする

Last updated at Posted at 2020-01-19

はじめに

Live2Dモデルが再生する音に合わせてリップシンクする方法をまとめてみました。

リップシンクの設定をする前に今回のリップシンクする対象のモデルを以下の手順で配置します。
Unity初心者がUnityでLive2Dモデルを動かすため環境構築をした
image.png
口元がよく見えた方がいいので、Main CameraのSizeは0.7くらいがいいかもしれません。
image.png

起動時に音声を再生しリップシンクする

公式のCubism SDK Tutorial リップシンクの設定の手順を実施し、起動時に再生した音声に対してリップシンクするように設定します。

1.リップシンクを管理するコンポーネントをアタッチ
モデルのインスタンスにCubismMouthControllerをアタッチします。
image.png

Cubism SDK Tutorial リップシンクの設定 より、設定項目は以下の指定をする必要があります。

CubismMouthControllerには、設定項目が2つあります。
– Blend Mode:指定のパラメータに現在設定されている値に対して、Mouth Openingの値をどう計算するのかを指定します。
Mutiply:現在設定されている値にMouth Openingの値を掛け合わせます。
Additive:現在設定されている値にMouth Openingの値を足し合わせます。
Override:現在設定されている値をMouth Openingの値で上書きします。
– Mouth Opening:口の開閉の値です。1で開いた状態、0で閉じた状態として扱います。この値が外から操作されると、指定されたパラメータの値も連動します。

Blend ModeをOrverrideにします。

2.リップシンクをさせるパラメータを指定
モデルのインスタンスのParamMouthOpenYに
image.png
CubismMouthParameterをアタッチします。
これで、CubismMouthControllerでParamMouthOpenYが扱われるようになります。
image.png

3.指定されたパラメータの値を操作するコンポーネントを設定
モデルのインスタンスに自動リップシンクするためにリップシンクの入力用コンポーネントとしてCubismAudioMouthInputをアタッチします。
CubismAudioMouthInputはAudio Souceの音量でCubismMouthControllerのMouth Openingの値を操作しているようです。
image.png

Cubism SDK Tutorial リップシンクの設定 より、設定項目は以下の指定をする必要があります。

CubismAudioMouthInputには、以下の4つの設定項目があります。
- Audio Input:入力に使用するAudioSourceを設定します。ここで設定したAudioSourceにセットされたAudioClipの音量を使用します。
- Sampling Quality:サンプリングする音量の精度を設定します。以下の設定の並びが下になるほど精度が上がりますが、計算の負荷も上がります。
- High
- Very High
- Maximum
- Gain:サンプリングした音量を、何倍した値で扱うかを設定します。1で等倍です。
- Smoothing:音量から算出する開閉の値をどのくらいスムージングするかを設定します。値を大きくするほど滑らかになりますが、計算の負荷も上がります。

今回はGainを10、Smoothingを1にします。
Gainを小さくすると、口を開く大きさが小さくなります。
Smoothingを小さくすると、口の開閉の動きが緩やかになります。
リップシンクの動きを大きく滑らかにして見てみたいので、最大値を入れます。
(Cubism SDK Tutorial リップシンクの設定では、Gainが1になっていますが、1だとほとんど開閉しません)

CubismAudioMouthInputのAudio ImputにAudio Sourceを入れるとリップシンクしてくれるようになりますので、まずAudio Sourceを作りましょう。
Hierarchyタブで右クリックして、Audio Sourceを作ります。
image.png

Play On Awakeにチェックがついていれば起動時に音声ファイルが再生されます。
今回は起動時にリップシンクするところが見たいので、チェックします。
image.png

Audio Clipには音声ファイルを置きます。
音声ファイルはProjectにドラッグアンドドロップで置きます。
Unityで使える拡張子はオーディオファイル - Unityマニュアルに記載があります。
image.png

作ったAudio SourceはCubismAudioMouthInputのAudio Imputへ設定してください。
image.png

Playボタンを押してリップシンクするか見てみましょう。
音量に応じて口の開閉の大きさが変わると思います。

キー操作で再生される音声を変える

上記の操作だと決まった音声ファイルしか再生できないので、いろいろなファイルが再生できるようにしてみました。
C#スクリプトでAudio SourceのAudioClipを変更するようにします。

ProjectタブにC#スクリプトをAudioControllerという名前で新規追加します。
image.png

C#スクリプトをダブルクリックしてエディターで編集します。

using Live2D.Cubism.Framework.MouthMovement;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioController : MonoBehaviour
{
    [SerializeField]
    CubismAudioMouthInput audioMouthInput;

    public AudioClip AudioClip1;
    public AudioClip AudioClip2;

    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.Z))
        {
            // Zが押された時、AudioClip1を再生する
            playAudio(AudioClip1, stopAudio);
        }
        else if (Input.GetKey(KeyCode.Y))
        {
            // Yが押された時、AudioClip2を再生する
            playAudio(AudioClip2, stopAudio);
        }
    }

    public delegate void functionType();
    private IEnumerator Checking(functionType callback)
    {
        if (audioMouthInput?.AudioInput == null)
        {
            Debug.LogError("audioMouthInput.AudioInput no set");
            yield return null;
        }

        while (true)
        {
            // 1フレーム待つ
            yield return new WaitForFixedUpdate();

            if (!audioMouthInput.AudioInput.isPlaying)
            {
                callback();
                break;
            }
        }
    }

    private void playAudio(AudioClip audioClip, functionType callback)
    {
        if (audioMouthInput?.AudioInput == null)
        {
            Debug.LogError("audioMouthInput.AudioInput設定なし");
            return;
        }

        audioMouthInput.AudioInput.clip = audioClip; // 音声ファイルを変更
        audioMouthInput.AudioInput.Play();
        StartCoroutine(Checking(callback));
        Debug.Log("play sound");
    }

    // Checkingメソッドのcallbackメソッドで実行される
    private void stopAudio()
    {
        Debug.Log("stop sound");
    }
}

MainシーンにGameObjectを作成して
image.png
GameObjectにC#スクリプトを追加します。
image.png

GameObjectにフィールドを設定します。
Audio Mouth Inputにモデルのインスタンスを設定します。
image.png

上記で記載した手順「起動時に音声を再生しリップシンクする」でモデルのインスタンスにCubismAudioMouthInputをアタッチしていたら選べると思います。

Audio Clip1、Audio Clip2に音声ファイルを設定します。
Projectタブに音声ファイルを置いたものをドラッグアンドドロップしてください。
image.png

Playボタンを押して、Zを押すとAudio Clip1に設定した音声ファイルが、Yを押すとAudio Clip2に設定した音声ファイルが再生されます。

参考

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2