作業メモ|ZHUOWARE BACKYARD TOP|ZHUOWARE表ページ
An Experiment of MMD Motion Generation
Feb. 24, 2009
by: zhuo http://zhuoware.blog110.fc2.com/
はじめに
位置づけと経緯
2009年1月31日夕方.子猫P 様の作品【巡音ルカ】メグルオト【オリジナル】の3DPV を観ていたとき:
ふと,ひらめきました.
「そうだ,フリューゲルホルンのソロの運指のモーションをつけよう---オーディオから.」
さて,どうするか.私は,ほかならぬ子猫P様が以前パッチを下さっていたツール"Ripples"を思い出しました.
"Ripples"は,私zhuoが,2008年5月,"VocaListener"(ぼかりす)に刺激をうけて制作し公開したツールです(Ripplesページ).
当時「...並行して,今後,コード整理ないし書き直しを行い,当初構想である汎用のフレームワークにシフトしてゆければと思っています.importer, processor, exporterの形で簡単に機能を追加できる形が夢です....」と語っていたものの,実際には,以後9ヶ月,進展は滞っておりました.
Ripplesのコードをもってきて,改造する形で実験を重ね,2009年2月3日未明に,最初の成果として下記の動画をupさせていただきました.
この時点では,調整もまだでしたし,まったく間に合わせのコードでしたので,きちんと調整をして使いやすいツールにまとめてから公開しようと思っていました.ところが作業を進めるうち,それにはかなりの時間がかかることがわかってきました.
そこで,MikuMikuDanceがリリースされてちょうど一年という記念すべき時期でもありますので,「ともかく上記の動画をどのように制作したのか」を,ありのままのデータとコードとともに,公開することにしました.
どうぞ,私の試したことを参考にしていただき,面白いツールをどしどし作っていただけたらと思います.リップシンクツールの時の経験は,「いろいろなツールが,それぞれの作者の思いを反映してそれぞれにすばらしく,使う側にとっては,自分にあったものを選べる幸せな状況になった.」ということでした.面白いものが出来ましたらぜひお知らせください,「ソフトウェアまとめ」にリストさせていただきます:-)
私自身も,もう少し整理を続けてみようと思います.
お力添えを下さっている方々
- MikuMikuDanceを制作された 樋口優様
- VMDConverterを制作された Yumin様
- 音楽・映像作品「メグルオト」を制作され,かつプログラミングにおいても数多くの示唆を下さっている子猫P 様
- 実験の間,あたたかい励ましの言葉をくださった にゃっぽん の皆様
お力添え下さっている皆様に,ココロから感謝もうしあげます.ありがとうございます!
Disclaimer
- 本ツールは個人的な実験の結果をご紹介するものにすぎません.ドキュメントは最小限であり,テストもほとんどしていません.ご使用は,パッケージ内容をご理解できる方のみ,at your own riskでお願いいたします.ツールのご使用により生じた結果については一切責任を負いません.
- 各種法令および製品使用許諾条項の遵守をお願いいたします.
- Vocaloid製品に関係される各社様および関係各方面から,本ツール,ないし関連情報の公開について中止の要請があった場合には,ただちに公開を中止いたします.その場合には,このページで告知いたします.
|
実験の説明
実験環境
- Windows XP Professional Version 2002 SP3 です.
- ActiveTcl 8.4 系. (最新である8.5系の一つ前の系列)
- free版をインストールしておいてください.「各種ツールのメモがき」にて言及しています.
- MikuMikuDance 2.02.
- こちらよりどうぞ.MikuMikuDance
- VMDConverter
- こちらよりどうぞ.VMDConverter
- そのほか,いくつかのフリーウェアを使用していますが,適宜探していただけるものと思いますので割愛します.
- Ripplesについては,Ripplesページにゆき,その最終版が実行できる状態にした後で,Ripples_0_16b_experimental.zipをMVFX_015.tclと同じフォルダに展開してRipples_0_16b.tclを実行してください.
これはあくまで実験用のコードを参考にご紹介するものであり,ご質問などに対応さしあげられない場合がありますことをご了解ください.
実験のながれ
次の通りです.
- MMDで,指が1本もピストンを押さえていない形をframe 0と60,3本ともピストンを押さえている形をframe 30の位置に手作業で設定し,VMD(motion)データとして保存しました.
 |
 |
1本もピストンを押さえていない形 |
3本ともピストンを押さえている形 |
- 保存したVMDデータを,VMDConverterで,CSVテキスト形式に変換しました.
- この観察により,時刻の表記法を把握しました.2列目がフレームindexのようです.
- CSVテキストから,人差指 off/on, 中指 off/on, 薬指 off/on という6種類それぞれについて,指の形の記述を取り出しました.たとえば,人差指off(ピストンおさえていない)は,行64,67,70の計3行で表現できます.この3行の記述をあとでテンプレートとして使います.
- トランペットの運指と実音;実音と周波数;(ついでに)実音とMIDI note number といった対応を調べました.
- プログラミングです.とりあえず,Ripplesを改造する形で,次のような機能を作りました.
- ピッチカーブを計算し,こまかい変動をとりのぞく.
- 周波数(Hz)から,実音名(MIDI note number)を求める.
- 実音名から,対応する運指(人差指,中指,薬指がそれぞれon/offどちらか)を求める.
- 各指について,その指の形をあらわすテンプレートにフレームindex(時刻情報)を入れ,VMDConverterが読める形のCSVテキストを作って,ファイルに書き出す.
- さて,オーディオの用意です.動画を再生しながら"Sound Engine Free"で録音して,ソロの区間の波形データを作りました.
- ピッチカーブを得るには,ソロパートを強調しないといけないと思い,"Vocal Reducer"というフリーウェアで,Vocalだけを残す"Inv"モードで,最高品質のモードでやってみました.
- さらに,ソロパート以外の低音域と高音域を,Sound Engine FreeのEQでおさえて,monoaural(Lチャンネルだけ使用)のデータにしました.
- 改造したRipplesに読み込んで,ピッチカーブをとりだしました(赤い線).「波形の上で右クリック-メニューでスペクトログラムをクリック; また波形の上で右クリック-メニューでピッチをクリック; スペクトログラムの上で右クリック-メニューで「半音にを丸める」,その後
- 冒頭など,1オクターブ下と間違えています.他にもあります.これは未解決です.一オクターブ下でも同じ運指のことも多いし,最初だから,と割り切って次に進みます.
- 新しく作った変換機能で,各時刻での実音名,そして運指をわりあてました.(緑の線)
- ここで,単純に「何Hzから何Hzの間は音名 何々」とやっているので,すれすれのところにくるとばたつきが生じます.基準ピッチを440Hzから少し下げたり,少し前のピッチと平均をとってこまかいギザギザを抑えたりしていますが,未解決です.とにかく,割り切って次に進みます.
- そこから,時刻と指の形とをあらわすデータを書き出しました.
VMDConverterで読めるCSVテキストの形式です.
このとき,単に,音のはじまる位置に,指の形のデータを書いていくだけでは,のっそりのっそりと,次の音にむかって常に指が動くことになってしまいNGです.0.1秒ぐらい前の位置に,前の音の指の形のデータを書くことで,音を出す直前で指の形がさっとかわる感じを出してみました.
- このCSVテキストを,ふたたび VMDConverter で,vmd形式(MMDのモーションデータ)に変換しました.
- できたvmdファイルを,MikuMikuDance2.02で読み込んで,オーディオとあわせてみました.それが,冒頭にご紹介した動画(ニコニコ動画)です.
考察
こうして動画を作ったわけですが,考えてみると,オーディオから実音名を得る部分は,商用のアプリケーションやハードウェアに入っている高精度なpitch-to-MIDI機能にまかせればよかったのでしたorz. ツールとしては,MIDIシーケンスからモーションを生成する部分に専念すればよかったのですよね...
というわけで,今後の課題,というか夢としてはつぎのようなことを考えます.
- MIDIシーケンスを読み取って,vmd形式(MMDのモーションデータ)を出力する単体のツールに切り離してまとめる.
- そのときには,MIDI note numberごとに,ユーザがスナップショットしたvmd形式のモーションデータ(あるいはポーズデータ)を設定できるようにする.
- 管楽器は,単音なので,比較的容易だったけれども,ピアノやギターは,シーケンスだけでは手指の形がひとつに決められないから,「どんなシーケンスでも」は難しい.けれども,コード弾きなら,代表的な手指の形を入れておいて,コードネームで指定し,ストロークに合わせてモーションをつければ,それらしく見えるかもしれない.
- コードネームは,MIDIシーケンスからならば容易に得られると思う.オーディオの場合は,WaveToneというフリーウェアのコードネーム判定機能の出力を利用すればできるかもしれない.
- ストロークは,MIDIシーケンスなら容易に得られると思う.オーディオからは,ちょっと難しいだろう.
そして,今回はRipplesを土台として使いましたが,Ripples自体の,プラットフォームとしての整備も,やっていければなあと思います.
時間をみつけてはときどきやっている趣味ですので,なかなか進まないのがせつないところですけれども...