Ubuntu上で、MMDAgentにTwitterのTLを読み上げさせる方法

既に気付いている方もおられると思いますが、Launchpad 上の PPA に MMDAgent の deb パッケージを突っ込んであるので、使い方を書いておきます。公式の Linux 版の MMDAgent では Windows 版にある機能のいくつかが未実装となっていますが、この PPA のパッケージでは全機能を独自に実装してあり、Windows 版と同様に使えるようにしてあります。ただし、Windows 版とのバイナリ互換性はありませんので、Windows 用に配布されているプラグインをそのまま使うことは出来ません。また、公式版にはないいくつかの機能を追加してあります(それらについてはまた後日、気が向いたら書きます)。


[使用モデル:DIVAっぽいど(ままま氏)、こっちむいてBabyステージ(39歳P氏)]

今回は、MMDAgent のインストール方法と、Emacs で twittering-mode を使っている人のための TL の読み上げの設定方法を紹介します。

MMDAgentとサンプルスクリプトのインストール

端末を起動し、以下のコマンドでPPAからMMDAgentをインストールします。パッケージはわりと巨大(ダウンロードするサイズが70MBくらい)なので覚悟してください。

sudo add-apt-repository ppa:irie/mmdagent
sudo apt-get update
sudo apt-get install mmdagent

次に、MMDAgentのホームページ(http://www.mmdagent.jp/)からサンプルスクリプト(MMDAgent "Sample Script" version 1.1)をダウンロードしてインストールします。ダウンロードしたファイル(MMDAgent_Example-1.1.zip)が ~/Download に保存されたとします。

PPA のパッケージには独自の改造がしてあり、~/MMDAgent/MMDAgent.mdf という設定ファイルがあると起動時に自動的に読み込むようにしてあるので、以下のように、ファイルを展開した後リネームします。

cd
unzip ~/Download/MMDAgent_Example-1.1.zip
mv MMDAgent_Example-1.1 MMDAgent
cd MMDAgent
ls MMDAgent_Example* | while read i; do mv $i MMDAgent${i#MMDAgent_Example}; done

設定ファイルとスクリプトの修正

PPA のパッケージは開発版のソースコードからビルドしてあります。開発版では設定ファイルとスクリプトの仕様が Version 1.2 から少し変更されていますので、サンプルスクリプトを修正しないと正常に動作しません。

設定ファイル(.mdf)

.mdf ファイルでは pmd ファイル読み込み時のコメントの表示時間を指定するオプション名が、display_comment_frame から display_comment_time に変更されていますので、テキストエディタで MMDAgent.mdf を開いて「display_comment_frame=0.0」という行を見つけて「display_comment_time=0.0」に修正します。以下は修正前後のファイル差分をとったものです。

diff -u MMDAgent.orig.mdf MMDAgent.mdf
--- MMDAgent.orig.mdf	2011-08-03 09:11:26.000000000 +0900
+++ MMDAgent.mdf	2012-06-22 18:42:35.682149452 +0900
@@ -114,7 +114,7 @@
 
 # Comment
 
-display_comment_frame=0.0
+display_comment_time=0.0
 
 # Model
 
スクリプトファイル(.fst)

.fst ファイルでは MODEL_ADD コマンドの第5引数が、親モデルの指定からトゥーンレンダリングの ON/OFF 指定に変更されたので、MODEL_ADD コマンドで第5引数が指定されている行(3箇所)を見つけて、それぞれ「|OFF」(または「|ON」)を挿入します。以下の差分を参考にして下さい。

diff -u MMDAgent.orig.fst MMDAgent.fst | nkf
--- MMDAgent.orig.fst	2011-08-03 09:11:26.000000000 +0900
+++ MMDAgent.fst	2012-06-22 18:38:36.466150048 +0900
@@ -138,7 +138,7 @@
 
 0    11   <eps>                               MODEL_ADD|bootscreen|Accessory\bootscreen\bootscreen.pmd|0.0,12.85,17.6
 11   12   MODEL_EVENT_ADD|bootscreen          MODEL_ADD|mei|Model\mei\mei.pmd|0.0,0.0,-14.0
-12   13   <eps>                               MODEL_ADD|menu|Accessory\menu\menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|mei
+12   13   <eps>                               MODEL_ADD|menu|Accessory\menu\menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|OFF|mei
 13   14   <eps>                               MOTION_ADD|menu|rotate|Motion\menu_rotation\menu_rotation.vmd|FULL|LOOP|OFF
 14   15   <eps>                               STAGE|Stage\building2\floor.bmp,Stage\building2\background.bmp
 15   16   <eps>                               MOTION_ADD|mei|base|Motion\mei_wait\mei_wait.vmd|FULL|LOOP
@@ -197,7 +197,7 @@
 # 0071-0090 Guide
 
 1    71   RECOG_EVENT_STOP|図書館             MODEL_DELETE|menu
-71   72   <eps>                               MODEL_ADD|panel|Accessory\map\map_library.pmd|0.0,2.8,2.5|0.0,0.0,0.0|mei
+71   72   <eps>                               MODEL_ADD|panel|Accessory\map\map_library.pmd|0.0,2.8,2.5|0.0,0.0,0.0|OFF|mei
 72   73   <eps>                               MOTION_ADD|mei|action|Motion\mei_panel\mei_panel_on.vmd|PART|ONCE
 73   74   <eps>                               MOTION_CHANGE|mei|base|Motion\mei_guide\mei_guide_normal.vmd
 74   75   <eps>                               SYNTH_START|mei|mei_voice_normal|図書館は、正面から見ると、右前の方向にあります。
@@ -207,7 +207,7 @@
 78   79   SYNTH_EVENT_STOP|mei                MOTION_CHANGE|mei|base|Motion\mei_guide\mei_guide_happy.vmd
 79   80   <eps>                               SYNTH_START|mei|mei_voice_normal|お解りになりますか?
 80   81   SYNTH_EVENT_STOP|mei                MODEL_DELETE|panel
-81   82   <eps>                               MODEL_ADD|menu|Accessory\menu\menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|mei
+81   82   <eps>                               MODEL_ADD|menu|Accessory\menu\menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|OFF|mei
 82   83   <eps>                               MOTION_CHANGE|mei|base|Motion\mei_wait\mei_wait.vmd
 83   2    <eps>                               MOTION_ADD|menu|rotate|Motion\menu_rotation\menu_rotation.vmd|FULL|LOOP|OFF
 

これで MMDAgent 本体の設定は完了です。コマンドラインから

MMDAgent

で起動すると、メイさんが現れるはずです。

マイクの設定が正しくされていれは、話しかけると答えてくれます。起動時に表示される音声入力のメーターはキーボードで Shift+J を押すと消せます。

コンソールにはデバッグのためログが出力されるように改造してあります。ログを見る必要がなければ、Unity の Dash から「mmdagent」と入力するか、ランチャーに登録しておいて起動します。また、D キーを押すとウインドウ内でログを見ることもできます。


SubProcessプラグインとサンプルスクリプトのインストール

SubProcess プラグインは自作のプラグインで、子プロセスを起動・停止するコマンド、SUBPROC_START および SUBPROC_STOP を追加します*1。以下のようにインストールします。

sudo apt-get install mmdagent mmdagent-plugin-subprocess

/usr/share/doc/mmdagent-plugin-subprocess/examples にサンプルスクリプトの圧縮されたファイルがあるので、これらを先ほど公式サンプルをインストールしたディレクトリ(~/MMDAgent)にインストールします。

cd /usr/share/doc/mmdagent-plugin-subprocess/examples
zcat MMDAgent_Example.fst.SubProcess.fst.gz > ~/MMDAgent/MMDAgent.fst.SubProcess.fst
zcat mmdagent_dbus_service.py.gz > ~/MMDAgent/mmdagent_dbus_service.py
zcat mmdagent_time_signal.py.gz > ~/MMDAgent/mmdagent_time_signal.py

MMDAgent.fst.SubProcess.fst というファイルはサブのスクリプトです*2。後の2つの Python スクリプトはファイルはサブのスクリプト内で SUBPROC_START コマンドにより起動する子プロセスのプログラムのです。mmdagent_dbus_service.py は D-Bus によるプロセス間通信のサーバ、mmdagent_time_signal.py は時報の読み上げを開始する TIMESIGNAL_START コマンドを提供します。

時報の読み上げ時に音声ファイルを再生したい場合は ~/MMDAgent にそのファイルを保存し、MMDAgent.fst.SubProcess.fst 内の TIMESIGNAL_START コマンドの行を見つけて第4引数(デフォルトでは「chime.ogg」となっている部分)を音声ファイルのファイル名に修正します。

一旦 MMDAgent を終了して起動し直すと、SubProcess プラグインが読み込まれて子プロセスが起動します。

Emacs側の設定

SubProcess プラグインで起動した D-Bus サービスを利用して、Emacs から MMDAgent にコマンドを投げたりイベントを受け取ったりするためのプログラム mmdagent-dbus-client.el、さらにそれを利用して MMDAgent に twittering-mode の TL を読み上げをさせるプログラム twittering-mmdagent.el をインストールします。~/.emacs.d に Emacs のロードパスが通っているとします。

cd /usr/share/doc/mmdagent-plugin-subprocess/examples
zcat mmdagent-dbus-client.el.gz > ~/.emacs.d/mmdagent-dbus-client.el
zcat twittering-mmdagent.el.gz > ~/.emacs.d/twittering-mmdagent.el

試しに Emacs 上で次のコードを実行してみて下さい。

(require 'mmdagent-dbus-client)
(mmdagent-exec-command "SYNTH_START" "mei" "mei_voice_normal" "こんにちは")

正しく設定されていれば、メイさんが「こんにちは」と言ってくれるはずです。

twittering-mode の TL の読み上げを開始するには、上のコードの代わりに以下のコードを実行します。Emacs 起動時に開始するには ~/.emacs ファイルの twittering-mode の設定の後に書いておいて、MMDAgent、Emacs の順に起動します(twittering-mode の設定方法にはここでは触れません)。

(require 'twittering-mmdagent)

これで、TL が更新されるたびに読み上げてくれます。

しばらく読み上げさせていると、いつの間にか読み上げが止まってしまうことがあります。これは特殊な文字を含むツイートがあるとエラーとなって MMDAgent から読み上げ終了を知らせるイベントが来ず、Emacs 側のキューにたまった次のツイート読み上げが開始できないためだと思われます。この場合は、Emacs 上で

M-x twittering-mmdagent-setup

として強制的に読み上げを再開します*3

*1:子プロセスとの通信は、socketpair を子プロセスの標準入出力に接続して行います。

*2:サブのスクリプトは「メインのスクリプト名」+「任意の文字列」+「.fst」というファイル名にしておくと、起動時に自動的に読み込まれます。

*3:MMDAgent を Emacs より後に起動した時に読み上げ開始したい場合にも、このコマンドを使います。