2008年07月

2008年07月31日

VOCALOIDファイルでリップシンクしてみた その4 modo 302

さて、具体的なデータ作りをしてみるよ。

例えば「む」の発音を作ってみた。

mu

このモーフアニメーションはモーフターゲットの「n」から「M」へ変化させることを基本に、「n」の口をすぼませる補正用のモーフターゲット「narrow」を合成して作ったものだ。あーちなみに「M」は「う」の事ね。ボーカロイドデータにあわせたのでこうなってる。

そしてこれがそのアニメーショングラフ。

mu

「む」の発音をしているのはフレーム1〜11の間で、その前後は予備動作だ。データにするのはこの1〜11のところで、1のところを時刻0、11のところを時刻1とすると、モーフマップ「n」は時刻0で60%=0.6から始まって、時刻0.4(フレーム5)のところで0%になっているのでエンベロープデータはこんな感じで表わすことにしてみた。

n,0.0 0.6 0.4 0.0

モーフ名,時刻 値 時刻 値 ・・・・

この形式のデータを「n」「narrow」「M」のそれぞれで作って、ボーカロイドの「む」に対応した発音記号「m' M」をヘッダとしてまとめたのが以下のデータブロックだ。

[m' M]
n,0.0 0.6 0.4 0.0
narrow,0.0 0.7 0.4 0.0
M,0.0 0.2 0.4 1.0

このブロック1つで「む」の発音のアニメーションになる。時刻は0〜1で正規化されて、実際に使う時にはボーカロイドデータの発音の長さをかけて使う事になる。

ところで補正用のモーフマップ「narrow」だけど、素直に「n」のバリエーションを作った方がいいのか微妙なところだな。作る時はいろんな方法があって、一番簡単なのは「narrow」単独で思ったような形状になるまで調整してから頂点マップメニューのモーフマップツールで合成する予定のモーフマップを引き算する方法かな?(未確認だけど・・・)

自分は「narrow」のモーフマップを新規に作って合成するほかのモーフマップと共にデーフォーマーとしてメッシュアイテムに割り当てておいて、アニメーションのレイアウトにしてデフォーマーを操作してターゲットを変形させ、「narrow」デフォーマーの不透明度も100%にしておいて、レイアウトメニューのウィンドウ→タブ3Dで3Dウィンドウを1つ出して、こっちで「narrow」モーフマップを編集して、その影響をアニメーションレイアウトの方のビューで確認する形で作業してみたよ。デフォーマーの影響がビューポートの表示に出るのは「表示とコントロール」のアニメーションの「デフォーマーを有効」にチェックを入れたビューポートだけなので、これを逆手にとって、「narrow」のみのモーフ変形している画面と、デフォーマーによって複数のモーフターゲットが合成されている画面を両方出して、「narrow」モーフが合成されたモーフ形状にどのように影響を与えるかを確認しながら作業をしたってわけだ。

「む」のアニメーションをしているモデルデータをアップしておいたよ。

それではまた次回。

スクリプトまとめページ( Down Load はこちらから)  

カテゴリー別ページ



take_z_ultima at 12:07|この記事のURLComments(0)TrackBack(0)modo | CG

2008年07月30日

VOCALOIDファイルでリップシンクしてみた その3 modo 302

今までテンポをいい加減にして来たけど、ヴォーカロイドエディタの中では右上のところに出ている数字が基本的に演奏の速度を表わしているらしい。ただしトラックの上にTEMPOとBEAT欄があって、演奏の途中で変えられるから、ここだけ見ていてもダメみたいだ。

テンポ

今回は途中でテンポが変わるようなものはとりあえず諦めて、まずはこの数字からキーの時刻を割り出す方法を考えてみる事にした。で、上の画像では120.00っていう数字が出ているけど、これが何なのかって言うと、どうやら120個の四分音符で1分間の長さになると言う事らしい。と言う事は、1つの四分音符の長さは60秒÷120個=0.5秒って事になる。

ボーカロイドデータはMIDIが基になっているので、時間の表現方法もそれに倣っているようで、EventListとして出てくるデータのイベントの出現タイミングのデータはMIDIデータと同様の表現方法で表わされているようだ。

MIDIでは四分音符1つを480か960クロックで表わすのが一般的らしく、ヴォーカロイドのマニュアルを眺めていたら1秒間の分解能480という数字が見つかった。だからテンポ120の場合、四分音符1つが0.5秒でそれが480クロックなので、1秒を480÷0.5=960クロックとして計算すれば、クロックを時刻に変換できそうだ。

イベントのキーを打つ時刻をイベントデータから変換するには以下の式で良さそうだ。

イベント時刻=イベントデータ÷(分解能÷(60÷tempo))

今回は分解能が480で、tempoが120なのでイベントデータを960で割れば時刻が出るって事だな。

それから肝心のモーフィングアニメーションの方だけど、前回バージョンは母音の口の形を単純に繋ぐだけだったけど、それだと発音できない音とかが出てきたので、今度は母音の口のかわりに発音するモーションを複数モーフマップのエンベロープデータとして作成しておいて、それを繋いで使おうと思う。作業の流れは下の図のようになるかな。

fig02

例えば前回の「み」の発音なら「n」の口の形から「i」の口の形に変形させるモーションになるわけだけど、nのモーフとiのモーフが発音時間内でどのように変化するかをデータ化しておいて、

fig03

ボーカロイドデータから抽出した発音の長さに割り当ててやれば、モーフィングアニメーションのエンベロープデータになる。これを各モーフマップごとにリストとして蓄積しておいて、最後にそれぞれのエンベロープを時間軸に沿って合成してやればモーフマップごとのモーションカーブが生成できるはずだ。

fig04

ただ、全ての音に対してデータを作ったら大変なので、エンベロープデータが存在しない音については母音データから生成するようにすればいいだろうな。

でも今回は計画だけ。それではまた次回。

スクリプトまとめページ( Down Load はこちらから)  

カテゴリー別ページ



take_z_ultima at 12:01|この記事のURLComments(0)TrackBack(0)modo | CG

2008年07月29日

OpenGLをムービーに記録をやってみた modo 302

モーションのチェックは通常、アニメーションレイアウトに切り替えて再生ボタンを押して3Dビューポートを眺める方法で行うよね。ただこの方法だと重たいシーンは表示がカクカクしちゃって見え辛い。

それでもCPUパワーを使ってシーンをレンダリングする事と比べたら圧倒的にお手軽だ。

このお手軽さはひとえにグラフィックボードの3Dアクセラレーション機能によるもので、今や処理速度が1テラフロプスを超えるような製品まで出てきているくらいだ。この素晴らしいレンダリング能力を単に作業用のビュー表示だけで使うのはもったいない。そこでビューをそのままムービーファイルとして書き出してしまおうってのが301から付いた「OpenGLをムービーに記録」というコマンドだ。

でも何でだか知らないけどこの機能ってレンダーメニューにも出てこないし、マニュアルでも殆ど触れていないし、殆ど隠し機能みたいな感じなんだよね。新機能をチェックしない人だとその存在に気が付かない人だって結構いるんじゃないだろうか?

OpenGLをムービーに記録コマンドへのアクセスはレンダリングしたい3Dビューポートを右クリックすることで左のようなメニューが出てくる。コマンドはその一番下だ。

コマンドを起動するとムービーを記録する先を決めるファイルリクエスタダイアログが出てくるので、適当にファイル名を入力すると、何となく裏で作業が始まる。と言うのも、作業が進んでいるとわかるのはビューポートがアニメーションしている事と、タイムスライダが動いている事くらいで、レンダリングしている事を殆ど感じさせないからだ。そしてうっかり何か作業をしちゃうとムビーの出力は終了する。レイアウトをアニメーションにしている時はまだしも、タイムスライダも出ていないレイアウトでこのコマンドを使うといつコマンドが終了するのか凄くわかり辛い。何でノンモーダルな仕様にしたのか不思議でならない。

で、具体的にどの程度の効果が出るかを前回の口のアニメーションで実験してみた。

実験に使ったマシンはCore2Quad6600+2GBメモリー+Geforce8600GTX512MBでレンダリングしたシーンはサイズが453×374でフレーム数は590。ボーカロイドデータのチューリップの歌をアニメーションさせたデータだ。

レンダリング方法 レンダリング時間
デフォルトレンダリング
21分46秒
ワイヤーフレーム
7分
シェード
6分52秒
アドバンストGL
6分56秒

見ての通りCPUで通常のレンダリングを行った場合の3分の1の時間でレンダリング出来ている。が、逆に単純にビューポートで再生すると25秒で済むものが7分も時間がかかっているとも言える。仕組みから言って、もっとずっと早くレンダリング出来てもいい筈だ。そして、ワイヤーフレームもアドバンストGLもレンダリング時間に殆ど差が無い事から、このシーケンスのボトルネックはレンダリングにあるんじゃなくて、レンダリングデータの吸い上げ→圧縮→書き出しの作業のどこかにあるからなんだろうと想像が付く。ファイル形式や書き出す媒体なんかを変えられたらパフォーマンスを上げられるかも知れないな。

とは言えそれは今のところ無いものネダリなので、現在出来るパフォーマンスアップの方法を考えてみた。

1つはレンダリングするビューポートを小さくすること。画面の大きさが小さくなれば処理するデータの量も小さくなるからね。

もう1つはシーンのフレームレートを下げること。modoは時間ベースでキーが打たれているのでフレームレートを変化させてもアニメーションのタイミングは変化しない。単純にレンダリングする時間の間隔が変化するだけだ。だから秒間24コマでレンダリングしていたものを秒間8コマに変えてやるだけで3倍のパフォーマンスアップが期待できる(処理するコマ数が3分の1になるからね)。実際に上のレンダリングの例で7分かかっていたムービー作成がレンダリングのサイズが1.2倍になっても、秒8コマにして処理したら2分30秒で作業が終わった。

ちなみにこれがアドバンストGLのビューを書き出したものね。

sample.wmv (24FPSでレンダリングしたもの)

sample2.wmv (8FPSでレンダリングしたもの)

トータルの動きのチェックならこんなモンで充分かもしれない。干渉とかをチェックするなら1コマずつ止めてチェックするだろうから別にムビー書き出しの必要も無いしね。

それではまた次回。

スクリプトまとめページ( Down Load はこちらから)  

カテゴリー別ページ



take_z_ultima at 11:55|この記事のURLComments(1)TrackBack(0)modo | CG

2008年07月28日

LipSync研究用にモーフ付きで口だけモデリングしてみた modo 302

リップシンクはいろいろ面白そうなので、Ogreを使わないで新たに口だけモデリングしてみたよ。このデータならアップしても大丈夫だしねwww。

fig01

とりあえず修正しやすいように上下の歯と舌と唇は別レイヤにしておいたけど、アニメーションを付ける時は一緒のレイヤにまとめちゃった方が扱い易いよ。

さて、まずは基本となる母音の発音の口の形と「ん」の口の形のモーフマップを作ってみた。

これがニュートラル。何も力が入っていない時は口が半開きだwww

ニュートラル

これが「あ」の口。モーフマップ名は「a」になっている。

あ

「い」のモーフマップ名は「i」

い

「う」のモーフマップ名は「u」にしてあるけどボーカロイドファイルからリップシンクする時は「M」にしとく必要がある。

う

「え」は「e」。

え

「お」は「o」

お

「ん」は「n」

ん

これの組み合わせで何とかなるかと思ったけど、前回やってみたチューリップの歌の後半の「どの花ても〜」、の「み」の発音なんかは物凄く違和感があった。下のGIFアニメはニュートラルの口から「い」の発音をさせているところだ。母音だけで「み」を発音させようとすると、「い」も「み」も同じアニメーションになってしまう。

い

「い」と「み」は何が違うのか鏡を見ながら試してみて判ったのは、「み」の発音が出るのは、閉じた口が開いて行く時で、母音のように口の形状が固定されていては発音できない。これを踏まえて作ってみたのが下のGIFアニメだ。「ん」の口から「い」に変化させてみた。こうすると確かに「み」と発音しているような感じになる。

み

だから、リップシンクでモーションを生成する時は、固定した母音の口のモーフを繋ぐと言う発想から、発音する口のモーションを繋ぐ感じでやらないとダメそうだな。

とりあえずこの口のモデルはアップしておくよ。

それではまた次回。

スクリプトまとめページ( Down Load はこちらから)  

カテゴリー別ページ



take_z_ultima at 11:59|この記事のURLComments(0)TrackBack(0)modo | CG

1周間のご無沙汰でした

1週間はえー

皆様ご無沙汰でした。なんとか自分は生きております。

この1週間、少しでも身体を休めようとパソコンに触るのも最小限にして、体力の回復に努めてゴロゴロしてたら、あっという間に時間が経ってしまった。まさに光陰矢の如し。しかし今年の夏は身体に堪えるなあ。

夏だし暑中見舞いでも作ろうと思ってたんだけど、自分が見舞われる身になって情けないやら・・・orz

まだ体調の方も本調子じゃないので、土日は休んで週休2日くらいのペースで更新して行こうかなと考えているところなので、良ければまたお付き合い下さい。

m(_ _)m



take_z_ultima at 11:58|この記事のURLComments(2)TrackBack(0)その他 
Archives