[作ってみた]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を呼ぶように置換しておく。

以上、お疲れ様でした。