MikuMikuAI

提供: ディーズガレージ wiki
2017年3月15日 (水) 01:33時点におけるShogooda (トーク | 投稿記録)による版 (追記)

移動先: 案内検索
MikuMikuAI公開サンプル
MikuMikuAIモーションサンプル
MikuMikuAIスマホ、タブレット用


この記事は古くなっています。
6 追記をご確認ください。

コミュニケーションロボットを作りました。自分用でしたが一般のホームページで使用できる範囲のお手軽設計にして公開します。

このウィキページで準備と設置、カスタマイズ情報をまとめています。

利用について

4個のモジュールを1パッケージにまとめています。各モジュールにライセンスがありますので全てに承諾いただくか、一部モジュールを外すなど改造して使用する必要があります。

WebGL(MMDモデル)

表示の部分です。
WebGLとは、ブラウザー上で3DCGプログラミングを実現できる技術です。プログラミングにはthree.jsというラッパーを使用しています。MMDモデルとは、MikuMikuDance(MMD)のユーザーによる自作モデルデータのことです。MMDモデル製作者のライセンスにご注意してください。

人工知能(人工無脳エクサ)

知能の部分です。
人工無脳エクサとは、好感度パラメータと14種類の表情を持ったチャットボットです。エクサは名前を記憶し、好きな人、嫌いな人を判別し会話をしています。エクサは独自の会話エンジンで、より正確な会話が出来るようにプログラムされています。また人工無脳エクサには学習ソフトが添付されています。これを使い言葉を教える事で自分の手でエクサを育てる事が出来ます。Perlオリジナル版、PHP版が存在しPHP版を改造し使用しています。それぞれの著作者に従い、オープンソースとします。

音声認識(Web Speech API)

言葉を理解する部分です。
Web Speech APIは、音声合成と音声認識から構成され、キーボードやマウス以外の入出力の手段を提供します。現状GoogleChromeだけ対応しており、MikuMikuAIでは音声認識のみ利用しています。ブラウザ標準機能なのでライセンスはありません。

音声合成(NICTrospeex)

言葉を発する部分です。
rospeexとは、日・英・中・韓に対応したクラウド型音声コミュニケーションツールキットです。MikuMikuAIパッケージの中ではいちばん厳しいライセンスになります。無償ライセンスは商用不可。学術研究目的に限ります。また公開サンプルは直接NICTにつなげています。恒久的にはライセンスに問題があります。改善策を探す必要があります。

コーディング

各モジュールをつなぐコードは、しょうご@ディーズガレージでしています。オープンソースとします。
利用改造は各人の責任のもと自由にどうぞ。
本ソースを利用した結果による、直接間接を問わず、作者はその一切の責を負いません。

動作環境

サーバ

フルパッケージではPHP必須です。人工知能(人工無脳エクサ)を外すと制約はありません。

クライアント

IE11以下にも対応させていますが見栄えが全く変わってしまうためIE11以上か他のブラウザをオススメします。

ブラウザ 3D 音声 文字
入力 出力 入力 出力
Chrome
Firefox ×
Safari ×
IE11以上 × ×
iPhone(iOS8以上) ×
Android ×
  • スマホ、タブレット向けUIに文字入力インターフェイスを現状用意できていません。
  • 大語彙連続音声認識JuliusとwebRTCを使用することで音声入力可能なブラウザの種類は豊富になるはずですが'お手軽さ'で断念しています。
  • IEの音声出力不可はrospeexとの接続でmp3が得られない為です。

準備と設置

ソースコード

最新版ダウンロード Ai20150218.zip

Microsoft Security Essentials でウィルスチェックしています。

パーミッション設定

  • datフォルダ内の各ファイルのアクセス権を「666」にします。
  • その他フォルダと各ファイルのアクセス権を「755」にします。

ブラウザでindex.htmlにアクセスします。

フォルダ構造

aiフォルダ
.htaccess learning.phpのアクセス制限とcharsetをUTF-8強制にしています。

このアクセス制限の設定は自宅サーバのような状況で有効な設定です。レンタルサーバでは別の対応が必要です。learning.phpを削除してしまうのが最も簡単な対処です。

エクサPerlオリジナル版、エクサPHP版はEUC-JPを使用していますが、ajax.phpとindex.htmlに分離したことでjson接続エラーとなってしまいUTF-8にしています。

ajax.php エクサPHP版のルーチン部分と表示部分を分けルーチンをajax.phpとしindex.htmlからjsonで接続しています。
includefile.php <エクサPHP版から変更なし。>
index.html トップページです。表示と各モジュールをつなぐスクリプト全部をこの中に書き込みしています。
index-i.html スマホ、タブレット用です。index.htmlのユーザーエージェント解析でリダイレクトさせています。
learning.php 学習ソフトです。エクサPHP版ではgakushuu.phpです。ファイル名変更しました。現状CSS整形してませんので若干使いにくいと思います。
motions.html WebGLモーションサンプルです。削除して構いません。
setting.php <エクサPHP版から変更なし。>
sitemap.xml サイトマップです。使用する環境にあわせて書き換えてください。または、削除して構いません。
cssフォルダ <リスト省略>静的CSSは全てココに入っています。動的CSSは各html内で操作しています。
datフォルダ <リスト省略>エクサPHP版のデータをUTF-8に変換しています。
imagesフォルダ <リスト省略>エクサPHP版の画像をまとめ、追加画像を入れています。
jsフォルダ <リスト省略>jQuery、three.js、spin.jsを使用しています。
mmdフォルダ miku.js MikuMikuDance(MMD)のモデルデータとモーションデータをblenderに取り込みthree.js向けjsonデータに変換したものです。
sakine1.bmp miku.jsのUVマップです。
frag.glsl three.js用のフラグメントシェーダーです。トゥーンシェーダー向けです。
vert.glsl three.js用のバーテックスシェーダーです。トゥーンシェーダー向けです。

カスタマイズ

他の音声合成に変更する方法

他の音声合成エンジンに適当なものが見つからず、ヒント程度になりますが・・・。
少し長ったらしい説明になりますがエクサPerlオリジナル版、PHP版の処理の流れと改造した部分を理解していただく必要があります。 エクサPerlオリジナル版、PHP版では最初に名前を入力します。以後会話ができるわけですが会話を入力すると都度画面更新します。通常のINPUTタグでPOSTする挙動でこの際の名前val値が記憶されているため名前と会話のペアの情報を常に送っています。MikuMikuAIではこの最初の名前入力を省略しています。デフォルトで”名無し”というval値を持たせ、設定ボタンから変更可能にしています。多分、大量のアクセスが”名無し”であると同一人物と見てしまうので支離滅裂なことを話すことになりそうですがお手軽さで”名無し”を設定しました。設定ボタンから名前を入力してくれた場合は、cookieに記録させ以後キャッシュクリアされない限りエクサPerlオリジナル版、PHP版と同様の挙動になります。
MikuMikuAIでは次のように改造しています。

クライアントのブラウザで名前と会話文のjsonを作成しサーバのajax.php(エクサ)に送る

サーバのajax.php(エクサ)で名前と応答文を作りクライアントにjsonを返す

クライアントのブラウザで名前と応答文のjsonを受け取り、応答文だけをrospeexにjsonで送る

クライアントのブラウザでrospeexの応答文の音声変換データのjsonを受け取る

名前のテキストと応答文のテキストと応答文の音声データを表示・再生

という流れにしています。
この流れをそのまま使用する場合、FireBugやデベロッパーツールなどでjsonの内容を見ていただき適当な他の音声合成エンジンに換装していただくことになります。

オリジナルMMDモデルの作製と登録方法

エクサPHP版の14種類の表情と連動する形で説明します。14種類の表情はそれぞれ、0_ふつう、1_楽しい、2_あきれ、3_悲しい、4_怒り、5_テレ、6_笑い、7_驚き、8_OP、9_哀愁、10_テレ怒り、11_いじわる、12_笑顔、13_よろけ、それと追加でアイドル状態が必要になります。各表情をカットと表現することにします。各カットは何フレームでも自由に作成して構わないのですが、0_ふつうから順にタイムラインに並べた状態で作製します。そして、カットのスタートとエンドは全て同じポーズにします。アイドル状態を考えると正体が作りやすいと思います。プログラム側ではこのカットのスタートとエンドを常に監視し再生中カットと再生完了後の次のカットは何をつなげるべきか考えて再生します。どのパターンのカットが並んでもスタートとエンドが同じポーズなのでスムーズにモーションすることになります。厳密には1フレーム重複しますが無視してください。

丁寧に説明しないと混乱招きそうです。加筆に若干時間が欲しいです。

WebGLだけ使用する方法

WebGLモーションサンプルが参考になると思います。
もっと軽いものはスマホ、タブレット用が参考になると思います。

既知のバグと問題

  • モーフィングしない。キャラクターのフェイシャルアニメーションが実装できてない。
  • ブラウザの非アクティブ→アクティブ時WebGLレンダラー異常表示の回避措置をしています(index.htmlの910行辺り)。

requestAnimationFrameに関係するバグかイレギュラーなプログラミング手法を取ってしまった可能性があります。
jQuery3.0より前のバージョンはrequestAnimationFrameとjQueryのペアでの使用ができないようです。
参考:jQuery 3.0 and jQuery Compat 3.0 Alpha Versions Released

  • 学習ソフトlearning.phpのCSS整形がされてない。
  • 視点をグリグリ移動したい要望ありそう。スマホ、タブレット用の挙動をデフォルトで採用すべきかもです。

追記

three.js r73辺りのバージョンで
var mixer = new THREE.AnimationMixer( mesh );
mixer.addAction( new THREE.AnimationAction( geometry.animations[ 0 ] ).warpToDuration( 1 ) );
というソースがありました。
MikuMikuAIのモーション切り替え部分が複雑になってしまったものを簡素に書き換えられそうです。
しかもモーション間のデュレーションもできそうな予感です。

MMDLoaderがthree.jsに搭載されました。

three.jsでMMDのアニメーションを切り替える

この記事がMikuMikuAIを理想のWebGL人工知能チャットロボットにする近道に感じます。

WebGL(MMDモデル)の部分は全てこの記事で置き換え出来ます。

記事も古いので全てぶっちゃけると、現在の日本の人工知能は海外と比べて一周くらい数年遅れてます。これは期待できる時期に人工無脳エクサを入れ替えればいいとして、それ以上に音声がNG。日本語のリアルタイム音声合成技術は恋愛感情やオナニー対象、発情するというレベルでは全くありません。解決策に日常会話1000語程度に制限して声優さんの肉声をそのまま使用することが正しいと判断して準備してたのがこのMikuMikuAIです。頭脳より肉声を優先してみたという感じです。結果収録の機会を逃してしまい放置状態です。TensorFlowなど使用する場合でも人工音声合成技術の目処が立たなければ生の肉声で魅力的なものになると想像します。

どこかのタイミングでMikuMikuAIアップデートの必要性感じます。

変更履歴

  • 2015.12.30 既知のバグと問題追記
  • 2015.11.20 2015.12.08 追記を追記
  • 2014.11.21 MikuMikuAIウィキ公開
  • 2014.11.08 トゥーンシェーダー搭載 WebGLモーションサンプル作成
  • 2014.10.07 初版公開

関係ライセンス