MMDAgentについてまとめる 概要編

# この記事ついて
MMDAgentを利用する・開発する上でのあれこれをまとめた記事．これが始まりの記事です．今回は概要，次回からより詳しい粒度で説明する．
次回：[MMDAgentについてまとめる 音声認識・音声合成編](https://qiita.com/drafts/c850710186e13d69132d)

# MMDAgentとは
[MMDAgent公式サイト](http://www.mmdagent.jp/)
[MMDAgentの原論文](https://ci.nii.ac.jp/naid/110009466966)
名古屋工業大学国際音声技術研究所によって作成されたオープンソースの音声インタラクション構築ツールキットである．2010年12月に公開され，その後一年おきに更新されている．2018年5月現在ではver1.7が最新．
以下はサイトMMDAgentのサイトより引用．
> MMDAgentとは、主に国立大学法人名古屋工業大学で開発された、音声対話コンテンツを利用（再生）するためのオープンソフトウェアです。3DCG、音声合成、音声認識、対話制御などの機能を 持ち、簡単なスクリプトを記述するだけで、高度な音声インタラクションシステムを構築することが可能です。Windows, Linux, Mac OSX, Android等での動作が可能です。

## 構成
以下に概要図を載せる．
![Screenshot from 2018-06-08 13-45-37.jpg](https://qiita-image-store.s3.amazonaws.com/0/125382/afdfc85b-a4be-a8e3-47a3-691fad6df7ae.jpeg)

* 音声認識部
* 音声合成部
* 対話管理部
* エージェント描画部

の4つが大きな機能として存在している．実際の実装としては

* Julius
* OpenJTalk
* Plugin_VIManager
* OpenGL

によって実装されている．Plugin_VIManagerはMMDAgentの対話管理スクリプトを制御するものである．
これら機能は独立して動いており，共通のメッセージキューを通してやり取りが行われる．メッセージキューが受け取った情報は，各機能部に振り分けられる．メッセージキューを通して情報を受け取った各プラグインが各々に動作するといった具合だ．

## ビルド方法に関して
[公式ビルドマニュアル](http://www.udialogue.org/ja/encyclopedia-ja/developer-manual-jp)
[MMDAgent を Android で動かす - Qiita](https://qiita.com/KTaskn/items/50cd70477c3c90f932e4)
[MMDAgentをMacで動かそう - Qiita](https://qiita.com/sayonari/items/b3c85bc0182030b7b351)
公式ドキュメントなどを参照．VisualStudioのバージョンが低かったり，Androidでは動かなかったりする．Androidビルド手順を修正してくれたQiitaの記事を見つけたのでそちらも参照．MACでのビルド手順を記事もあったので記述しておく．

[MMDAgent ＆ Project-NAIP wiki](http://cube370.wiki.fc2.com/)
CUBU370さんが公開しているMMDAgentのWikiもある．情報がver1.3のものなので現在はすこし仕様が変わっている部分もあるので注意．

# 音声対話コンテンツ
[MMDAgent SHARE](http://share.udialogue.org/meissen/login.htm)
音声対話システムの学術的な範疇で音声対話コンテンツというものが定義されている．これは音声対話を形づくる要素を独立した要素に切り分けることで，音声対話をユーザ生成メディアに昇華しようとする試みである．
例えば以下のようなものが挙げられる．

* 対話のやりとり（=対話シナリオ）
* 画像・3Dモデル
* 音声素材
* 音声認識器
* 音声発話器
* 単語辞書
* 発話の音響特徴量

以下はMMDAgent SHAREから引用．
> 音声対話コンテンツとは、コンピュータ上のキャラクタエージェントと音声で「おしゃべり」するために必要な全ての素材（対話シナリオ、3DCGのモデル、画像、音声など）を１つにまとめたコンテンツ（ファイル）です。MMDAという独自の拡張子を持ち、MMDAgent 1.6.1以降をインストールすると誰でもダブルクリックするだけで利用することが可能になります。uDialogue Projectにおける学術的研究の一つとして研究・開発されています

## MMDAファイルに関して
[【MMDAgent】インストールとmmdaファイルについて - youtube](https://www.youtube.com/watch?v=pXzoCQDc7pc)
MMDAgentは「.mmda」
ファイルに対応している．上記のMMDAgent SHAREではこの形式で投稿することが可能である．「.mmdaファイル」は実際のところzipファイルである．MMDAgentで実行可能な音声対話コンテンツファイルをzip形式で圧縮し読み込ませることで実行される，これはMMDAgentがより使いやすくなる枠組みのひとつである．

## MMDAファイルの構成
MMDAファイルは以下のようなファイル構成になっている．

* 3Dモデル（.pmd）
* モーション（.vmd）
* スプライト（.bmp）
* ボイス（.htsvoice）
* ボイス合成（.fph or .ojt）
* 対話シナリオ（.fst）
* コンフィグ（.mdf）

# ソースコードの構成
MMDAgentのソースコードレベルでのファイル構成を見る．MMDAgentを実際にDLして開いてみると以下のようなファイル構成になっている．

* Library_***
* Plugin_***
* main

#### Libraryファイル
コンパイル時には.libファイルを吐く
MMDAgent内で利用する汎用的な関数群を静的ライブラリとして記述してある部分．
後述するプラグインを拡張する際にはこれらをリンクしてコンパイルすると便利．
特に，Library_MMDAgent, Library_MMDFiles では汎用的は関数やコアな関数，変数が多いので必ずリンクすることになると思う．

#### Pluginファイル
コンパイル時に.dllファイルを吐く
MMDAgentのプラグインを出力するファイル郡．MMDAgentにとってプラグインとは機能そのものであり．「機能追加 = プラグイン追加」といってもいいと思う．プラグインはスレッドとして書かれ，MMDAgentが実行されるとスレッドとして起動する．
プラグインはスレッドなので，並列実行される．プラグイン自体もDLLファイルなので割と自由に追加したり削除したり修正できる．

#### mainファイル
MMDAgentの本体，というか実体的なもの．中身は普通のCPPファイル．
mainファイルが実行 -> 各種プラグイン（DLL）を呼び出す
という感じで実行されると思う．

# まとめ
MMDAgentの概要をまとめた．概要，実装方法，ソースコードの3点の粒度から情報をまとめた．
実際には色々追いつけてないので今後も追加でまとめていきたい．