PSDToolKit+UTAUでリップシンク
今回割ととっちらかり気味なので要点を先に
・「UTAUからPSDToolKit用labファイルを作る」スクリプトで
・リップシンク(口パク)や口パクではないアニメーションを
・手軽にざっくり作る
説明ッ
PSDToolKitとは
AVIutl上で"差分つきのキャラクター立ち絵"をよしなにするツールです。
AVIutlを経由せずにこのページでPSDファイルを読み込んで表情差分をひとつずつPNG形式で書き出すこともできる。
PSDToolKitにはいろいろな便利機能があり、そのひとつがまばたきやリップシンク(口パク)のアニメを自動でつけるもの。
今回は「歌に合わせたリップシンク」をやります。
1.「.lab」ファイルを作る
母音の形に合わせたリップシンクアニメーションを行う「口パクあいうえお」に必要な「.lab」形式のファイル※はデルタさんのプラグインを使って.ust(UTAUのプロジェクトファイル)経由で作ります。
母音情報のみをlab形式に変換するため、ust側をいじって両唇音(上下両方の唇を使って調音される子音、日本語ではマ行・バ行・パ行・ワ等)の手前に口を閉じる用の短い「ん」を入れておくとよいとされる。
昔はUTAU上で母音・子音を分割するプラグインがあったんですが配布終了されているんですよね なので気合でどうにかしました
2.AVIutl側での作業
・PSDToolKit対応の立ち絵ファイルを読み込み、目パチ口パク用のスクリプトを登録
私は↓これをAVIutlの「スクリプト制御」に入れた状態でエイリアス登録し、一発で呼び出せるようにしています。(実際に使うときは「LipSyncSimple(口パク開閉)」と「LipSyncLab(口パクあいうえお)」のどちらか片方だけを残してもう片方は削除)
自作PSDToolKit用立ち絵はフォルダ名とパーツ名をすべて統一したのでこれで流用できます。複数人並べるときは目パチの引数2(間隔)と引数3(速度)をキャラ毎にバラけさせるとかするとよい。
PSD:addstate(require("PSDToolKit").Blinker.new({"v1.!目/*閉じ","v1.!目/*ほぼ閉じ","v1.!目/*半開き","v1.!目/*ほぼ開き","v1.!目/*開き"},4,1,0))
PSD:addstate(require("PSDToolKit").LipSyncSimple.new({"v1.!口/*ん","v1.!口/*う","v1.!口/*う","v1.!口/*あ","v1.!口/*あ"},1,true))
PSD:addstate(require("PSDToolKit").LipSyncLab.new({a="v1.!口/*あ",i="v1.!口/*い",u="v1.!口/*う",e="v1.!口/*え",o="v1.!口/*お",N="v1.!口/*ん"},1,true))
あとは「準備オブジェクト」や音源、labファイルを適切に配置・指定すれば曲に合わせた口パクは完成。
そこらへんの基本的なやりかたはPSDToolKitのリファレンスを参照してください
一瞬で完成するので本当にありがたいものです。もっと早く導入しておけば…….。
それはそれとして
「目パチ」「口パクあいうえお」を流用してギターを弾いている風のアニメーションをつける
今回はこっちが本題です。「それっぽいアニメーションをサクッと作る」ものなので"コードを押さえる指の位置"などの正確性はぶん投げています
最初は「口パク開閉のみ」(音量を参照して自動で開閉)を使おうとおもったんですがうまく認識されなかったので
・右腕(ギターのピッキング)は音に合わせて動かしたい→口パク用スクリプトの流用
・左腕(コードを抑える手)は割と適当に時々動かしたい→目パチスクリプトの流用
という感じでやっていくことにしました。
1つの立ち絵PSDに別々のレイヤーを割り当てたスクリプトを設定したためなのかなんなのか(未検証)、
「目パチ&口パクを割り当てたPSD立ち絵」と「右腕&左腕を割り当てたPSD立ち絵」が1つの拡張編集タイムラインで共存できなかったので別なプロジェクトファイルを作って作業するはめになった。……独自の定義を書けばよかったのでは?
1.本来口パク用の「口」レイヤーが設定されるべき所に「右腕」を入れる
PSD:addstate(require("PSDToolKit").LipSyncLab.new({a="v1.!右腕/*右腕1",i="v1.!右腕/*右腕2",u="v1.!右腕/*右腕1-2",e="v1.!右腕/*右腕2-2",o="v1.!口/*お",N="v1.!口/*ん"},1,true))
ご覧の通り右腕の位置が「右腕1」「右腕2」の2パターンあって、
腕の位置がそのままで手首だけ動かしたものが「右腕1-2」「右腕2-2」です。
(パターン数が少なかったので「お」と「ん」はそのまま)
2.左腕(ネックを抑える手)のレイヤーを目パチ用スクリプトに割り当てる
これも左腕のパターンが2つしかないのでざっくり割り当て。一定タイミングで左腕がちょこちょこと動きます。
PSD:addstate(require("PSDToolKit").Blinker.new({"v1.!左腕/*左腕1","v1.!左腕/*左腕1","v1.!!左腕/*左腕1","v1.!!左腕/*左腕2","v1.!左腕/*左腕2"},2,1,0))
3.midiファイルのギターパートをUTAUにインポート
UTAUは和音を読み込めないんですが、「ギターの音が鳴るタイミング」の指定にしか使わないので和音になっている部分はあらかじめノーツを1つだけにしておくとよい。
4.UTAU上で歌詞……歌詞?を割り当てる
腕の位置が同じで手首の位置が変わる(ピッキングの表現)「あ・う」「い・え」を連続で入力
5.「.lab」を書き出して通常の目パチ口パク同様にAVIutlで作業する
動画は無音です。
ちなみにこれは説明用に作ったIMI(EXT-G)のBPM97の48分※(BPM291の16分相当)オルタ。
音階は無関係にピッキング速度を合わせただけのかなり雑なustファイル
※一般的な楽譜の表記で「3連8分」になるところを音ゲーマーは何故か「12分」と呼ぶ。同様に3連16分音符→24分、3連32分音符→48分
6.できあがった「ギターを弾いてるっぽいアニメのついた立ち絵」をメインの動画プロジェクトファイルに読み込ませて目パチ口パクと合成
こうしてできあがった動画がこちらになります。
おまけ
先述の「1つの立ち絵PSDに別々のレイヤーを割り当てたスクリプトを設定したためなのかなんなのか」を検証するためにいろいろいじって結局なんかよくわからないことになったが没にするのもしのびないので動画にした。