小型Linuxサーバ / GuruPlug Server

この記事は2012年8月8日から2013年7月1日の間に「GuruPlugServer Facebook」で紹介したものです。

#4 上級編 ハードもソフトも使って作ってみよう

#4-1 謹賀新年メッセージボードを作ってみよう

あけましておめでとうございます。
今年も宜しくお願いします!!

2013年最初の記事は…
GuruPlugとLEDメッセージボードをつなげて謹賀新年メッセージボードを作成します!

今回使用するメッセージボードは、株式会社べルソスの「DREAM CHEEKY」です。
ECサイトなどで、3500円程で購入できます。

このメッセージボードは、弊社開発の勤怠管理システムで時刻を表示させる際使用しています。
さて、早速始めましょう。

GuruPlugからメッセージボードを操作するには、【dcled】コマンドを入手する必要があります。

下記のURLを参考に、挑戦してみて下さい。
https://github.com/kost/dcled

ここでは、手順だけお教えします。

手順1.dcled.cファイルを入手します。

手順2.必要なライブラリをインストールします。

【apt-get install libhid-dev】を実行

手順3.コンパイル/インストールします。

【make】を実行

【make install】を実行

【make udev】実行

【dcled】コマンドのコンパイルとインストールが完了したところで、
早速【dcled】コマンドを使用してみましょう。

まずは、現在の時刻をメッセージボードに表示させます。

【dcled -c】
【dcled -C】(24時間表示)

表示されましたね^^
勤怠管理システムでは、実際にこのコマンドを使用して出勤・退勤の時間を表示させています。

続いて、メッセージをスクロールさせます。
メッセージはオプションに【-m】を付与し、その後、表示させたいメッセージを入力します。

【dcled -m “Happy New Year”】

スクロールが早い…
スピードを調整しましょう。

メッセージの後に【-s】オプションを付けてスピード時間を調整して下さい。

【dcled -m “Happy New Year” -s 100 】

100 は0.1秒ごとに表示です。

【dcled】コマンドには他にもいろいろなオプションがあるので、
参考URLのコマンド説明箇所をご覧下さい。

最後に2013とメッセージボードに表示して終わりにしましょう!

【dcled -m 2013 -s 100】

2013年もGuruPlugを宜しくお願い致します^^

#4-2 GuruPlugと話してみよう

今回はJuliusで認識した言葉をOpenJTalkを使って復唱させてみましょう!?

JuliusとOpenJTalkがインストールされていることにして進めていきたいと思います。
また「#3-7 OpenJTalkでGuruPlugに話をさせよう」で作成した
Perlスクリプト「ojt_mei.pl」とopenJTalk動作確認用シェル「OJTK.sh」が
【/usr/local/open_jtalk-1.05】ディレクトリ下にあることを前提に進めていきます。

*始める前に、【/usr/local】ディレクトリ下に、
 「Julius4」「dictation-kit-v4.1」「hts_engine_API-1.06・open_jtalk-1.05」が配置されていることを確かめて下さい。

また今回は簡単な「ruby」のスクリプトを作成してデモを行います。

早速始めましょう^^
「ruby」スクリプトの作成から始めます。

【/usr/local】下に【vi demo.rb】コマンドでrubyのファイルを作成します。
ここからは「demo.rb」の内容を記していきます。

まずは発した言葉を「ojt_mei.pl」スクリプトに渡しOpenJTalkで話せる形式に変える関数の作成です。
*ここから【】を「demo.rb」の内容とします。
 複雑なので、一行一行キャプチャに記してある行数も書いておきます。

16行目
関数定義です。
【def GenerateVoice(words)】

17行目
「echo」コマンドで取得した言葉を「in.txt」に一旦書き込みます。
【system(“echo #{words} > in.txt”)】
「system」はコマンドを実行して、成功した時には真を失敗した時には偽を返します。

18行目
Perlスクリプト「ojt_mei.pl」を外部コマンドとして呼び出して実行します。
【system(“open_jtalk-1.05/ojt_mei.pl”)】

19行目
「sox」コマンドで「voice.wav」ファイルを16bitに変換してチャンネルを合わせます。
【system(“sox out.wav -b 16 voice.wav channels 2”)】

20行目
「out.wav」ファイルを削除します。
【system(“rm out.wav”)】

21行目
「voice.wav」ファイルをこれから作成する「PlaySound」関数に渡します。
【PlaySound(“voice.wav”)】

22行目
関数の終わりを示しています。
【end】

次に音声ファイルを再生する関数の定義です。

8行目
関数定義です。
「GenerateVoice」関数で16bitに変換した「voice.wav」を引数にもらいます。
【def PlaySound(sndfile)】

9行目
引数でもらう「sndfile」が存在しなかったら今いるディレクトリ下にある【sound】ディレクトリ下にある「sndfile」を探しにいきます。
【if !File.exist?(sndfile)】

10行目
音源のファイルのパスを変更して、代入します。
【sandfile = “sound/” + sndfile】

11行目
9行目のif文の終わりを示しています。
【end】

12行目
「aplay」コマンドで「sndfile」を再生
(sndfileは「GenerateVoice」関数で引数としてもらった「voice.wav」です)
【system(apay -D hw:0 #{sndfile})】

13行目
関数の終わりを示します。
【end】

ここからがメインの実行処理です。

24行目
「STDIN.get」メソッドで入力文字を一行読み込み、それを「line」とするループ
今回はキーボードからの入力ではなく音声による入力です。
【while line = STDIN.gets】

25行目
入力された文字列はStringなので文字の末尾は「\n」です。
この「\n」を取り除くために「chomp」を使用します。
【line.chomp!】

26行目
正式な解析結果「sentence1: 」を取得します。
【if line.index(“sentence1: ”) !=0】

27行目
今回のループの処理を中断し、次のループの処理を行います。
【next】

28行目
if文の終わりを示します。
【end】

29行目
Juliusの結果から「sentence1: 」を削除します。
【words = line[12 , 100]】

30行目
Juliusの結果からスペースを削除します。
【words.delete!(“ ”)】

31行目
認識した言葉を「GenerateVoice」関数に引数として渡します。
【GenerateVoice(words)】

32行目
while文の終わりを示します。
【end】

以上で「demo.rb」の記述内容は終わりです。

早速この「demo.rb」を使いデモを行いましょう。

【/usr/local】下のディレクトリで
【julius -C dictation-kit-v4.1/fast.jconf -input mic -charconv EUC-JP UTF-8 | ruby demo.rb】
を実行します。

数秒するとすぐにJuliusが起動し、音声を取得し始めます!

*上記のようなエラーが発生した場合、
 【set ALSADEV hw:0】
 【export ALSADEV=hw:0】を実行してから、再度Juliusを起動しましょう。

「お疲れ様でした」と喋ってみると、
「sentence1: 」でちゃんと解析してくれています!

音声は出るかな~…?
あ!再生中の文字出力後…

…「お疲れ様でした!」

喋ってくれました!

成功ですね^^
実際のデモの光景はこの後のウォールの動画で確認してみて下さい^^
【まとめ】
#3-5 Juliusで音声認識してみよう
#3-7 OpenJTalkでGuruPlugに話をさせよう
そして今回の「#4-2 GuruPlugと話してみよう」までのデモはどうでしたでしょうか。
私は今回の一連のデモを通して、いろいろな可能性を感じました。
例えば、「天気」と言ったらWEB上で現在の天気予報を取得して読み上げてくれる処理を追加したり、
「電気」と言ったら、GuruPlugで自宅の電気を制御して点灯・消灯したりすることができるかもしれません。
可能性は無限大ですね!
ぜひGuruPlugを使用して挑戦してみて下さい^^

#4-3 GuruPlugでNASを作ろう

今回は、GuruPlugをNAS(Network Attached Storage)にしてみたいと思います。
NASに画像(写真)を置けばGuruPlugがフォトサーバになりますね。

手順は次のとおりです。
【手順1】 GuruPlugにSambaをインストールする。
【手順2】 iphoneからGuruPlugのNASにアクセスする。

ハードウェアとして次の方々が登場します。
・GuruPlug
・作業用パソコン
・iphone

作業用パソコンには、TeraTermをインストールしておきます。
TeraTermがあれば、JTAG経由でのシリアルポート接続およびSSH接続ができるので便利ですね。
iphoneにはFileExplorerというアプリケーションをインストールしておきます。
FileExplorerはNAS等を閲覧することができるファイルユーティリティです。

【手順1】GuruPlugにSambaをインストールする。
まずは、Sambaをインストールします。
Sambaは、Windowsネットワークを実装したフリーソフトウェアです。
ご存知の方、多いことでしょう。

作業用パソコンからGuruPlugを操作して、apt-getコマンドを使用し、sambaパッケージをインストールします。

# apt-get install samba

以上!
この時点でもうNASです。何て簡単なんでしょう。
Sambaの設定を操作することでNASアクセス時の認証方式を変更したり、プリンターサーバにしたりと色々できます。
今回は、認証なしで読み書きが自在にできる「guruplug_share」というフォルダを用意することにしました。

Sambaの設定ファイルは下記のファイルです。
/etc/samba/smb.conf
下記の通り設定しました。

===smb.conf(変更)=========
security = user

security = share
=====================

===smb.conf(追記)=========
[guruplug_share]
path = /home/guruplug_share
public = Yes
read only = No
writable = Yes
=====================

上記の設定の通り、
/home/guruplug_shareを外部から閲覧可能なディレクトリとしますので、
/home/guruplug_shareディレクトリを作成します。

# mkdir /home/guruplug_share
# chmod 777 /home/guruplug_share

Sambaのデーモンを再起動(もしくは設定再読み込み)を行うことで上記設定は反映されます。

# /etc/init.d/samba reload

試しに作業用パソコンのエクスプローラからguruplug_shareディレクトリにアクセスできるか確認してみましょう。

おぉ!なんだかguruplug_shareディレクトリが閲覧できているようですね。
本当にGuruPlugのguruplug_shareディレクトリなのかなぁ・・・と、
この時点では疑ってしまいますね。(私だけですか!?)
そこで、作業用パソコンのエクスプローラからguruplug_shareディレクトリに
test.txtというファイルを作成して、GuruPlugにtest.txtファイルが作成されているか確認してみましょう。
まずは、作業用パソコンのエクスプローラでtest.txtを作成します。

作成できましたね。
では、GuruPlugの確認です。
さて、/home/guruplug_shareディレクトリにtest.txtファイルがあるのでしょうか!?

ありますね!

【手順2】iphoneからGuruPlugのNASにアクセスする。
今度はiphoneからNASにアクセスしてみましょう。
先に記しましたFileExplorerというアプリケーションを使用してアクセスしてみます。

test.txtファイルがありますね!
iphoneからアクセスできました。
テキストファイルだけだと、少し寂しいので、
適当な画像をguruplug_shareディレクトリに置いてみて、iphoneから確認してみましょう。

(この画像は、GuruPlugで作成したセキュリティシステムが撮影したカメラ画像です。)

GuruPlugがNASになりましたね。
GuruPlugは無線LANのAPとして動作しますので、
iphone等の無線LAN対応の端末を接続すると
端末からGuruPlugのファイルにアクセスできますね。
今回のご紹介のように画像(写真)を置けばフォトサーバになりますし、
音楽ファイルや動画ファイルを置けばメディアサーバ(?)になりますね。

用途は色々です。
GuruPlugが何らかのデータを能動的にNASに記録するとします。
このデータを無線LAN経由でタブレット等で閲覧する。
何かに使えそうですね!
すべてはアイデアしだいです!

#4-4 GuruPlugでDLNAサーバを作ろう

今回は、GuruPlugをDLNA(Digital Living Network Alliance)のサーバにしてみたいと思います。

GuruPlugに画像(写真)や動画、音楽といったメディアを配置して、
DLNA対応のクライアントから接続してみます。

構成は、「#4-3 GuruPlugでNASを作ろう」のNASと似ていますね。

GuruPlugをお家に置いて、テレビ等のDLNA対応機器からアクセスしてみると、
面白いのではないか?というお話です。

手順は次のとおりです。
【手順1】 GuruPlugにMediaTombをインストールする。
【手順2】 iphoneからGuruPlugのメディアにアクセスする。

ハードウェアとして次の方々が登場します。
・GuruPlug
・作業用パソコン
・iphone

作業用パソコンには、TeraTermをインストールしておきます。
TeraTermがあれば、JTAG経由でのシリアルポート接続およびSSH接続ができるので便利ですね。
(前回のNASの時と同様です。)

iphoneにはMedia Link Player Liteというアプリケーションをインストールしておきます。
Media Link Player LiteはDLNAサーバ、UPnP(Universal Plug and Play)のサーバに蓄積された
メディアをネットワーク経由で再生することが出来るメディアプレーヤーです。

MediaTombというのは、UPnPのAV Architectureで定められているMediaServer機能を
実装したオープンソースです。

【手順1】GuruPlugにMediaTombをインストールする。
まずは、MediaTombをインストールします。

作業用パソコンからGuruPlugを操作して、apt-getコマンドを使用し、mediatombパッケージをインストールします。

# apt-get install mediatomb

以上!インストール完了です。
MediaTombの設定を少し修正して、iphoneからアクセスしてみたいと思います。

設定ファイルを修正して、以下の設定をします。

・MediaTombのWEB-UIを有効にする。

DLNAクライアントに公開するメディアを設定する際に使用します。

・サーバの名称を「GuruPlug」にする。

デフォルトだと「MediaTomb」なので、分かりやすく「GuruPlug」にします。

・DLNAクライアントと通信するネットワークインタフェースを指定する。

GuruPlugには有線(eth0)と無線(uap0)のネットワークインタフェースが存在するので、
今回は、無線接続するiphone向けにuap0でDLNAクライアントと通信するよう設定します。

修正する設定ファイルは下記のファイルです。
/etc/mediatomb/config.xml
/etc/default/mediatomb

下記の通り設定しました。

===config.xml(変更)===

<ui enabled="no" show-tooltips="yes">

<ui enabled="yes" show-tooltips="yes">

<name>MediaTomb</name>

<name>GuruPlug</name>
================

===mediatomb(変更)====

INTERFACE=""

INTERFACE="uap0"
======================

MediaTombを再起動して設定を反映します。

# /etc/init.d/mediatomb restart

これで、MediaTombが起動して、MediaTombのWEB-UIが操作できるようになりました。

MediaTombのWEB-UIにアクセスするためのURLを確認しましょう。

# tail /var/log/mediatomb.log

MediaTombのログファイルをtailすると、下記のようなINFOログを確認することが出来ます。

======================
2013-01-29 04:13:04  INFO: http://192.168.123.1:49152/
======================

このURLがWEB-UIにアクセスするためのURLです。
作業用パソコンのWEBブラウザにURLを入力してMediaTombのWEB-UIにアクセスしましょう。
こんな画面が表示されます。

今回は、メディア(画像と動画)を入れたUSBメモリをGuruPlugに接続して、
マウントされたUSBメモリの/media/usb0をMediaTombで公開します。
MediaTombのWEB-UIを操作して/media/usb0を公開します。

「Database」を表示してみましょう。

/Database/PC Directory/media/usb0ディレクトリに

画像ファイル(.jpg)と動画ファイル(.mp4)がありますね。

さぁ、ちゃんと公開されているか、DLNAクライアント(iphone)から確認してみましょう!

【手順2】iphoneからGuruPlugのメディアにアクセスする。
さぁ、iphoneからアクセスしてみましょう。
先に記しましたMedia Link Player Liteというアプリケーションを使用してアクセスしてみます。
iphoneは、GuruPlugの無線APに接続しておきます。

おぉ!「Server List」に「GuruPlug」の文字が。
これは先に設定したサーバ名称ですね。

これは期待大!確認を続けましょう。
「GuruPlug」を表示してみると・・・。

似たファイル構成をMediaTombののWEB-UIで見ましたね。
さぁ、「PC Directory」の配下に画像と動画があるのか?
そして、見ることができるのか?

ありました!!「再生できない可能性があります。」って・・・。
気になりますが、動画ファイル(.mp4)を確認してみましょう!

(この動画は、Facebookにもアップしました、弊社で開発した見守りシステム「Smile Sitter」のプロモーションビデオです。)

GuruPlugがDLNAサーバになりましたね。

先にも説明した通り、お家に置いて、テレビ等のDLNA対応機器からアクセスすることもできますね。
GuruPlugが何らかの方法で動画を収集してくれたりすると、さらに面白そうですね!
例えば、特定のキーワードでYoutubeを検索して、動画をダウンロードするとか。
(Youtubeのダウンロードって、いま出来ないんでしたっけ?)

今回はDLNAでした!

#4-5 GuruPlugでペットを見守ろう

本日は「GuruPlugでペットを見守ろう」です。

自宅にいる可愛いペットの画像を外出先でも
見られるように設定を行いましょう!
お仕事の合間やお昼休みに愛犬の画像付きメールが送られてくれば、
安心してお仕事にも精が出ますね!

今回は、
#2-2 WEBカメラをつなげてみよう
#3-1 GuruPlugからメールを送ってみよう
#3-2 GuruPlugから添付ファイル付きメールを送ってみよう
を応用して、自宅にいるペットの画像をメールで送るよう設定を行います。

今回は下記の手順で進めていきます。
【手順1】uvccaptureコマンドのインストール
【手順2】「MIME_MAIL.sh」のインストール・設定
【手順3】「pet.sh」のインストール
【手順4】クーロン設定

早速始めましょう!

まずは、【uvccapture】コマンドをインストールします。
【uvccapture】はUVCからスナップショットを撮る目的のプログラムです。
#2-2 WEBカメラをつなげてみよう」で使用した「motion」は
ストリーミング配信を行うアプリケーションなので、
今回のように写真だけでよければ【uvccapture】が簡単で便利です。

【apt-get install uvccapture】

これで【uvccapture】は使用できますね。
試しに写真を撮ってみましょう!
下記のコマンドで撮影ができます。

【uvccapture -m -v】

実行したディレクトリ下に「snap.jpg」ができています。

続いては「MIME_MAIL.sh」の作成・設定です。
下記をインストールして使用して下さい。
www.jspnet.co.jp/guruplug/download/MIME_MAIL.sh

ダウンロードできたら、「MIME_MAIL.sh」の中を少し変えます。
1. GuruPlugのアドレス記述
2. 宛先アドレス記述
3. Subject記述

4行目~6行目のここです。

from_addr='from@address'
to_addr='to@address'
subject='Subject'

*「MIME.MIIL.sh」は「/home/pet」というフォルダを作成して
その中に格納して置いて下さい。

続いては「pet.sh」の作成です。
下記をインストールして使用して下さい。
www.jspnet.co.jp/guruplug/download/pet.sh

このシェルは、これまでの手順でインストールしたものを順番に実行するだけです。
1. 写真を撮影
2. 写真を圧縮(zip)
3. 写真を添付してメール送信

続いてはクーロン設定です。
クーロンとは、ユーザが設定したスケジュール(分・時・日・月・曜日)に
基づいて指定したシェルやコマンドなどを自動実行してくれるプログラムです。
クーロンは、【crontab -e】で設定できます。

今回は毎日12:00に「pet.sh」を実行します。
左から、分・時・日・月・曜日・コマンドの形式で設定します。

これで設定完了です!
後はメールを待つのみです。届いているかな~

届いています!成功です。
*今回は社内で実験しました。

ペット以外にも植物の定期観測や防犯対策にも使えそうですね。
ぜひやってみてください♪