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

heyheytower

日々のメモです。誰かのお役に立てれば幸いです。

声で家電を制御する:その6(完成報告)

目的

声で家電を制御する。ただし安価に。

完成報告

こんなシステムが 3,393円 でつくれました。



Fig. システム概要

  1. PC に指示を出す(呼びかけ+指示:「ぐらどす」「あっぷ」)
  2. PC が「ぐらどす」で待受状態になり、「あっぷ」の声を認識し、万能リモコン(arduino)に指示を出す
  3. 万能リモコンに届いた信号に合わせて、赤外線送信する(任意のコマンドを実行する)
  4. テレビの音量が上がる

※但し期待しすぎるとアレなので初めに書いときますが、誤認識がけっこうあります。
 人のせいにするようで申し訳ないですが、OpenHRI の julius をそのまま用いているため
 です。
 「呼びかけの利用」「単語の選定」で誤認識はかなり抑えられるので、
 要チューニングなシステムということでご了承ください。
 

物理環境

  • PC

 NEC Express5800/S70 タイプSR(メモリ8GB)

  • 万能リモコン部

 Arduino duemilanove

  • 無指向性マイク×2

 iBUFFALO マイクロフォン スタンダード ホワイト BSHSM06WH
 USB カメラについてきた、100均レベルのマイク・ヘッドホン

ソフトウェアなど

  • 本体

 Ubuntu 10.04

 Arduino 1.0.1(統合開発環境arduinoへの書き込みに必要)
 A Multi-Protocol Infrared Remote Library for the Arduino*1

 OpenHRI
 OpenRTM-aist
 Eclipse(RT System Editorをインストール、統合開発環境。動作に必須ではない)

価格

今回はコストパフォーマンス重視だったので付録で細かく記載します。
必須な金額としては「万能リモコン部/マイク+赤外線解析のため」の費用で、¥3,393 です
マイク付きで iRemocon より 21,408円 安価です。(2012/11/25現在の価格より)

※赤外線信号登録などの手間を2万と考えれば、iRemocon の値段も妥当だと思います。
 しかも今回エアコンのリモコンは赤外線信号がうまく解析できず、
 電源ON/OFFをリレーでという強硬手段でした。

システム仕様(ハードウェア)

このハードウェアの売りとしては、センサ・スイッチを拡張できるところです。

  • 温度センサ、人感知センサを追加し連動も可能(自分は要らないので未実装、動作は確認)
  • 赤外線リモコン以外でもリレーを挟んでスイッチONが可能(スタンドライトなど)


Fig. 万能リモコン部外観


Fig. 万能リモコン、ブレッドボード配置図*2

配置は同じブレッドボードがレイアウトになかったため、上記写真と違うので注意です。
電界効果トランジスタはもっと小型ですし、リレーのピン配置もちょっと違いますので実際に作る際はリレーのデータシートを見てください。

arduino の 5V には 800mA 程の電流が流れますが、arduino 5V・トランジスタ 2SK2962 の許容電流が 1A 、流れるのはパルス電流なので大丈夫のはずです。
※制限事項は6畳位の部屋しかカバーできないことです。それに加え受信機の性能によっては近くに置くなり、工夫が必要と考えられます。
 また、外部電源を用いることで出力アップ自体は行えます。

システム仕様(ソフトウェア:音声認識部)


Fig. 音声認識コンポーネント群(RT System Editorのキャプチャ)

そのまま OpenHRI のシステムを用いているのでOpenHRIを見てください。
追加部分としては下記で、どちらも OS にコマンド投げてるだけですが、プログラムを見やすくするために分けてます。
  SerialOut;arduino へのシリアル送信部
  Execute :任意のコマンド実行部(shutdown 、天気読ませる、等)

認識させたい単語の登録は srgseditor test.xml
認識した単語とコマンド実行の登録は seateditor test.seatml 、
で編集すると便利です。(リアルタイム文法チェックしてくれます)
ありものでここまでできるとは…、良い世の中です。


Fig. srgseditor 画面


Fig. seateditor 画面(丸内に書いてあるのが"状態"で、矢印が遷移を示しています)

システム仕様(ソフトウェア:arduino

書き込んだプログラムは、中略してますが以下のような形式を並べただけなので、簡単に改変し使うことができます。
注意としては、Sony形式の送信では2,3コマンド送信しないといけないこと、音量を2つ上げたい時はシリアルで "bb" と送信するだけで良い、等です。

※リモコンの赤外線信号は別途調べる必要があります。
 声で家電を制御する。ただし安価に:その1(赤外線送信) - heyheytower
 2〜3年前の機器ならIndex of /remotesに記載があるかもです。

#include
//ref. http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

IRsend irsend;

void setup()
{
// initialize serial baud rate
Serial.begin(9600);
// initialize the relay pin as an output:
pinMode(12, OUTPUT);
}

int incomingByte = 0; // 受信データ用

void loop() {
if (Serial.available() > 0) { // 受信したデータが存在する
incomingByte = Serial.read(); // 受信データを読み込む

Serial.print("I received: "); // 受信データを送りかえす
Serial.println(incomingByte, DEC);
}
if (incomingByte == 97) {
// echo "a" > /dev/ttyUSB0
for (int i = 0; i < 3; i++) {
irsend.sendSony(0xA81, 12); // Sony compo power on
delay(100);
}
incomingByte = 0;
}

if (incomingByte == 98) {
for (int i = 0; i < 3; i++) {
irsend.sendSony(0x481, 12); // Sony compo volume up
delay(100);
}
incomingByte = 0;
}
///////////////////////////////中略///////////////////////////////////
if (incomingByte == 110) {
irsend.sendNEC(0x594212ED, 32); // light on
delay(100);
incomingByte = 0;
}
if (incomingByte == 111) {
irsend.sendNEC(0x594211EE, 32); // mini light on
delay(100);
incomingByte = 0;
}
///////////////////////////////中略///////////////////////////////////
if (incomingByte == 79) {
for (int i = 0; i < 3; i++) {
irsend.sendSony(0x1AB5B, 20); // PS3 L2
delay(10);
}
incomingByte = 0;
}
if (incomingByte == 80) {
for (int i = 0; i < 3; i++) {
irsend.sendSony(0x8AB5B, 20); // PS3 L3
delay(10);
}
incomingByte = 0;
}
if (incomingByte == 81) {
// air controller on/off
// ref. http://yutakalife.net/article/134256657.html
// echo "Q" > /dev/ttyUSB0
digitalWrite(12, HIGH);// リレーオン
delay(500); // 500ミリ秒待つ
digitalWrite(12, LOW);
incomingByte = 0;
}
}

ソースコード配布など

OpenHRI をそのまま使っただけですし、環境構築のスクリプトをまとめるのも芸がないので、同じようなシステム作りたい場合は過去の記事を参照ください。
パソコン詳しい人なら1週間、パソコン詳しくない人でも2週間位で同じような環境が作れると思います。(平日夜+休日の作業)

作製手順としてはこれくらいです。

  1. モノを揃える
  2. PC環境作り、そして音声認識テスト(指示を認識→コマンド実行、まで)
  3. arduino のセッティング(初めは解析用の配置にする)
  4. 赤外線通信解析
  5. 語彙の登録と赤外線信号登録
  6. arduino のセッティング(送信用の配置にする)
  7. リレーするなら機器の改造(arduino テスト)
  8. 結合テスト

付録

  • 万能リモコン部/マイク

製品型番単価(円)個数価格(円)
Arduinoduemilanove2520(Uno の値段)12520
小型リレー941H-2C-5D1001100
高輝度赤外線LEDOSI5FU5111C-40209180
電界効果トランジスタ2SK296288188
スイッチング・ダイオード1N4148212
カーボン抵抗1/4W 4.7Ω133
マイクiBUFFALO BSHSM06WH4501450
3343

  • 赤外線解析のため

製品型番単価(円)個数価格(円)
赤外線リモコン受光モジュールPL-IRM-2161-C438250150
50



購入先は以下。

arduino 参考書籍

参考にしつつ、自分が想像力を掻き立てられた本を一冊。
センサ制御も、無線も、電子回路もひと通りレシピがあるのでとても便利です。

最後に

今回の音声認識システム完成は、下記の方々の先行作品があってのことでした。
参考にさせていただきました。
どうもありがとうございます。今後もチェックしますのでよろしくお願いします。

rti7743 さん
http://d.hatena.ne.jp/rti7743/20120104/1325668680

hecomi さん
http://d.hatena.ne.jp/hecomi/20120116/1326726831

yhira さん
http://netakiri.net/diary/archives/431.html

rti7743 さん・hecomi さんは音声認識機械学習などで完成度の高いものに仕上げており、今後参考にしたいところです。
yhira さんはリモート制御できる製品全般に詳しい方でしたので、そういった点を参考にさせてもらいました。
自分は Glamo 製の iRemocon を用いず、arduino で万能リモコンを作ったということで住み分けができたかなと考えています。



以上。