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

自作ラズパイスマートスピーカーでペンダントライトを音声操作

ホーム前へ次へ
Raspberry Piって?

自作ラズパイスマートスピーカーでペンダントライトを音声操作

自作ラズパイスマートスピーカーでペンダントライトを音声操作

2020/03/07

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

 主な機能は、

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

 音声認識にJuliusを使った自作スマートスピーカーに伝言とメモの機能を実装するにあたり、マイクとスピーカーを専有してしまうOSSやALSAからPulseAudioに移行しました。

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

 自ずとモニタ付きとなるPC版スマートスピーカーには、PC及びラズパイ双方のスマートスピーカー機能のデスクトップアプリとしてPyQt5/Qt Designerによる操作パネルも作成しました。

壁面埋め込み照明スイッチ切り替え用サーボモータを音声操作

ペンダントライトのON/OFFを音声操作

 今回は、HTML5実装の一部であるWebSocketを介してペンダントライトをON/OFFするサーボモータを音声操作できるようにします。

 リモコン家電なら自作スマートリモコンでリモコンに対応していなくても自作スマートコンセント・スマートプラグにつなげば、同様にスマートスピーカーから音声操作できます。

 市販のWiFiスマートプラグ、後付できる引掛けシーリング対応赤外線リモコンもありますが、冒頭のリンク先に書いた通りの理由から、何より紐をサーボで引っ張るというアナログ感がたまならい、ということで、ここは、あえてESP8266/ESP32の自作品を音声操作できるようにします。

 メーカーはダメ出ししていますが、自己責任でコンセント付き引掛けシーリング、紐付き引掛けシーリング、既存のペンダントライト用にそもそもある引掛けシーリング3段でサーボではそちらの紐 or 金具(プルスイッチ)を引っ張るので、多少、運用上の制約はあるものの、従来通り、手動でも点灯・消灯できるようにしてあります。

概要

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

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

$ 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
...
部屋のライトつけて [MY_ROOM_LIGHT_SW] h e y a n o r a i t o t u k e t e
部屋のライト消して [MY_ROOM_LIGHT_SW] h e y a n o r a i t o k e sh i t e
部屋の照明つけて [MY_ROOM_LIGHT_SW] h e y a n o sh o: m e i t u k e t e
部屋の照明消して [MY_ROOM_LIGHT_SW] h e y a n o sh o: m e i k e sh i t e
部屋の電気つけて [MY_ROOM_LIGHT_SW] h e y a n o d e N k i t u k e t e
部屋の電気消して [MY_ROOM_LIGHT_SW] h e y a n o d e N k i k e sh i t e
...
$ iconv -f utf8 -t eucjp mydic.list > mydic.eucjp
$

 ペンダントライトのオンとオフは、データとして状態を保持できないため、操作は、1つのみ([MY_ROOM_LIGHT_SW])としており、万一空振りすることがあると逆の動作になることも...。

 その場合、ペンダントライトの紐で合わせる運用が必要です(ちなみに引掛けシーリングの紐をON状態にしておかないとペンダントランプの紐での操作はできません)。

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

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

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

$ pwd
/home/xxx/sound/
$ vi ./voicerecieve.pl
#!/usr/bin/env perl
...
      # 【照明】
...
      # 【マイルーム】
      when("MY_ROOM_LIGHT_SW"){
       system("/home/xxx/sound/script/my_room_light.py 1 &");
      }
 ...
 

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

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

$ pwd
/home/xxx/sound/script
$ vi ./my_room_light.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-
 
from websocket import create_connection
import sys
 
ws = create_connection("ws://esp32pendantlight.local:81/")
arg = sys.argv
 
ws.send(arg[1])
ws.close()
$ chmod +u my_room_light.py
$ ./my_room_light.py 1

 Pythonによる照明スイッチ操作スクリプトmy_room_light.pyは、

 ちなみにブラウザからも操作でき、その場合は、冒頭のペンダントライトON/OFFサーボのリンク先に書いたようにJavaScriptをクライントとします。

 リンク先のように、ここでは、ESP8266/ESP32にWebSocketサーバがあることを前提としています。

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

2020/04/27

 Raspberry Pi/ESPボード/WebSocketクライアントの組み合わせについての注意・特記事項

ホーム前へ次へ