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

WebSocket経由で自作ラズパイスマートスピーカーから自作電動ロールスクリーンを音声操作

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

WebSocket経由で自作ラズパイスマートスピーカーから自作電動ロールスクリーンを音声操作

WebSocket経由で自作ラズパイスマートスピーカーから自作電動ロールスクリーンを音声操作

2020/02/25

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

 主な機能は、

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

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

WebSocketを介してロールスクリーンを音声操作

自作電動ロールスクリーン/ロールシェード/ロールカーテン

 今回は、HTML5実装の一部であるWebSocketを介して自作ロールスクリーンを音声操作でUP/DOWN(上昇/下降)させます。

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

 ただ、スマートコンセントだとON/OFFしかできません。

 また、自作ロールスクリーンをスマートリモコン対応にすることもできますが、別途リモコン用のデバイスを用意する必要があります。

 その点、WebSocketなら、音声のみならず、ブラウザからも操作でき、その場合、PC、スマホ、タブレットなどがあればよいのでコスパも高く、スマートロールスクリーンに限らず、操作もプログラム次第と拡張も容易です。

概要

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

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

$ 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
...
デスクのロールスクリーン上げて [DESKロールスクリーンUP] d e s u k u n o r o: r u s u k u r i: N a g e t e
デスクのロールスクリーン下げて [DESKロールスクリーンDN] d e s u k u n o r o: r u s u k u r i: N s a g e 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("DESKロールスクリーンUP"){
       system("/home/xxx/sound/script/websocket_client.py 1 &");
      }
 ...
      when("DESKロールスクリーンDN"){
       system("/home/xxx/sound/script/websocket_client.py 2 &");
      }
 ...
 

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

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

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

 ロールスクリーン操作スクリプトwebsocket_client.pyは、

 ちなみにブラウザからも操作でき、その場合は、無線電動ロールスクリーンを自作 ESP8266・ESP32/WebSocketに書いたようにJavaScriptをクライントとします。

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

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

ウェブ造ホーム前へ次へ