気の向くままに辿るIT/ICT/IoT
webzoit.net
IoT・電子工作

自作ラズパイスマートスピーカーで非リモコン扇風機を音声操作

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
Raspberry Piって?

自作ラズパイスマートスピーカーで非リモコン扇風機を音声操作

自作ラズパイスマートスピーカーで非リモコン扇風機を音声操作

2019/04/29

 以前、作って運用しつつもブラッシュアップ中のRaspberry Pi 3 Model B+とJuliusOpen JTalkベースの自作スマートスピーカーがあります。

 主な機能は、

 尚、ラズパイ用ACアダプタを挿したスイッチ付きコンセントでのON/OFFとは別にラズパイ用boot/reboot/shutdown物理ボタン付き。

 ちなみに便利なのでラズパイだけでなく、PC/Debianにも自作スマートスピーカー機能を搭載しています。

リモコン非対応の扇風機を音声操作

自作ESP8266スマートプラグ/スマートコンセントで扇風機をブラウザから遠隔操作でON

 今回は、付属の台にクリップ扇風機挟むと卓上扇風機、台を外すとクリップ扇風機として使える卓上兼クリップ小型扇風機を音声操作でON/OFFします。

 リモコンに対応していなくてもESP8266による自作スマートコンセントのようなスマートプラグにつなぐと非リモコン扇風機を遠隔操作できます。

概要

 詳細は、各リンク先に譲りますが、概要としては、次のようになります。

 何をどう操作するかイメージすべく、

$ pwd
/home/xxx/julius/path/to/dictation-kit
$ vi ./mydic.list
<sil> [] silB
<sil> [] silE
<sp> [] sp
スタンバイ [スタンバイ] s u t a N b a i
ニュートラル [ニュートラル] n u t o r a r u
...
キッチンのサブ扇風機つけて [台所サブ扇風機運転] k i q t i N n o s a b u s e N p u: k i t u k e t e
キッチンのサブ扇風機消して [台所サブ扇風機停止] k i q t i N n o s a b u s e N p u: k i k e s i t e
...
$ iconv -f utf8 -t eucjp mydic.list > mydic.eucjp
$

 数部屋に渡って数台ある場合、文言も工夫を要しますが、せめて同一フロアごとにスマートスピーカーを置いてそれぞれ操作した方が良いでしょう。

 音声認識ソフトウェアJulius用には、

 []内が応答スクリプトvoicerecieve.plに音声テキスト(条件分岐の条件)として渡される部分。

$ pwd
/home/xxx/sound/
$ vi ./voicerecieve.pl
#!/usr/bin/env perl
...
      # 【サブ扇風機】
      when("台所サブ扇風機運転"){
       system("/home/xxx/sound/script/sub_cool_fan_1_control.pl power &");
      }
 ...
      when("台所サブ扇風機停止"){
       system("/home/xxx/sound/script/sub_cool_fan_1_control.pl stop &");
      }
 ...
 

 Juliusから渡される音声テキストへの応答スクリプトvoicerecieve.plは、

 このようなPerlスクリプトの場合、system()を使って実際の家電操作スクリプトsub_cool_fan_1_control.plを呼ぶ。

$ pwd
/home/xxx/sound/script
$ vi ./cool_fan_1_control.pl
#!/usr/bin/env perl
use utf8;
#use strict;
use warnings;
 
use 5.10.0;
 
use Encode;
use IO::Socket;
 
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request::Common( "GET" );
 
# サブ扇風機用スマートリモコンサーバー
local $esp_subcoolfan1_server='esp_subcoolfan1.local';
 
if ($ARGV[0] eq "power"){
  print "$esp_coolfan1_server/POWER ON\n";
 
  #### インスタンスの生成
  my $ua = new LWP::UserAgent;
  $ua->timeout( 10 );
  #### 要求条件を生成
  my $req = GET( "http://esp_subcoolfan1.local/power" );
  my $res = $ua->request( $req );
  print $res->as_string;
}
...
elsif ($ARGV[0] eq "stop"){
  print "$esp_coolfan1_server/POWER OFF\n";
  my $ua = new LWP::UserAgent;
  $ua->timeout( 10 );
  my $req = GET( "http://esp_subcoolfan1.local/stop" );
  my $res = $ua->request( $req );
}
else {
  print "Argument Error!";
}

 サブ扇風機操作スクリプトsub_cool_fan_1_control.plは、

 ユーザーエージェントのインスタンス化、タイムアウト、リクエスト要求は、共用してもよいかも。

 また、use文は、要らないのもあるかも。

 自動起動時(や現在のログイン状態)に反映すべく、

ウェブ造ホーム前へ次へ