凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

ユニティちゃんが声に合わせて口パクしてくれるリップシンクアセットを作ってみた

はじめに

以前、UnityMMD4Mecanim を利用した MMD モデルさん達がリップシンクしてしゃべってくれるアセットの作成を行いました。

これを利用して、ユニティちゃんリップシンクをしてもらおうと何度か挑戦しようとしたのですが、モーフのさせ方が分からず諦めていた所、先日、MMD4Mecanim 作者である Nora さん(@Setereoarts)が、MMD4Mecanim にユニティちゃん用のモーフアセットを追加してくださいました。

これを利用してユニティちゃんがボイスデータに合わせて口パクしてくれるように更新してみましたので、その紹介をします。

デモ

利用方法

まず、ユニティちゃんアセット、MMD4Mecanim、MMD4Mecanim-LipSync-Plugin をそれぞれダウンロードし import します。

ユニティちゃん(UnityChan/Prefabs/unitychan)をシーンに配置し、MMD4Mecanim-LipSync-Plugin/UnityChanLipSync.cs をそこへアタッチします。そして、適当なユニティちゃんボイス(e.g. UnityChan/Voice/univ0015)を Inspector の「Uniy Chan Lip Sync > Play Voice Sound > Audio Clip」にセットし、ゲームを開始して「Uniy Chan Lip Sync > Play Voice Sound > Audio Clip > Play」ボタンを押すと、口パクしながら喋ってくれるようになります。

スクリプトから利用する際は UnityChanLipSync コンポーネントを取得して Play() を呼んで下さい。動画で使用したスクリプトは以下になります。

using UnityEngine;
using System.Collections;

[RequireComponent( typeof(UnityChanLipSync) )]
public class UnityChanVoicePlayer : MonoBehaviour 
{
    private UnityChanLipSync lipSync_;
    public AudioClip[] audioClips;
    public int index = 0;

    void Start()
    {
        lipSync_ = GetComponent<UnityChanLipSync>();
    }

    void Update() 
    {
        if (Input.anyKeyDown) {
            if (index < 0 || index >= audioClips.Length) index = 0; 
            lipSync_.Play( audioClips[index] );
            ++index;
        }
    }
}

MMD4Mecanim-LipSync-Plugin の詳細な利用方法は以前のエントリをご覧ください。

課題

再生直前に一瞬プチフリーズが発生してしまっています。これは、音声解析をするために AudioClip.CreatePCMReaderCallback をセットしているのですが、この内部で呼び出される AudioClip.InvokePCMReaderCallback_Internal() が重い処理のようで、プロファイラを見ると一瞬 98% くらいの処理を持っていかれているからのようです。時間が出来た時に追って調査したいと思います。

おわりに

表情に加えて口が動いたりするとよりキャラクターが活き活きすると思いますので、ご活用頂けると嬉しいです。何か不具合やご不明な点がありましたら Twitter 等でご連絡下さい。

UCL

ユニティちゃんライセンス

このコンテンツは、『ユニティちゃんライセンス』で提供されています