16 Jul 2012, 05:10

iRemoconでミクミクにしてやんよ。

はじめに

MMDAgentとiRemoconを組み合わせてみたらなかなか良かったので、まとめてみる。

[http://www.youtube.com/embed/kkcB4gB5A3o]

 

ミクさんに登場してもらうまで

こちらのサイトを参考にしました。

サクライロニガワライ雑記

まずは以下のサイトから、BinaryPackageをダウンロード。

http://www.mmdagent.jp/

MMDAgent.exeを起動すると、メイちゃんが現れるので「こんにちは」と声をかけてみる。

image

これが成功したら、初音ミクのモデルと声を設定する。

モデル

以下のサイトから選択。たくさんあるけど、自分は[初音ミク@七葉1052式]を落としてきた。

http://www6.atwiki.jp/vpvpwiki/pages/298.html

落としてきたモデルは、C:/xxx/MMDAgent/Model/配下にフォルダを作成して配置する。

MMDAgent.fstを開き、140行目あたりの # 0011-0020 Initialization からの

11から下を編集して、モデルファイル(xxx.pmd)を指定する。

ついでに、その下にある2行を消せば、キャラクターの周りのメニューも消えるので、

消したほうが良い。

[text]

11 14 MODEL_EVENT_ADD|bootscreen MODEL_ADD|mei|Model\miku\初音ミク@七葉1052式.pmd|0.0,0.0,-14.0

#12 13 MODEL_ADD|menu|Accessory\menu\menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|mei

#13 14 MOTION_ADD|menu|rotate|Motion\menu_rotation\menu_rotation.vmd|FULL|LOOP|OFF

14 15 STAGE|Stage\building2\floor.bmp,Stage\building2\background.bmp

[/text]

再び、MMDAgent.exeを起動して、ミクちゃんにご対面。

image

以下のサイトから、音響モデル(TYPE-a/TYPE-bどちらでもよい)を落とす。

MMDAgent & Project-NAIP wiki

Voice配下にあるフォルダに、落としてきた音声データを上書きする。

コマンド実行をお願いするまで

こちらのサイトを参考にしました。

MMDAgentとPC-OP-RS1で実現するリモコンの音声操作-ナレッジエース

会話からコマンドを実行するには、MMDAgent.fstにシナリオを定義する。

たとえば、電卓を起動して欲しい場合は、こんな感じで記述する。

[text]

1 3 RECOG_EVENT_STOP|ミク SYNTH_START|mei|mei_voice_normal|はい。

232 260 SYNTH_START|mei|mei_voice_normal|電卓つけます。

260 2 SYNTH_EVENT_STOP|mei

[/text]

はじめに、[ミク]と呼びかけて、はいといってくれたら、次の命令を実行させることがミソ。

また、コマンドを実行するには、EXECUTEマクロをつかう。

EXECUTE|(実行したいコマンド)で任意のコマンドを実行できるので、

ここで、後述するTeraTerm用のTTLファイルを指定して、iRemoconへコマンドを送るのだ。

[text]

3 184 RECOG_EVENT_STOP|電気つけて EXECUTE|C:\MMDAgent\Macro\LightsOn.ttl

184 200 SYNTH_START|mei|mei_voice_normal|電気つけます。

[/text]

しかし、これだけでは、多分反応しないだろう。いろいろと言葉を知りすぎているために、

誤認識してしまう。なので、もっとおバカになってもらう。

Julius記述文法の設定

ミクの耳には、オープンソースである音声認識ソフト、Juliusが使われている。

なので、Juliusの記述文法にしたがって、言葉を定義して教える。

まずは、MMDAgent配下にgrammarフォルダをつくって、こんな感じで定義ファイルを作成。

call.grammar

[text]

S : NS_B CALL NS_E

[/text]

call.voca

[text]

% CALL ミク m i k u

こんにちは k o N n i ch i w a

ありがとう a r i g a t o u

なんでもない n a N d e m o n a i

かわいい k a w a i i

みくみくにして m i k u m i k u n i sh i t e

電卓つけて   d e N t a k u t u k e t e

電気つけて   d e N k i k u t u k e t e

電気消して   d e N k i k e sh i t e

% NOISE

sp

% NS_B silB

% NS_E silE

[/text]

作成した2つのファイルは、

Julius 3.5.2に付随しているmkdfa.plを落としてきてコンパイルする。

http://sourceforge.jp/projects/julius/downloads/21175/julius-3.5.2-win32bin.zip/

[text]./mkdfa.pl call[/text]

苦労したこのエントリも参考にしてください。

cygwin 環境で mkdfa.plが動作しない

最後に、/MMDAgent/AppData/Julius配下にjconf.txtというファイルがあるので、

文末に以下の行を追加。

[text]

-nogram

-gram “C:\MMDAgent\grammar\call”

[/text]

-nogramで、すでに登録されている単語をすべて忘れて、
次の行で、今回自分が用意した単語と文法を教えてあげる。
(詳しくはココ)JuliusBook 第7章 言語モデル

iRemoconの設定

まずはiRemoconの調達を。

 

iRemoconに通信するTTLファイルの作り方は以下を参照(結構たいへんなので、説明は割愛)iRemocon 音声操作設定

作成したTTLファイルを音声から実行すると、ミクさんが電気をつけてくれます。

まとめ

5月ごろに以下の動画をみて、自分も家のオートメーション化をしてみたけれど、

ようやく完成な気がした。

MMDAgentは、これからもまだまだ可能性が広がっていきそうだ。

日本製のオープンソースなので、Siriに負けずに頑張って欲しい。

08 Jul 2012, 22:07

初音ミクにiRemoconをつかわせてみた

前回の投稿で、Juliusとの連携はできたので、次はMMDAgentと組み合わせてみた。

以下のサイトのエントリを参考。

MMDAgentにミクさんを表示させるまで ~補足編その1~

サンプルのMMDAgent.fstに追加したい動作を記述。

実行コマンドは、Juliusで使っていたteratermマクロを指定。

[text]

# 0121-0130 AirControlOn

1 121 RECOG_EVENT_STOP|エアコン,つけて EXECUTE|C:\Users\xxx\Dropbox\src\MMDAgent\Macro\AirControlOn.ttl

121 122 SYNTH_START|mei|mei_voice_normal|エアコンつけます。

122 2 SYNTH_EVENT_STOP|mei

# 0131-0140 AirControlOff

1 131 RECOG_EVENT_STOP|エアコン,消して EXECUTE|C:\Users\xxx\Dropbox\src\MMDAgent\Macro\AirControlOff.ttl

131 132 SYNTH_START|mei|mei_voice_normal|エアコン消します。

132 2 SYNTH_EVENT_STOP|mei

[/text]

ただ、サンプルのままだと100発1中の認識率の悪さ・・・・。

なので、ここでもJuliusでつかっていた記述文法を流用。

MMDAgent\AppData\Julius配下にjconf.txtというファイルがあるので、

文末に以下の定義を追加した。

[text]

-nogram

-gram “C:\Users\xxx\Dropbox\src\HAL1000\grammar\please”

-gram “C:\Users\xxx\Dropbox\src\HAL1000\grammar\call”

-gram “C:\Users\xxxDropbox\src\HAL1000\grammar\mode”

[/text]

-nogramで、すでに登録されている単語をすべて忘れて、

次の行で、今回自分が用意した単語と文法を教えてあげる。

(詳しくはココ)JuliusBook 第7章 言語モデル

そうすると、

メイちゃんは今までの記憶をすべてわすれ、

再帰的に、ひたすらエアコンをつけようとする。(それしか単語を知らない)

きっと地球が滅びるその日まで、ひたすら彼女はエアコンをつけ続けるだろう。

MMDAgentで、初音ミクのモデルも試してみた。

メイちゃんよりもこっちのほうが頭がいいみたい。

08 Jul 2012, 21:36

JuliusとiRemoconを組み合わせて、部屋の音声認識システムをつくった

JuliusとiRemoconを組み合わせて、部屋の音声認識システムをつくった。

出来栄えは、こんな感じ。

[http://www.youtube.com/embed/N6uw2pMFC1s]

 

参考にしたのはこのサイト。

リモコンはオワコン。音声認識でお部屋の家電を操作してみた。

C++の知識のなさと、Boooooooooooooooooostなコンパイル時間と

戦いつつも、とりあえずの目標達成。

iRemoconを購入してから85時間の戦いだった。

定義した命令はこんな感じ。

テレビ(を|)つけて

エアコン(を|)つけて

エアコン(を|)消して

電気(を|)つけて

天井灯(を|)つけて

すべての電気(を|)つけて

電気(を|)消して

天井灯(を|)消して

すべての電気(を|)消して

MorningMode

SleepMode

RelaxMode

SexyMode

PartyMode

(うるさい|だまって)

ボリューム(を|)大きくして

ボリューム(を|)小さくして

アプリケ-ション起動

Chrome(を|)つけて

Ottava(を|)つけて

Twitter(を|)つけて

Toggl(を|)つけて

Gmail(を|)つけて

Youtube(を|)つけて

ニコニコ(を|)つけて

TVタックル(を|)つけて

こんにちは

おはよう

おやすみ

いってきます

ただいま

ありがとう

きこえてる

今日の天気(を|)教えて

明日の天気(を|)教えて

今何時

今日は何日

ライバルを教えて

今週の目標を読み上げて

 

あとは、Webカメラでモーションを捉えたらコマンド実行するようにして、

家のドアを開けると「おかえりなさい」をしてくれるようにした。

 

本当ならばここで、

「おかえりなさい、ご飯にする?お風呂にする?それとも・・・あたし?」

と、いわしめたいものぞ。悲しき独身生活・・・(´・ω・`)

08 Jul 2012, 02:37

Cygwin で新しいg++を使うためのメモ

Cygwin での g++ のオプションで -std=c++0xが使えないでハマった。

まず、boost ライブラリで libboost_system-mt.aをリンクさせようとしたところ、コンパイルエラーとなる。

__Unwind_Resume

どうやら、c++0x てないと、コンパイルが通らないようだ。
なので、-std=c++0x のコンパイルオプションをつけようとしたところ
コンパイラオプションが認識されなかった。

いろいろ調べたところ -std=c++0xはg++ 4.3以降でないと、
有効ではないらしい。
そして、 Cygwinではデフォルトの g++は3.4であった。

/usr/bin配下をよく見てみると、 g++.exeとともにg++4.exe というものがあった。

どうやら、この g++4というものが、g++4.5のようだ。

なので、 g++4.exeをg++.exeに名前を変えてみると、
コンパイルを通すことができた。

01 Jul 2012, 05:36

cygwin 環境で mkdfa.plが動作しない

Julius 4.2を利用して、記述文法ファイル(hoge.grammar, hoge.voca)を mkdfa.plを使ってコンパイルしたらエラ-した。

call.grammar has 1 rules
call.voca    has 5 categories and 5 words
---
Error:       Can't open grammar file "/tmp/g9356.grammar"
Error: cannot open "call.dfa.tmp"
---
no .dfa or .dict file generated

調べてみると、Juliusのバージョンが3.5.2ならばコンパイルが通るらしい。
(レベルダウンではないか!)

コンパイルのためだけに tempフォルダに旧バージョンのJuliusを落としてきてコンパイル。
Julius 3.5.2:
http://sourceforge.jp/projects/julius/downloads/21175/julius-3.5.2-win32bin.zip/

実行結果:

$ /cygdrive/c/temp/julius/bin/mkdfa.pl call call.grammar has 1 rules call.voca has 5 categories and 5 words --- Now parsing grammar file "rror: Lexical mistake " --- no .dfa or .dict file generated

 

エラ-の出方が変わった!
調べてみると、文法ファイルがShift-jisなのでエラ-している。
utf-8に変換してコンパイルすると、成功。

call.grammar has 1 rules
call.voca    has 5 categories and 5 words
---
Now parsing grammar file
Now modifying grammar to minimize states[-1]
Now parsing vocabulary file
Now making nondeterministic finite automaton[6/6]
Now making deterministic finite automaton[6/6]
Now making triplet list[6/6]
---
generated: call.dfa call.term call.dict

参考URL

30 Jun 2012, 09:37

C++で boost Lib と windows.hでの競合

結構ハマったので、メモしておく。

Cygwin環境で、Boost ライブラリの正規表現とwindows.hを両方使おうとすると
エラ-してしまう。

原因は #define max.minの競合。

なので、以下のようにインクルードして解決した。

#include <boost/regex.hpp>
#undef min
#undef max
#include <windows.h>

23 Jun 2012, 21:04

リアル・スティ-ルをみた

 

親と子の絆を描くというありがちなテーマ、
底辺から這い上がって勝利をつかむというありがちなテーマ、
それは脇においておこう。

職業柄、技術的な部分にシビれた。
未来の格闘技の可能性を探る映画だ。
まちがいなく、ロボット同士を格闘させる娯楽は生まれるに違いない。
人間はより強度の高い暴力を好むので。
ラストの盛り上がりも、格闘というジャンルならでは。

あと何年後に実現可能だろうか?
音声認識とモーションセンサーは、今の技術ではようやく普通のエンジニアが手の届くところまできている。
Juliusしかり、kinnectしかり。
そのような技術をはやく世の中に浸透させることが組込みエンジニアの使命だ。

17 Jun 2012, 12:19

Outlook予定表から1日の予定を抜き出す

 

Outlookから今日の予定を抜き出して、音声合成ソフトで読み上げられたら、

きっとSiriちゃんよりも優秀なコンピュータになるに違いないと思ったので、試してみた。

まずはVBSで、今後1日の予定をリストアップしてテキスト出力。

Const olFolderCalendar = 9

Set objOutlook = CreateObject("Outlook.Application")
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderCalendar)

Set colItems = objFolder.Items

For Each objItem In colItems
    If objItem.End >= Now and objItem.End < DateAdd("d", 1, Now) Then
        Wscript.Echo Hour(objItem.Start) & "時" & Minute(objItem.Start) & "分から" & objItem.Subject
    End If
Next
Wscript.Echo "です"

ポイントはVBSを cscript.exe への引数として実行すると、

コマンド・プロンプト内に直接表示させることができること。

これをパイプでテキストファイルに出力することで、

任意のリストで予定を取り出すことができる。

cscript.exe GetTodaysCalendar.vbs > TodaysCalendar.txt

参考:

Microsoft Outlook から定期的な予定の一覧を取得する

チェック式 WSH入門

あとはテキストファイルを一行ずつ取り出してやるようなプログラムを組んで、

コマンドラインから音声合成ソフトに渡してやる。

使用したのはこのソフト。

棒読みちゃん

簡単でふな!

watch?v=Pe1JRNRMcfQ&feature=youtu.be

13 Jun 2012, 04:33

Outlookにロ-カル作業記録を残すVBS

TwitterのつぶやきはGoogleカレンダ-に転送しているので、

ログに残すことができるが、Twitterに投稿したくない個人的なつぶやきも

Googleカレンダ-に残せればよいなぁと思ったので、そんなものをつくってみた。

  • Outlook予定表につぶやきを記録。
  • Google Calendar Syncで同期。
'Outookへ予定を追加するマクロ
Option Explicit

'入力された名前で予定表のアイテムを1つ作成する

  Dim Tweet  'つぶやき
  Tweet = InputBox("Let's Tweet")

'Outlook を 起動する
  Dim oApp        'OutlookのApplication オブジェクトを入れる
  Dim myNameSpace '名前空間
  Dim myCalendar  'カレンダ-指定
  Dim aITEM       '予定表アイテム

  Set oApp = CreateObject("Outlook.Application") 'outlook 起動
  Set myNameSpace = oApp.GetNamespace("MAPI") '名前空間 の 指定

  Set myCalendar = myNameSpace.Folders("Outlook").Folders("予定表")
  Set aITEM = myCalendar.Items.Add 

  'データセット
  With aITEM
    .Subject = Tweet
    .Start = Now 'なう。
    .End = Now   'なう。
    .Categories = "#Twitter" '分類項目に#Twitterを追加
    .Save
  End With

27 May 2012, 12:44

UMTP L2 に合格

UMTP L2 に合格した。

一度落ちているので、二度目の受験で合格。

つぎはL3に挑戦だ。

今回使った問題集はコレ。

 

ボロボロになるまで、というよりはバラバラになるまで?勉強した。(裁断済)

IMG_1279

黒本は実際の試験よりも難しく作られているので(緑本より難しい?)、

これを4回くらい解いて、全て解けるようにした。

理論的な部分は以下の本で。

いろんな参考書をとつまみしたけど、これがマイベスト。

説明が簡潔であり、かつ、的を射ている。

 

L1は小手先テクでなんとかなったけど、L2だと実際にUMLやブログラミングを

体験しないとUMLの全体イメ-ジがわかない。

とういわけで、Aatahで実際にクラス図を書いてみたり、

ブログラミングをしてみるのが、よいと思う。

だんだんと問題を解くにつれ、その図が表すものがソ-スとして頭に浮かぶまで、

黒本をやりこめばOKというところだ。

その他のオススメ書籍もまとめてみる

UMTP L2 対策参考書まとめ