ラズパイその他工作

ラズパイでスマートホームを実現しよう! 第3回: 声でリモコンを操作して便利に使う

こんにちは、ヨシケンです!
ラズパイでスマートホーム化の第三回。前回は部屋の温湿度などを簡単に測れるようにしましたが、今回は赤外線リモコン機能を付けます。

第1回: ウェイクワードで操作できるスマートホーム・デバイスを作り始める
第2回: 独自のウェイクワードでお部屋をチェックする
image1

自宅にあるテレビや加湿器、電気などのリモコンを記録して、ラズパイから赤外線送信できるようにします。もちろんこれまで通り、声で操作できるようになりますよ!
image2

今回の記事で必要な物一覧

・Raspberry Pi 3B+ (最新版のラズパイ本体)
- Raspberry Pi 3B+
・小型USBマイク 
(USBで使える小型のこちらを使いました。)
小型USBマイク

・小型スピーカー 
(イヤフォン・ジャックで使えるアンプ付きのこちらを使っています。)
小型スピーカー

・モバイルバッテリー
image9

・温湿度センサー
sensor

・ミニブレッドボード
breadboard

・赤外線LED SIR-34ST3F
image30

・赤外線拡散キャップ
image31

・赤外線受光モジュール
I-04659

・LED、抵抗やケーブル類
・(100円ショップなどで手に入る)木のケースなど装飾部品

 

今回の記事の流れ

1.赤外線リモコン、受光部の設定
2.赤外線送信LEDの作成
3.日本語認識Juliusの導入
4.Juliusと赤外線リモコンの連動
5.まとめ

 

1.赤外線リモコン、受光部の設定

家の中にあるリモコン機器の赤外線を、ラズパイから操れるようにします。
赤外線には、受光部分と送信部があります。以下の図で、黒い方が赤外線受光モジュール、白いLEDが赤外線送信LEDになります。図を見て、ラズパイとつないでみて下さいね。受信側がGPIO 23、送信側をGPIO 24につないでいます。

image3

では最初に、受信側の設定をしていきます。
ラズパイでの赤外線通信では、lircというライブラリがあるので、これをインストールします。このlircの設定をconfig.txtファイルに行います。先ほどつないだGPIO 23、24の設定を書き込みます。

$ sudo apt-get install lirc

$ sudo vi /boot/config.txt

$ sudo vi /etc/lirc_options.conf

[config.txt]
image4

/etc/lirc_options.conf中の以下の部分に、ドライバー、デバイスの登録をしておきます。
[lirc_options.conf]
image5

これらの設定を有効にする為、一旦リブートします。

その後、mode2というコマンドで、lircが使えるようになっているかの確認を行います。
コマンドを流した後、受信モジュールに向けて、テレビなどのリモコンを操作すると、以下画面のような反応があるはずで、赤外線が受けられているかの確認をする事ができます。

$ mode2 -d /dev/lirc0 #又は mode2 –driver default –device /dev/lirc0

image6

それでは、自分のリモコンを登録するために、irrecordという赤外線記録プログラムを起動します。(最初のstopコマンドで、バックグラウンドで立ち上がっているlircdプログラムを止めてから行います。)

$ sudo systemctl stop lircd

$ irrecord -n -d /dev/lirc0

irrecordコマンドを打ったら、以下のように画面中に出てくる指示に従って、リモコンを登録して行きます。(赤字は日本語での説明です。)
image7

image8

image9

好きなボタンを登録したら、最後にボタン名を入れずにエンターだけを押すと、プログラムが終了します。
このirrecordにより、ここではremotetv.lircd.confというファイルが作られました。

ファイル中のon, up, downと付けたコマンドがそれぞれテレビの電源オン、音量アップ、とダウンになっています。

image10

2.赤外線送信LEDの設定

それでは、登録した情報を送信できるようにしていきましょう。
先ほど作った赤外線設定ファイルremotetv.lircd.confを、/etc/lirc/以下にlircd.confという名前でコピーします。
その後、以下コマンドからlircd自動起動プログラムを再起動します。

$ sudo cp remotetv.lircd.conf /etc/lirc/lircd.conf

$ sudo systemctl stop lircd
$ sudo systemctl start lircd
$ sudo systemctl status lircd

配線が多くて見づらくて申し訳ないですが、送信側LEDの接続は以下写真のようになっています。(合わせて当初の接続図も参照して下さい。)
赤い拡散キャップが付いた送信LEDのアノード(長い脚の方)に1Kの抵抗を挟んで3.3V電源と接続、カソード(短い方)は黄色のコードでGPIO24につながっています。
image11

それでは、先ほど設定した赤外線が送信リストに認識されているか、irsend LISTコマンドで確認します。
image12

上画面のようにremotetvや、コマンドon, up, downなどが出てくれば、lircから使える事が分かります。

いよいよリモコン信号を、irsendコマンドで送信してみます。LEDをテレビ受光部に近付けて下さい。

irsend SEND_ONCE remotetv on

irsend SEND_ONCE remotetv up

irsend SEND_ONCE remotetv down

どうでしょうか?テレビが付いたり、音量が変わったりしたでしょうか?
送信側のLEDは指向性があるので、テレビの受光部にある程度近く真っ直ぐに当ててみて下さい。
広範囲で受けやすくする為には、LED拡散キャップを使うと、反応が良くなります。

3.日本語認識Juliusの導入

ここまで手動のリモコン設定を行ってきましたが、ラズパイで日本語を検出できるようにし、声で操作できるようにします。
ラズパイで使える日本語検出には、定番のJuliusというライブラリがあります。こちらからJuliusのソースコードを入手し、ラズパイに導入していきます。(ここではv4.4.2.1を使っています)

$ sudo wget https://github.com/julius-speech/julius/archive/v4.4.2.1.tar.gz
$ tar zxvf v4.4.2.1.tar.gz

プログラム展開後、通常通りJuliusのインストールを行いたいところですが、最新の3B+とRaspbian Stretchでは、Juliusが通常使うサウンドドライバOSSが含まれていません。(以下”FATAL”と出てしまいました。)
image13

それに対応する為、ALSAという別のドライバを使ってJuliusを動かすようにします。(黄色のalsaパラメータをつけています)
以下の順番でライブラリ群をインストールして行って下さい。

$ sudo apt-get install osspd-alsa
$ sudo aptitude install libasound2-dev

$ sudo ./configure –with-mictype=alsa
$ sudo make
$ sudo make install

$ julius –version

$ arecord -l #マイクのデバイス番号を調べて、以下のコマンドで環境設定しておきます
$ export ALSADEV=hw:1,0

image14

これでJulius自身がインストールできました。
image16

続いて、辞書ファイルなどをダウンロードします。

$ sudo wget https://osdn.net/dl/julius/dictation-kit-v4.4.zip
$ sudo unzip dictation-kit-v4.4.zip

$ sudo wget https://github.com/julius-speech/grammar-kit/archive/v4.3.1.zip
$ sudo unzip v4.3.1.zip

ダウンロードしたdictation-kitの中にサンプルファイルがあるので、早速Juliusを試してみます。

$ cd dictation-kit-v4.4/
$ julius -C main.jconf -C am-gmm.jconf -demo

どうでしょうか?下の画面のように、しゃべった日本語を認識してくれたでしょうか?

image17

このデモプログラムを使ってみると分かりますが、デフォルトの辞書がとても大きい為、レスポンスが若干遅くなっています。
今回は家内で使う特定の言葉のみを使うので、パフォーマンスを良くする意味でも、自分自身の辞書を作って最適化しましょう。
このようなremote.wordファイルを作り、単語-Tab-読み、の形で、登録したい単語を追加していきます。
[remote.word]
aimge18

以下コマンドから、remote.wordファイルを辞書ファイルremote.dicに変換します。(書き込みエラーが出たら、remote.dicファイルが作られるフォルダに書き込み権限を追加してみて下さい。)

$ cd ~/smart/julius-4.4.2.1
$ iconv -f utf8 -t eucjp dictation-kit-v4.4/remote.word | gramtools/yomi2voca/yomi2voca.pl | iconv -f eucjp -t utf8 > dictation-kit-v4.4/remote.dic

[remote.dic]
aimge18

最後にremote.jconfという設定ファイルを作って、これまで作った辞書を読み込ませます。(こちらは、Juliusで認識させる辞書remote.dicを指定する、最低限の設定になっています。)
[remote.jconf]
image20

ここでは出来たファイル全て(remote.word, remote.dic, remote.jconf)を、dictation-kitフォルダ下に置いています。
image21

さあこれで、julius -C remote.jconfとコマンドを打ってみましょう!
image22

image23

どうでしょうか?テレビオン、や音量アップ、ダウンなどの単語をレスポンス良く認識してくれたでしょうか?動いている動画はこちらになります。

4.Juliusと赤外線リモコンの連動

それでは最後に、認識した言葉と赤外線リモコンを連動させてみましょう。
そのままでももちろん動きますが、ケーブルがかなりごちゃごちゃしてしまったので、100ショップなどで手に入れた木製のケースなどに収納しました。

image24

外側に赤い拡散キャップが付いた赤外線LEDと受光モジュールを出しています。ここでは家型にしましたが、お好きなデザインで作ってみて下さいね。
image25

では本題のJuliusとコマンドの連携です。
Juliusは-moduleというパラメータを付けると、言葉を認識した時に、xmlファイルを生成するようになります。このxmlファイルを読み込み、特定ワードが聞き取れた時に、irsendコマンドを送る、以下のようなプログラムを用意します。合わせて、LEDを光らせたり、Aquestalkで喋らせたりもしています。

[julius_ir_remote.py]

それでは、操作したい家電の近くに置いて、やってみましょう!

ラズパイのデスクトップ又はパソコンから、別々のターミナルを二つ立ち上げます。
そして、以下二つのプログラムを連携して走らせます。(Juliusプログラムを先に走らせます。)

(一つ目のターミナル) $ julius -C remote.jconf -module

image26

まずこちらのJuliusプログラムが待ち受け状態になります。
image27

その後、先ほど作ったir_remoteプログラムを走らせます。

(二つ目のターミナル) $ python julius_ir_remote.py

そして登録した指示語を発話します。
image28

発話した“テレビオン”などに伴って、画面にその言葉が出力され、LEDが光ったり、赤外線が送信されたりしたでしょうか?こちらの動画のように、声でテレビがついたり、音量が変わっているところが分かると思います。

5.まとめ

今回はラズパイでスマートホームの第三回として、しゃべるだけでリモコン操作ができるものを作りました。
リモコン機器は、赤外線のものなら大抵は登録できるので、ご自宅の機器でやってみて下さい。
辞書の言葉もご自由に追加できるので、操作したい機器に合わせて呼びかけやすい言葉を登録してみて下さい。

次回はカメラも合わせて、家の中をチェックしてくれるような機能も付けます。
お楽しみに!

(ヨシケン)

deviceplus_vol3_cta_580x223_ver2
ヨシケン(吉田 顕一)

普通の会社に勤めるサラリーマンですが、モノ作りが好きな週末メイカーで、電子書籍MESHBOOKを出したり、ブログを書いたりしています!

http://blog.ktrips.net