[作ってみた]Raspberry Piで家電操作(Web、音声入力、音声合成)
Raspberry Piを使って家電をコントロールするというのがネットで紹介されていたので、自分でも試してみました。
機能としては、Web経由(スマホでもOK)や音声入力で家電を操作できる。操作したら音声合成で返事してくれるというものです。
参考にしたページ
ORBIT SPACE "Raspberry Piを使ってスマホ・音声で家電を制御するシステムを作ってみた"
cubic9.com "赤外線学習リモコンR2-D2"
使用した機材
Raspberry Pi B+本体,Raspberry Pi B+用ケース,フラット型PCマイク,USBオーディオ変換ケーブル,USB接続赤外線リモコン
[[amazon2][B00LT4BOK6][B00NEEA47I][B007WSKGIE][B007WPMIN8][B00AXVHQLC]]
上記以外に、MicroSDカード、電源用のMicroUSBケーブル、LNAケーブル、スピーカーは自宅にあったものを使いました。
Raspberry Piの機種によってはUSBハブも必要になります。
ORBIT SPACEさんでは温度計、無線LANの機能も使用されていましたが、私には使わない機能だったので機材も準備しませんでした。
ちなみに、Raspberry Piは、近々スペックが上がるようなので、そちらを待っても良いかもしれません。
EngadgetのRaspberry Pi 2の記事
赤外線送受信機は対象の家電によって使えない場合もあるので注意してください。
当初は大宮技研の"irMagician"を使ったのですが、自宅のTV(日立のWooo P50-XP05※型番追記)では反応せず、赤外線リモコンキットを使うことにしました。
irMagicianのコンパクトさ、使いやすさは気に入っていたので残念です。
比べるとirMagicianはダントツに小さい
作ってみる
基本はORBIT SPACEさんの記事の通り、OSのセットアップ、必要なアプリのセットアップを行って行くだけです。
温度計は使わないのでTEMPer関連はスキップしました。
また、音声合成機能はAquesTalk Piを使用しました。Open JTalkのバージョンが上がっていて、ORBIT SPACEさんの記事のままでは喋らすことができず、対処方法も分からなかったためです。
以下に作ったときのメモを記載しておきます。
SDカードをフルに使えるようにする
現状のディスク容量を確認しておく。
$df -h
セットアップした直後のものだと、使用しているSDカードよりも小さいはず。
下記のコマンドを実行すればOK。
$raspi-config
Extend Filesystemを実行する。
viの使い方
下記で確認しておく。
http://www.envinfo.uee.kyoto-u.ac.jp/user/susaki/command/vi.html
どこかのページにJuliusの辞書ファイルのエンコードを変える説明があったのでviを使っていたが、実際にはエンコードを変えなくても大丈夫だったので、別にviの代わりにnanoを使っても問題ない。
ctrl+zでプロセスを中断した場合の再開方法
$jobでジョブIDを調べて$fg %1で再開できる。
ftpのセットアップ
今回の作業は、やろうと思えば全てRspberry Pi上でできるはずだが、なんだかんだでftpが使えると便利。
PC上でテキスト編集してftpでアップロードできるようになる。
sudo apt-get install vsftpd
$ sudo service vsftpd stop
$ sudo cp /etc/vsftpd.conf /etc/vsftpd.conf-ORG
$ sudo vi /etc/vsftpd.conf
—- 変更箇所だけ
anonymous_enable=NO #匿名ユーザー(anonymous)のログイン禁止
local_enable=YES #ローカルユーザーを許可
write_enable=YES #書き込み許可
local_umask=022 #ファイル作成時のパーミッション755
$ sudo service vsftpd start
USBスピーカー、マイクデバイスの確認
下記コマンドでUSBデバイスが認識されているか確認する。
$lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS]
Bus 001 Device 005: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 006: ID 0d8c:013a C-Media Electronics, Inc.
USBデバイスのcardNoは下記で調べられる。
$ cat /proc/asound/modules
コントロールの優先度によってCardNoは0とか1とかになる。
コントロールの優先度は下記で変えられる。
$ sudo nano /etc/modprobe.d/alsa-base.conf
エディタで下記の行を探す。
options snd-usb-audio index=-2
index=-2から0に変更してRaspberry Piを再起動する。
スピーカーの確認
下記コマンドで再生ボリュームを指定する。PCMのあとの数を0-151で指定する。大きいほうが音も大きくなる。
$ amixer sset PCM 50
※CardNoが0ではない場合、-cオプションでCardNoを指定する。
下記コマンドで音を出してみる。
aplay /usr/share/sounds/alsa/Front_Center.wav
マイクの確認
下記コマンドで録音ボリュームを指定する。Micのあとの数を0-16で指定する。大きいほうが音も大きくなる。
$ amixer sset Mic 16
※CardNoが0ではない場合、-cオプションでCardNoを指定する
下記コマンドで録音と再生をしてみる。
$ arecord -r 16000 -f S16_LE test.wav
$ aplay test.wav
ちなみに、私が購入したiBUFFALO USBオーディオ変換ケーブル BSHSAU01BKは、LEDランプが赤のときがマイクがONです。
いくら話しても音声を拾わないと思ったら、青のときに話していました。
julius関連
環境変数の設定
/etc/profileに環境変数"AUDIODEV"を設定しておく。
CardNoが0のときは下記になる。
export AUDIODEV=/dev/dsp
CardNoが1のときは下記になる。
export AUDIODEV=/dev/dsp1
adin_ossエラー
下記のエラーが出る場合、snd-pcm-ossが組み込まれていないかもしれない。
Error: adin_oss: failed to open /dev/dsp
下記のコマンドでsnd-pcm-ossを組み込める。
$ sudo modprobe snd-pcm-oss
毎回コマンドを実行するわけにも行かないので、rc.localにも下記を追加しておき、自動で組み込むようにする。
echo "Load module snd_seq_oss"
/sbin/modprobe snd_seq_oss
sleep 2s
echo "Load module snd_pcm_oss"
/sbin/modprobe snd_pcm_oss
sleep 2s
単語リストの書き方
「ん」...N
促音...q
オプション
音声認識を試すとき、-nostrip をつけておかないと、謎のログが出続ける。
$ julius -C /etc/julius/julius_debug.conf -nostrip
単語リストのエンコードをUTF-8で作った場合(普通に作ったらUTF-8のはず)、-charconvオプションを指定しなければOK。
逆にEUC-JPにエンコードをするとオプションを指定しなければならなくなる。
音声合成にAquesTalk Piを使用する
セットアップ方法
$ wget http://www.a-quest.com/download/package/aquestalkpi-20130827.tar.gz
$ tar xzvf aquestalkpi-20130827.tar.gz
$ cd aquestalkpi
$ ./AquesTalkPi "テスト" | aplay
スクリプトの作成
ORBIT SPACEさんで使っている音声合成スクリプト"jsay"相当のことができるように、"jsay2"という名前で下記の内容のスクリプトを作成しておく。
#!/bin/bash
cd /home/pi/aquestalkpi/
./AquesTalkPi "$1" | aplay
作成したらchmod +xする。
ORBIT SPACEさんの"voice_remocon"のスクリプトからは、jsay2を呼ぶように置換しておく。
以上、お疲れ様でした。
ディスカッション
コメント一覧
お世話になっております。
大宮技研です。
日立のWooの型番を教えていただけますか?
可能であれば、k,200 コマンドもお試し下さい。
以上、よろしくお願いいたします。
大宮技研
お世話になっております。
Woooの型番はP50-XP05になります。k,200コマンドも試してみたのですがダメでした。
信号の読み取りはできるのですが、送信してもTV側が反応しない状況です。
電源操作を読み取った内容は、御社HPで公開されている日立TVのJSONデータと同じ内容でした。
SonyのBDプレーヤーでは読み取りも送信もうまくできていますので、装置の故障ではなさそうだと思っています。
お世話になっております。
大宮技研です。
ご返答、ありがとうございます。
多分、テレビ側の信号入力がシビアになっているのが原因だと思います。
お時間がある時に以下のどちらかをお試し下さい。
(1) k,70 or k,80 コマンドでデータを取り直してから、実行
(2) 弊社のjsonデータの7,9 の部分を全て8に置換える
以上、よろしくお願いいたします。
大宮技研
対策情報有り難うございます。
k,70、k,80でデータを取り直して送信、jsonデータを書き換えてから送信、いずれもWoooでは反応しなかったです…
irMagicianは別の部屋で使おうと検討中です。
ピンバック & トラックバック一覧
[…] 以前、Raspberry Piで家電操作環境を作ってそれっきりになっていましたが、久々に遊びたくなりました。前回は説明ページを参考に必要なアプリを組み込んだくらいだったので、今回はGPIOも使ってみたいと思っています。 […]