読者です 読者をやめる 読者になる 読者になる

【LIVA】【Ubuntu server14.04】Julius-plusで家電を操作

概要

すでに我が家で稼働済みですが、ちゃんとまとめていなかったため、書いておきます。

 

1.Julius-plusの導入

Julius-plusはrti7743さんがJuliusを元に認識向上を向上させたものです。

(詳しくはルールベースjuliusの誤認識対策にSVMを利用してみよう - お前の血は何色だ!! 4

ありがたいことにソースを展開して頂いてます。

https://github.com/rti7743/rtilabs/tree/master/files/asobiba/juliustest/julius-4.2.1/julius-plus

 

上記リンク先から一つ上に移動すると、Julius-plusが入っているJulius-4.2.1のセットが置いてあり、ReadMeとしてインストール方法が記載されています。

$ sudo apt-get install flex g++ 'libboost*-dev' libboost-thread-dev binutils-dev  libboost-system-dev libasound2-dev

$ ./configure --with-mictype=alsa

$ make

$ cd julius-plus
$ make

$ ./julius-plus

(略)

マイクで喋ってください。エンターキーを押すと、プログラムを終了します。
----コマンド----

(略)

<<< please speak >>>

音声入力状態になります。

 

2.Julius-plusを自分の環境に合わせる

音声入力で家電を操るには、以前のエントリーでも書いたとおり赤外線学習リモコンを利用します。

そのため、Julius-plusのソースを弄ります。

といってもいじるソースファイルは3つだけです。

 

①JuliusPlus.cpp

 JuliusPlusメソッドに、Julius-plus起動時のメニューが記載されています。ここの記載自体はユーザ入力補助の表示なので、実際いじらなくても問題なかったりしますが、一応やりましょう。

 

②testmic.jconf

このファイルはJulius-plus起動時のオプションが記載されています。

私の環境では「-nostrip」を設定しておくと都合がいいので、追記しておきます。

詳しくは→【LIVA】【Ubuntu server14.04】Juliusを使いたい(Juliusセッティング完了編) - 偃月の技術メモ

 

③main.cpp

肝になるファイルです。すでにテンプレがあると思いますが、認識させたい文言とそれに対応する動作(処理)を記載します。

サンプルとして私の場合は以下のようになります。

julius.AddCommandRegexp("しょうめい(きどう|オン|つけて)",CallbackDataStruct([=](){
             std::cout << "###RUN>照明をつけます" << std::endl;

             //irMagicianのコマンドを実行

             system("sudo python ~/irmcli/irmcli.py -p -f ~/irmcli/right_light_on.json");
}));

 julius.AddCommandRegexp("しょうめい(ていし|オフ|けして)",CallbackDataStruct([=](){
              std::cout << "###RUN>照明を消します" << std::endl;

               //irMagicianのコマンドを実行
               system("sudo python ~/irmcli/irmcli.py -p -f ~/irmcli/right_light_off.json");
})); 

 これだけです。irMagicianのコマンド実行は

【LIVA】【Ubuntu server14.04】赤外線学習リモコンを使う - 偃月の技術メモ

 にて記載していますが、これを音声入力時に自動実行させるだけです。

その後の処理で音声ファイルを再生し、「照明をつけます」といったものをゆっくりに喋らせると面白いかもしれませんね。

 

ソースの変更が終わったら、必ずmakeを再実行しましょう。

3.screenコマンドによる仮想画面で常時実行

Julius-plus起動中は他の操作ができません。本体のターミナルならまだしも、Teraterm等で遠隔ログインした場合はTeraterm終了と同時にセッションが切れてしまうため、実行させ続ける事ができません。

バックグラウンドでうまく動かせればよかったのですが、&による実行はうまく動かなかったため、screenで作成した仮想画面上で実行させます。

仮想画面上で動作させていれば、Teratermの接続を切っても裏で動かし続けることができます。

やり方は簡単。

$ screen

説明文が出てきますが、Enter。仮想画面ができます。

この状態でJulius-plusを起動します。起動方法は1の記載のとおりです。

起動が確認できたら仮想画面をデタッチします。

画面上で

[Ctrl+a]を入力後に[d]を入力

[detached from 4777.pts-3.サーバ名

これでJulius-plusを動かしたまま別の操作ができるようになります。

Julius-plusの画面をアタッチ(呼び出す)には

$ screen -ls

There are screens on:
        4777.pts-3.サーバ名 (2014年12月06日 22時40分58秒)   (Detached)
1 Sockets in /var/run/screen/S-ユーザ名.

 

$ screen -r 4777

とすればよいです。仮想画面を削除する場合は

[Ctrl+d]を入力

[screen is terminating]

と出て削除しつつ、元の画面に戻ります。