凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

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

はじめに

本エントリは未来のお部屋シリーズの第4弾です。
本シリーズでは、音声認識システムの JuliusTCP/IP 通信で制御できる赤外線学習リモコン iRemocon を繋いで音声認識による家電操作の実現を目指しています。
ついに!音声認識でお部屋の家電を操作できましたので、ご紹介します。

環境

  • Ubuntu 10.04
  • Boost 1.48.0
  • gcc version 4.6.1 20110617 (prerelease) (GCC)
  • Julius grammar-kit-v4.1
  • iRemocon
  • 集音マイク×2 (2分岐)

構成

動作構成は以下になります。

マクロ実行部は iRemocon 以外の何か操作も出来るようにしようと思ってますが、未実装です。

使い方

Julius を module モードで動作させて認識した言葉を取ってくるところを前々回前回とやりました。詳しくはそちらを参照して下さい。
まず、認識させたいパターンを kaden.grammar と kaden.voca に記述します。

kaden.grammar
S      : NS_B KADEN_ NOISE PLEASE NS_E
S      : NS_B JUMON NS_E
KADEN_ : KADEN
KADEN_ : KADEN WO
kaden.voca
% KADEN
テレビ     t e r e b i
電気       d e n k i
% WO
を         w o
を         o
% PLEASE
つけて     t u k e t e
消して     k e s i t e
切替       k i r i k a e
次         t u g i
前         m a e
% JUMON
バルス     b a r u s u
% NOISE
<sp>       sp
% NS_B
<s>        silB
% NS_E
<s>        silE

そしてこの結果作られるであろう言葉とコマンドの対応付けを command.xml に書きます。正規表現 OK です。

command.xml
<?xml version="1.0" encoding="UTF-8"?>
<iRemocon>
	<command word="テレビ(を|)(つけて|消して)" num="1" />
	<command word="テレビ(を|)切替" num="2" />
	<command word="テレビ(を|)次" num="3" />
	<command word="テレビ(を|)前" num="4" />

	<command word="電気(を|)つけて" num="11" />
	<command word="電気(を|)消して" num="12" />
</iRemocon>

後は、iRemocon に telnet 経由で接続して「ic;1」などとしながら各番号に対応する赤外線信号を学習させます。
そして Julius を実行します。

./bin/julius -C hmm_mono.jconf -gram kaden -input mic -lv 100 -zc 1 -module

音声の大きさ(レベル)を調整する -lv オプションや x 軸との交差回数を指定する -zc オプションなどは適当に弄って下さい。
そしてここへ C++ のソースをコンパイルして出来た juli2ir からアクセスします。

./juli2ir
実行結果


マイクのいる手前に陣取れば 10 発 10 中でした!もちろん認識結果に応じて IR 信号が出るので各機器も操作されます。
Julius 側で出てる Warning が凄い気になるのですが…、このせいか分からないですが、1日くらい放置しておくと動作が重くなりました。ここは要調査です。

今後の展望

後は操作できる機器を増やすのと、部屋のどこにいても音声認識してくれるようにしたいです。現状だと 2 m くらい離れてしまうと、ちょっと大きな声で喋らないと反応してくれないので。Bluetooth の送受信機を 2 個買ったので、これで指向性マイクとかを使いながらうまいことできないかなぁ、と考えています。
iRemocon の操作に関しては、現状では 1 つの文章に対して 1 信号なので、例えば「テレビ音量3アップ」とかいうと3つ音量を上げてくれるような作りにしたりとか出来たら良いなと考えてます。
後は、iRemocon 以外の操作ができるようにしたいですね(構成図のマクロの部分)。
そのうちジェスチャーもチャレンジしたいなぁ。

追記

Twitter で色々と教えてもらいましたのでメモ。

バルス誤認識について

エントリそのままの設定ではキーボードの打鍵音でもバルスバルスしてしまいます。滅びの呪文がそれではまずいですよね。そこでアドバイスをいただきました。

下2つで誤認識がもの凄い減りました。ただテレビの音とかには反応してしまいそうなので、rti さんのようなプレフィックスも何かつけようと思います。

Julius設定ファイルの省略

command.xml のような XML から grammar や voca が自動生成できたら楽ですよねー。

このあたりはチャレンジしてみたいです。

信頼度の向上

これに関しても色々教わりました!

cmscoreはかなり使えそうです!GMMによる棄却はちょっと難しそうです。。。