2023.10.16
AIを活用して、ダンスを踊ってみる
AaaS Tech Lab の平川です。
突然ですが、
皆さんは上手に踊りたいと思ったことはありませんか?
私は歌番組を観ているとき、同期がカラオケで踊っているとき、「上手に踊れたらな〜」と思うことがあります。
最近では、動画投稿型のSNSにも音楽に合わせてダンスした動画がたくさん投稿されておいます。
一人でいるときに、周囲に人がいないかを確認して踊ってみるのですが、どうも僕にはリズム感と関節の柔らかさが足りないようです。
ということで今回は、3D空間上で自分を踊らせてみることに挑戦します。
ただし、使うのはPCと1枚の顔写真のみです。
これは、私自身が思い立ったときに手元にあったのがこの2つだったからです。
もちろん高精度の3Dスキャナを使えば簡単にできてしまうことだったりもするのですが、この記事を読んで、興味を持ってくださった方が実際にやってみよう!となったときに手元にあるのは、この2つだろうということを想定しています。
目次
1. Blenderで世界を造る
2. PanoHeadを活用して自分を生成する
3. 生成AIをもとに、音楽とダンスを生成する
4. 3D系生成AIを活用して仲間を生成する
5. 制作物をまとめて1本の動画にする
1. Blenderで世界を造る
今回はBlenderを用いてサイバーパンクな世界を目指して制作を行いました。
Blenderでは様々な拡張機能がアドオンとしてネット上で販売・配布されています。建物の制作ではBuildify[1]というアドオンを活用しました。Buildifyは、家屋を構成する基礎的なパーツをプロシージャルに組み合わせることで建物を生成するもので、デフォルトでは下図のようなパーツが存在します。
記事画像
また、家の立地構造に関しては実際の地形から取得することにしました。こちらはBlosm for Blender[2]というアドオンを使用します。こちらを用いることで、下図のように、実際の地形情報を取得することができます*1
記事画像
記事画像
これらの平面に対してBuildifyを適用すると、下図のようになります。
記事画像
このようにアドオンを活用することで、簡単に建物を生成することができます。しかし、このままではレンダリングした際に壁に凹凸のない、味気ない建物になってしまうため、今回は基礎パーツに対してテクスチャやノーマルマップを設定し*2下図のようにカスタマイズしてみました。石のザラザラ感が出ました。
記事画像
また、サイバーパンク感を出すために、デフォルトのネオン看板に加えて、文字を使用したネオン看板も追加しました。
記事画像
以下が、実際にできた街の概観です。建物の低層階には光が届きにくいため、意図的にドアの縁にネオン発光を点けたり、光のワイヤーを配置するなどしました。
記事画像
2. PanoHeadを活用して自分を生成する
今回は1枚の顔写真から、頭部の3Dモデルを生成することに挑戦します。PanoHead[3]は1枚の単眼で撮影した顔写真から、被写体となる人物の様々な画角から撮影した頭部を生成する技術です。多数の画角にて生成した顔写真を用いて頭部の3Dモデルを復元することができます。
実際に平川の顔写真をもとにPanoHeadで3D復元を行うとこのようになります。
記事画像
この段階では3Dモデルに色がついていません。この問題についてはこちら[4]の議論を参考に3Dモデルのエクスポート時に色情報も含めることで解決しました。
記事画像
Created by PanoHead –
CC BY-NC-SA 4.0 license
身体については、Mixamo[5]で配布されている男性の身体を利用します。今回作成した頭部の3Dモデルと配布されている男性のモデルについて、Blender上で頭部の差し替えを行いました。
記事画像
加えて、頭部を差し替えた3Dモデルに対して、Mixamoでリグ入れ(骨格・筋肉の情報の付与)を行いました。
最終的に出来上がった自分の3Dモデルは下図のようになります。リグ入れを行ったことで、様々なモーションやポージングを適用できる状態であることがわかります。
記事画像
3. 生成系AIをもとに音楽とダンスを生成する
ダンスをするにあたり、音楽は重要な要素の1つです。この音楽について、近年、様々なText-to-Musicモデルが登場しています。今回はMeta社がリリースしたMusicGen[6]を用いて30秒の短い音楽を生成しました。なお、MusicGenはAudioCraft[7]というGithubで公開されています。
実際に生成した音楽は以下のようになります。
Prompt: create cyberpunk EDM, high tempo
Created by MusicGen –
CC BY-NC 4.0 DEED lisence
音楽の次はダンスモーションを生成します。EDGE[8]というモデルでは、与えられた音楽を元に、ダンスモーションを生成することができます。
実際に前の工程で生成した音楽に合わせたダンスモーションを生成してみました*3
Created by EDGE : Model weights trained by AIST++ Dataset –
CC BY 4.0 license
4. 3D系生成AIを活用して仲間を生成する
このまま動画の制作に移っても良かったのですが、一人で踊るというのはいささか寂しい気がします。そのため、Image-to-3Dの技術を活用して仲間を生成します。生成に使用したのはMagic123[9]というモデルです。Magic123ではNeRFとDMTetを段階的に使用することにより、1枚の画像から3Dモデルを復元することができます。
まずはSDXL[10]を用いて可愛らしい(?)ロボットの画像を生成しました。
Prompt: a cute robot, front view, 3dcg
記事画像
記事画像
この画像でMagic123を学習させると、下図のように3Dモデルを生成することができます。手指の細かな部分に関しては、潰れてしまっていたりするのですが、1枚の写真には情報のない背面部分に関してもうまく補完してくれています*4
記事画像
記事画像
この際、使用する画像について注意すべきことがあります。それは、できるだけ体の部位がはっきりしているものであることと、手と脚が重なっていない・繋がっていない画像であることです。前者については、リグ入れをする際に不自然な挙動を防ぐため、また後者に関しては3Dモデル化した際に手と脚が繋がってしまうことを防ぐためです。
5. 制作物をまとめて1本の動画にする
さて、制作に必要なパーツは揃いました。ここから実際に動画を制作します。動画のレンダリングにはBlenderを使用しました。
建物に関しては、「1.世界を造る」で制作した建物をそのまま使用します。
ダンスモーションの適用には、注意が必要です。EDGEで出力されるフォーマットはSMPLという形式のファイルです。動かしたい3DモデルはMixamoでリグ入れしたものであり、ボーンの情報が異なっています(下図:左がSMPLのボーン情報で右がMixamoでのボーン情報)。ですから、ダンスモーションのボーン情報と踊らせたい3Dモデルのボーン情報を手作業でリンクさせました。その際に使用したのがSimple-Retarget-Tool-Blender[11]というBlenderのアドオンです。
記事画像
この作業を、「2.自分を生成する」で生成した自分の3Dモデル、「4.仲間を生成する」で生成した仲間たちに対して行いました。
ここまで来たらあとはシーンの撮影です。Blender上で踊らせたい3Dモデルを配置し、カメラワークを設定します。今回は「タイトルアニメーション」「仲間の登場シーン×2」「みんなでダンスを踊るシーン」という4つのシーンを制作しました。
最後に、できた動画をVFXソフト*5で繋ぎ、効果音を入れ、動画として成立するように仕上げを行いました。
こうして出来上がった動画がこちらになります。
仲間のロボットが地面から浮いていたり、踊りが若干ぎこちなかったりと細かな点で気になるところはありますが、私が3D空間で踊っています。感動です。
6. 最後に
今回は1枚の顔写真とPCのみで、先端テクノロジーを駆使して私の3Dモデルを仲間とともに踊る作品を仕上げることができました。画像系の生成AIも発展し、今では動画でさえ作れるようになっています。この記事でも取り上げたように、3Dモデルでさえ生成できてしまう時代になりました。まだまだ商業的なクオリティには及ばずといった状況ですが、それでも1年前と比較しても目覚ましい発展を遂げています。
この記事で取り上げたモデルの他にも同様のモデル、更に進化したモデルが日々リリースされています。それらを組み合わせて何か1つ制作してみる、というのは技術トレンドを抑える上で、自分のやれることを増やすという意味で、すごく価値のあることだと感じました。
ちなみに、Text-to-3DやImage-to-3Dに関してはthreestudio[12]というプロジェクトで開発者が異なり実装方式も違う、ネット上に点在するソースコードを、統一したフレームワークで公開されており、誰でも簡単に試すことができます。
我々、AaaS Tech Labはビジネス面でのデータサイエンス活用の他にも、メディア・コンテンツ開発へのAI技術応用を進めています。
興味を持ってくださった方は是非、お気軽にcontactからご連絡をいただけると嬉しいです。
Reference
[1]Buildify:https://paveloliva.gumroad.com/l/buildify
[2]Blosm for Blender:https://prochitecture.gumroad.com/l/blender-osm
[3]PanoHead:https://sizhean.github.io/panohead
[4]PanoHeadで生成したモデルに着色をする:https://github.com/SizheAn/PanoHead/issues/27
[5]Mixamo:https://www.mixamo.com/
[6]MusicGen:https://audiocraft.metademolab.com/musicgen.html
[7]AudioCraft:https://github.com/facebookresearch/audiocraft
[8]EDGE:https://edge-dance.github.io/
[9]Magic123:https://github.com/guochengqian/Magic123
[10]SDXL1.0:https://ja.stability.ai/blog/sdxl10
[11]Simple-Retarget-Tool-Blender:https://github.com/cgvirus/Simple-Retarget-Tool-Blender
[12]three studio:https://github.com/threestudio-project/threestudio
注釈
*1 今回は地形の情報を平面として取得しましたが、建物の高度情報も取得し、3Dキューブの形式で取り込むことも可能です。
*2 テクスチャ・ノーマルマップなどに関しては、ambient CG, Poly Havenより取得したものを使用しました。いずれもCC0(パブリックドメイン)での利用が可能です。
*3 EDGEを出力する際にはFBX SDKが必要になります。こちらの議論が参考になります。
*4 白いロボットの後頭部が凹んでしまっていますが、バットで殴られでもしたのでしょう。こちらは異なるシードで試すなどで解消できる可能性があります。
*5 今回はAdobe After Effectsを使用して動画を仕上げました。