MMDAgentをAgentに育てるブログ

MMDAgentを中心にプログラミング関係を書いていきます。

【アップ】MMDAgentWebDicMaker公開

お久しぶりです。熱伝導です。

以前練習で作ったEasyMMDAgentDicWriterですが、兼ねてからなぜこの程度のものでPython導入させなきゃいけないんだろとか我ながら思っていたのでjsで作り直し、サイト上でちょこちょこっと変換できるようにしました。

ファイルに直接書き出すわけではないのですが、LineTracerからコピーして貼り付けるだけなのでプログラミング慣れてない人にはこちらの方が楽だと思います。

 

以下ページになります。

MMDAgentWebDicMaker

f:id:yuta-sub:20171024192156p:plain

 

【追伸】

1年ぶりでぐらいですか・・・ずいぶんほっといたなぁ

MMDAgent本体の方は、地味にバージョン上がってたり、jado版でプラグインが動かせなかったり、やっとこできたluaでのシナリオ管理フレームワークのプロトタイプが本当にこれいるか?と疑心暗鬼になったりで完全に投げ出してました。

私生活的にも転職したりと転機だったので、これを気に復活したいな・・・。

とりあえずモチベ下がらないように小さめのプラグインから作っていこうかなと考えてます。

 

 

【雑記】MMDAgent邪道版導入!

忘れてましたが連絡用・たまに雑談ツイッターアカウント用意しました。たぶんサイドバーあたりに追加されてるはず・・・熱伝導です。

仕事の納期が近づくとろくに活動できないのですが、読んでくれている方もいるので生存報告を兼ねて
 
と、その前に
 
実はGW真っ只中、Ril言語の悪口でも書こうかと思ってたところ、このブログにまさかのRil言語作者本人様がご降臨し、そのうえMMDAgentの上位互換のMMDAgent邪道のwindows版まで提供していただくという奇跡のような出来事がありました。改めてお礼申し上げます。
 

f:id:yuta-sub:20160606035039p:plain

夢にまで見たPMX!!!!!!ありがとうございますっ!!!!!!

 

 

 

さて、ここまでしてもらっといて罰当たりも甚だしいのですが、もともとはなぜRil言語ではダメなのか? シナリオファイルはどうあるべきか? など書いていこうと長々書き溜めたりしてました。
してたのですが、正直Ril言語作者様が現在も活動中で既にRil言語を捨てていると判明した今、Ril言語のダメ出しなんかしてもしょうがないですよね・・・。
とはいえ、自分の制作に絡む部分があるのと、悪口を書くと言った手前このまま伏せても申し訳ないと思うので簡潔にまとめだけ書きます。
 
 
Ril言語に足りなかったもの
 
それはオブジェクト指向です。
 
 
要はRil言語でもまだ書きづらかったんですね。Ril言語が悪いというよりは根本的に手続き型言語の限界です。
fstファイルという命令型言語がRIl言語で手続き型言語になったというのならば、行き着く先はオブジェクト指向言語というのはプログラミングの歴史に沿った自然な流れだと思います。
 
とはいえ先述した通り、MMDAgent邪道版ではRil言語に代わってオブジェクト指向で記述可能なlua言語が採用されています。
pythonでまったく同じものを作ってたのですが、車輪の再発明だったというオチです。
改めて悪口書いてすみませんでした・・・。
少し残念ですが車輪の再発明は悪。せっかく先人が作ってくれていたというなら素直に甘えて次のステップにいきます。
初期の記事から今まで散々言語について言及してきましたが、全てはここから先がやりたかったためです。
 
 
次の目標
 
 
シナリオ作成のためのベースクラス作成、及びモジュール化
 
 
要は実際にオブジェクト指向でシナリオを書くための専用クラス群を用意しようって話です。
とりあえずざっくりクラス図など書いて作ってみてはいるのですが、まだまだlua言語に振り回される日々。
lua言語の情報少なすぎて思わずリファレンス本買っちゃったよ……てかIDEどれ使えばいいんだ……Atomさんで頑張ってるけど限界があるぞ……
このあたりは慣れていくしかないですね。
手探りで頑張っていこうと思います。
 
 
そして最後にしれっと個人宛に書くのですが・・・、
nothan様
MMDAgent邪道のwindows版、自分が頂いたものは正式に一般公開ってことでいいのでしょうか?
自分が現在製作中の部分、というか基本的に制作物はすべて公開していきたいと思っているのですが、邪道版を採用すると当然邪道版ありきの作りになるため、改めて確認させていただきたいです。
公開していただけるのでしたら、自分の制作物の配布に加えて、改めて邪道版の紹介記事や導入方法記事など布教方面でもできるだけ協力させていただきたいと思います。
 
コメントで構いませんのでお返事お待ちしております。
 
以上!

【雑記】ボカロ歌舞伎観てきました

不定期更新なうえ今回はMMDAgentとはあまり関係ないです。熱伝導です。

土曜の朝にネットニュースでボカロ歌舞伎の存在を知り、急遽初のニコニコ超会議に行ってきました。
歌舞伎目的で行ったのでほとんど回れてないのですが意外と楽しかったです。

さっそくボカロ歌舞伎ですが正直話の内容はまああまり面白くない。悪いとかでなく歌舞伎ってこういうもんなんだろうなという印象。
いつも悪口っぽくなって申し訳ないけど他意はない。ネットぐらい正直に書きたい。
ただ全体として面白かったか面白くなかったかと聞かれれば非常に面白かった。
最初こそ退屈だなと思いましたが最後は周りに混じってスタンディングオベーションしてました
役者さんの演技の迫力が凄い。雑技っぽいのもしてて驚き。
加えてミクさん投影用のパネルを使って魔法攻撃みたいな演出があったりとなかなか工夫してありました。
というかミクさん完全におまけか釣り餌。良い意味でまんまと釣られました。
会場で紹介されてた知識なんだけど歌舞伎って公演中に名前叫んだりとかしていいんですね。この辺り非常にオタク文化に合うんじゃなかろうか。
最後に歌舞伎役者さんにペンライト振りながら千本桜が流れるカオスさは非常に好き。

まあ思いのほかに面白かったので感想など書いてみましたが今回の本当の目的はミクさん投影技術を生で見る事。基本インドアなので動画でしか見た事なかったのです。
ミクさんの投影技術はわりと評判が良かったので期待してたのですが結果としては五分というかまだ問題が残ってる感じ。
自分は急遽参加だったため自由席だったのですが確保した席はホール2階の舞台斜め前。全体が死角なく観れてなかなか悪くない席だったのですがいざ始まってみるとミクさん全然見えない。非常に暗い。うっすら幽霊のように映ってるのはわかるってぐらいでとても褒められた見た目じゃない。
序盤のテンション低かったのは9割これのせい。ガッカリもいいとこだった。
そんな感じで陰鬱と眺めてたのですが話が進みミクさんが舞台を動く。


あれ。凄くね?

ミクさんが動くのに合わせて後ろのプロジェクターらしきものが動く。
結果的にプロジェクターとミクさんと自分が線上に並ぶ配置になった時、ミクさんがハッキリ映った。
凄い。さすがに現実と見分けがつかないってレベルじゃないけど演出としては十二分に許容範囲。遠目ならそこまで違和感ない。それこそライブみたいな人間と比較されない一人舞台なら難なく受け入れられるんじゃないだろうか。

要するに視野角の問題なんですね。今の投影技術だとちゃんと見れるのはほぼ正面に限られると。
まあ言われれば確かに聞いてた問題なのですがここまで違うとは思ってなかった。ただ、この辺りはプロジェクター追加するとかで解決する問題なのかな。

という流れで結果としては五分と評価しました。
いや五分とか言ったけど正面席しかないライブホールとかなら全く問題ないんじゃないかな。
めちゃくちゃ凄かった。

視野角はやっぱり映像では付いて回る問題ですね。例えばMMDAgentを立体っぽく見える方法などはよく妄想するのですがやっぱり斜めで見た時にどうするかが鬼門。一人ならキネクト系で人間捉えてモデルをその方向に合わせた配置とかもできるけど多数だとやっぱり破綻する。
この辺りはハード屋の頑張りに期待する。俺には無理だ。
そういえば複数のプロジェクターで投影するプロジェクトがあった気がするけどどうなったんだろうなー。

というわけでレポートのようななにかでした。

ついでというかMMDAgentのシナリオ問題の方ですが峠は抜けた感じです。GW中にだいたいの形はできそう。



【MMDAgent解説】MMDAgent1.6でのプラグインの作り方

不定期更新ですが活動してないわけではない熱伝導です。

 今回も何故無いのかわからないシリーズ。

自分の忘備録を兼ねてMMDAgentのプラグインの作り方を画像付きでできるだけわかりやすく書いてみたいと思います。こういうの書くの初めてなので至らぬ点はご容赦ください。

環境

OS以外は最新環境だと思います。

MMDAgentのプロジェクト環境作りは説明しませんが公式mmdagent.jpのSourceページからダウンロードしたものの中にあるMMDAgent_vs2010.slnをVisualStudioで開くだけでいいはずです。

ビルドして動かしてみる時はReleaseフォルダにSampleの各種ファイルなどを入れておくのを忘れずに。

 

1. 準備

プラグインを作るにあたってまずは下記サイトから雛形プロジェクトをダウンロードしてください。

MMDAgent & Project-NAIP wiki  > プラグイン作成

大半の人は拝見済み、もしくは既に挫折済みだと思いますが偉大な先駆者様のサイトです。

雛形プロジェクトも結構古いのですが、それでも1から作るよりは雛形プロジェクトを改修した方が早いので利用させていただきます。

ダウンロードして解凍したPlugin_Skeletonディレクトリとその中にあるPlugin_Skeleton.vcprojの名前を変更しておきます。他ファイル名はまだ変えないでください。

ここではPlugin_testCommandにリネームして進めます。

 

2.VisualStudioでプロジェクトを追加する

リネームしたPlugin_testCommandディレクトリをMMDAgentのソースディレクトリに移動させます。

f:id:yuta-sub:20160327181556p:plain

 

移動後はVIsualStudioでMMDAgentのソリューションを開き、「ファイル」>「追加」>「既存のプロジェクト」から移動させたtestCommandディレクトリ内のPlugin_testCommand.vcxprojを追加します。

f:id:yuta-sub:20160327183703p:plain

 

 

プロジェクトのアップデートを聞かれるのでチェックの入ったままOKで進めます。

f:id:yuta-sub:20160327184811p:plain

 

追加されたプロジェクトは名前がPlugin_Skeltonになってるので先ほどと同じくPlugin_testCommandに変更します。この段階で各ファイル名も変更可能です。

 

 

3.依存プロジェクトを設定する

追加したプラグインのプロジェクトを右クリックして「ビルド依存関係」>「プロジェクトの依存関係」を選択します。

f:id:yuta-sub:20160327191822p:plain

 

依存関係で

「Library_MMDAgent」

「Library_MMDFile」

をチェックしてOKを押します。

f:id:yuta-sub:20160327192224p:plain

 

 

4.必要なライブラリを設定する

ここからはMMDAgent1.6用の設定です。

MMDAgent1.6ではフォント周りと正規表現のライブラリが追加されたらしく、この2つもビルド時に要求されるので設定する必要があります。

まずは必要なライブラリファイルがどのディレクトリにあるか設定します。

プラグインのプロジェクトを右クリックして「プロパティ」>「リンカー」>「全般」>「追加のライブラリディレクトリ」を選択します。

f:id:yuta-sub:20160327193244p:plain

 

直接書き加えても、右側のリストから編集画面を使ってもいいのですが以下の2行を追加します。

..\Library_FreeType\lib
..\Library_RE2\lib

直接書き加えるときはセミコロンで区切ること。ピリオド2つは親ディレクトリって意味の相対パスです。親であるMMDAgentディレクトリ内の各libディレクトリをを見てくれってことですね。

 

ライブラリディレクトリの指定は終わりましたので次はどのファイルを使うか設定します。

同じくプロパティから「プロパティ」>「リンカー」>「入力」>「追加の依存ファイル」を選択します。

f:id:yuta-sub:20160327194248p:plain

 

ライブラリディレクトリと同じように以下の2行を追加します。

FreeType.lib
RE2.lib

これでどこのどのファイルを使うという設定は完了しました。

最後にビルドしたdllファイルを書き出すディレクトリを設定します。

「プロパティ」>「構成プロパティ」>「全般」>「出力ディレクトリ」を下記のように書き換えます。これでMMDAgentのReleaseディレクトリ内のPluginsディレクトリに書き出されるようになります。

f:id:yuta-sub:20160327222706p:plain

 

これでプロジェクトの設定は終了です。

私の環境では初期設定でなってましたが、場合によっては以下の作業も必要かもしれません。

・「プロパティ」>「全般」>「構成の種類」で「ダイナミックファイル(.dll)」を選択する

 

 

5.ソースコードを修正する

 ソースが一部古い関数を使っているせいでエラーが出ていると思います。

エラー部分を修正してみましょう。

Plugin_Skeleton.cpp内にあるsendEventMassate関数は古いMMDAgentの関数です。

f:id:yuta-sub:20160327214838p:plain

 

下記のように最新のものに書き換えます。

コピペ用コード:sendMessage(MMDAGENT_EVENT_PLUGINDISABLE,"%s", PLUGINSKELETON_NAME);

f:id:yuta-sub:20160327214839p:plain

 

3箇所あるはずなので全て書き換えてしまいます。

これで修正作業はすべて完了です。ビルドして実際にdllファイルが生成されたか確認して見ましょう。

今回追加修正したプロジェクトのフォルダをコピーしておけば以後は名前を変更して既存プロジェクトから追加するだけで使えます。

 

 

6.実際に動くかテストしてみる。

ここでは既存のプラグインの中で一番簡単な仕組みのEXECUTEコマンドを真似して動作確認をしてみます。

EXCUTEコマンドの処理内容はwindowsAPIのShellExecuteA関数に引数を渡して実行するだけなので実処理は一行で済みます。

 まずはPlugin_Skeleton.cpp内でコマンド名の宣言とwindows.hのインクルードを行います。includeは順番が影響しますのでとりあえず上に書いてください。

ここではコマンド名はS_EXCUTEとしています。これは実際にFSTファイルで使われる文字列と同じものです。

f:id:yuta-sub:20160327224012p:plain

 

extProcCommand関数に追加して以下のように書き換えます。

f:id:yuta-sub:20160327224155p:plain

 

 

ここまで書いたらもう一度ビルドしてみてください。

あとは実際にFSTファイルを適当に書いて動かして見ます。

f:id:yuta-sub:20160327224710p:plain

 

ホームページは表示されたでしょうか?

もし動かないようならdllファイルがちゃんとPluginsディレクトリに書き出されているかなどを確認してみてください。

 

プラグインの作り方は以上です。

実際、大したことしてないのでバリバリ書いてる人は今更って内容かもしれませんが自分は毎度環境作りのトラブルでこけてます・・・。1.6の動作確認するまで何時間かかったか・・・

なので他の人がそんな無駄な時間を使わないで済めば幸いです。

 

雑記1

Easyなんとかのバージョンアップが終わったので近況や予定などつらつら

と言っても相変わらずプラグインアップには至らず。年末年始は休日ほぼ返上で仕事に忙殺されてたのでひたすら妄想設計にふけってました。バージョンアップももっと早くしたかった……

バージョンアップにつきましてはコメントいただいたBURIさんに改めてお礼申し上げます。
お力になれませんでしたがユーザーのフィードバックを受けて改修するという貴重な体験をさせていただきました。
juliusのSVM組み込みの話など知ってるあたりMMDAgent開発の先駆者様のようなのでまた貴重な意見など頂けるとありがたいです。
SVMに関しては最近公開されたgoogleさんのTensrFlowを組み込めないかと密かに画策してたりはします。まだ圧倒的に知識が足りないので妄想レベルですが学習機能は今後絶対に必要になる要素なので注目してます。


さて、改めて今後の予定ですがとりあえず現在、fstファイルに変わる独自言語の実装を目標にしてます。
正直まだまだ基本設計レベル。もうホントいつ完成するのやら。それでもやっと形にできそう程度には固まってきました。

実はfst周り、正確にはVIManagerプラグインに関してはもう何年も前からずっと弄ってきました。
アクティブウィンドウを取得してアプリ名を指定せずキーコマンドを送る機能とかfstファイルの移動先遷移番号が連番なら加算演算子書くだけでいい機能とかプラグイン化こそしてませんが微妙な改造が施されてます。
このブログを書き始めるよりずっと前から、変数とはなんぞやレベルの素人の頃からなんとかMMDAgentを賢くしたいと頑張ってきました。

だからわかる。VIManagerの拡張では無理だと。こいつが諸悪の根源だと。

プラグインネタだけは逐一書き留めてます。プログラミング覚えてきた今ならわりとすぐ作れるであろうものもいくつかあります。
ただ、思いつくプラグインネタの大半は結局VIManagerの足りない部分の埋め合わせに行き着きます。そもそも、いくら立派なプラグインを作ってもVIManagerをなんとかしないことには満足に使いこなせないのです。

ということで腰を据えて取り掛かろうと思います。

独自言語は自分の考えてるMMDAgent改善案の中では音声認識精度に次いで難易度が高いと踏んでる部分。重要度なら音声認識精度以上。今後の進展はこの壁を突破できるかに掛かってます。
なんとか頑張って骨組みだけでも形にしたい。


以上、予定という名の意気込みなど長々書かせていただきました。
最近MMDAgentに時間割けなかったからこのフラストレーションを前向きに使っていきたいです。
作れるかなぁ……頑張ろう



【バージョンアップ】EasyMMDAgentDIcWriter_v1.1.0

まずはじめにEasyMMDAgentDIcWriterをダウンロードしてくれた方にお礼申し上げます。

どれぐらい嬉しいかというとついカウンター導入してしまうぐらい。

何よりまだMMDAgentに興味のある方がいるという事実が嬉しいです。

 

バージョンアップソース

MMDAgent関連 ファイル公開用ページ @Netudendo

 

さて、初コメントの貴重な報告を受け、文字コード周りの修正版をアップしました。

追加したのは2つ

1.インタプリタへの出力文字コード指定用の変数

2.dicファイルの文字コード自動判別

3.(こっそりミスコード修正)

 

主要機能での変更はありませんので前バージョンで問題なく動作している方にはあまり関係ありません。

dicファイル読めなかった時にちゃんとエンターで終了できるぐらいなので気になったらダウンロードしてください。

 

 

改めて修正点説明

 

1.インタプリタへの出力文字コード指定用の変数

今回のバージョンアップのきっかけです。なのに暫定的な対策です・・・。

インタプリタへの出力文字コード指定用変数を追加しました。

ソースの下記部分に表示したい文字コードを入力して保存してください。

 

PRINT_ENCODING = "" #空白で自動対応 指定時は"utf-8"などに変更する

 

実行時にインタプリタの日本語が化けるという報告を受けて調査したのですが残念ながら当方で再現できず・・・。一応python3は文字コードを自動で環境に合わせるはずなんだけどなぁ。ここらへんは正直知識不足です。

とにかく環境に依存する話だと思うので明示的に指定できる形にしました。

下記リンクに文字コードリストがありますので環境に合わせてお試しください。

7.8. codecs — codec レジストリと基底クラス — Python 2.7.x ドキュメント

 

 

2.dicファイルの文字コード自動判別

文字コード周りの調査中にふと思ったのが案の定。dicファイル書き出し時に文字コードを指定していなかったのでdicファイルの文字コードによっては文字化けを起こす不具合が判明したので修正しました。

shift-JIS、EUC-JP、utf-8utf-16対応です。設定としてはiso2022やutf-7も対応してたりするんですが未検証・・・。動いたらラッキーぐらい。まあこのあたりはメモ帳すら対応してないので気にする必要はないかな。

utf-16エンディアンは対応したので許して欲しい。こいつのためだけにバイトまで確認するハメになってしまった。

まあでも普通shift-jisかutf-8だよね・・・保険てことで。

 

【ツール配布】MMDAgentの辞書に単語登録するツール作ってみた

文句垂れるだけ垂れといてなんもしないのもあれなんで辞書登録の簡易ツールを勉強中のpython3で作ってみました。他に誰か作ってても良さそうなもんだけど自分は見つけられなかった・・・

将来的にはプラグイン化してリアルタイムで辞書登録可能も考えてるけどとりあえずはこの形でお茶を濁す。

 

ともあれ下記サイトよりダウンロードしてご利用ください。

MMDAgent関連 ファイル公開用ページ @Netudendo

 

python凄い。書くだけで動く。

単語と読み方と補正値を入力するとMMDAgent.dicファイルに書き込むだけのツールだけど音素列表とにらめっこしながらスペースとタブで細切れにする労力は節約できるかと思います。

pythonなのでデフォルトの設定の変更や改造したい時はファイルをテキストエディタで開いて直接書き換えるだけでOKです。自分好みにカスタマイズしてください。

 

現在第一、第三フィールドは<unk>決め打ちです。誰かこのパラメータの有用性を教えて下さい。

 

【準備】

1.python3を持ってない人は「python3 インストール」で検索。インストールするだけで大丈夫です。

2.ダウンロードしたEasyMMDAgentDIcWriter.pyをMMDAgent.dicと同じフォルダに入れる

3.EasyMMDAgentDIcWriter.pyをpython3で実行。python3がインストール済みならダブルクリックするだけでOKのはず

 

【使用方法】

指示通りに単語、読み方、補正値を入力してエンターを押すだけです。

書き込み対象のファイル名やフィールドの間隔、補正値はファイルを直接書き換えて変更してください。

 

サンプル画像

f:id:yuta-sub:20151123150618p:plain