リップシンクもどきを作ってみた

ここしばらくプログラミングから離れてましたが、今日は久しぶりにスクリプトを書いていました。

 

動画で使用していた3Dモデルを変更した影響で、今まで使用していたスクリプトが使えなくなってしまいました。

 

以前の3Dモデルは非常に簡素なモデルだったので、しゃべっている雰囲気を出すのに首を少し動かすだけでひょうげんしてましたが、

 

今回の3Dモデルはそれなりに人型に近いため、しゃべらせるには口の動きを表現する必要が出て来たんですね。

 

 

そこでリップシンク(音声に合わせて口が動くやつ)の登場というわけです。

 

Unityにおけるリップシンクのプログラムはすでに先人(凹様)の方がプログラムを作っています。

tips.hecomi.com

 

 

これを使えばきれいに音声に合わせて口が動くことでしょう!

 

・・・使ったことないんですが。

 

本当は使いたかったんですが、正直重そうな気がしたのと、そこまでクオリティ高くする必要もないかと思って自作することにしました。

 

 

リップシンクするには音の周波数を分析してどの母音(”あ”,”い”,”う”,”え”,”お”のいずれか)の音を現在発声しているのか割り出す必要があるんでしょうけど、(詳しくは知りません)

 

ぶっちゃけアニメとかでもそこまで細かく口の動きを合わせたりはしてないはず。

(・・・してるかもしれませんが)

 

だったら、わざわざそこまで判別しなくてもそれっぽくなるんじゃないかと思って適当に作ってみました。

 

ちょうど、この方の作ったものに近い感じです。

unity-atelier.hatenablog.com

 

 

一応表情で、「あいうえお」の各口の形は作ったので、あとは音声が再生されてる間は適当に口の形を変えれば、なんだかそれっぽくなると思ったわけです。

 

・・・意外と違和感がありました。

 

 

というのも、音声データには無音の部分もあるわけで、

無音部分でも音声データ的には ”再生” 状態なわけで・・・

 

明らかに音が無いときも口が動いてしまうという。

 

なので、仕方がないから一応現在の音の周波数だけ取得して、(GetSpectrumDataでとれるようです)その値の大きさで適当に口の形を合わせることにしました。

 

作っておいてなんですが、

周波数の辺りは自分でもよくわからずに適当に作りました。

 

とりあえず配列で取得したfloat値で一番大きい値を見つけて、その値によって口を動かすかどうかと、口の開き方を対応させてみました。

 

本当のリップシンクだったら ”あ” を母音に持つ音の時に ”あ” のモーションを対応させるんでしょうね。

 

私は ”あ” の音の周波数の波形なんか知りませんので、適当に合わせました。

 

動かしてみたらまあまあの出来で動いたので、良しとしましょう。

 

 

モデル作成も一段落ついたので、今度はゲーム開発に取り掛かれそうです。