はじめに
声を使って何かを操作したい。RM mini 3を出口とすれば赤外線リモコンで操作できるものなら何でも操作できる。出口は結局プログラムでの操作なので、Google Sheetに書き込ませる、SlackやTelegramに投稿する、リレーでのon-offなど、プログラムから操作できるあらゆることに帰着させることができる。この自由な気分は大切です。
前にGoogle Home Mini (Nest) に頼む(1): スマートリモコン(RM mini 3)で照明操作という記事を書きました。たとえば”RM3 command, on”と言うことで照明をONにするというものです。単純な操作なのですが、一連の経路は以下のようになっていて長い。
どうしてこんなに長いのでしょう。家の中にある照明を家の中にあるGoogle Homeを使って操作するのだから、なぜ以下のようにしないのか?(こうした説明がなかなか見つからないので苦労するんです)
この操作の中では以下のことが必要です。
- 声の情報、”RM3 command, ON”が”ON”の指令であることを知る。
- “ON”の信号パターンをRM mini 3に送る
Google Homeは、上のどちらも扱うことができません。Google Homeは実質マイクで、聞こえてくる音を外部に送り出すだけで、音から文字への変換(speech to text)は外部で行われます。したがって、Figure 2の構成にするためには、speech to text部分を家の中で処理する仕組みが必要です。
また、RM3は”ON”の信号パターンを覚えていませんので、毎回送り込む必要があります。RM mini 3は単に赤外線信号のブラスター(照射装置)です。また、Google Homeは信号を覚えておくことができません。
なんと、こんなに単純なことなのに、Figure 2のような単純な仕組みではできないわけですね。担当者がいない。(Google Home自体が言葉を解釈しているように見えるのは、Googleのマジックが成功している証拠です)
上の(1)ではspeech to textに続いて、それが指定された定型文であること(そうでなければ反応しないようになっていなければならない)、定型文内の指定位置から指定語、たとえば”ON”や”OFF”を抜き出す必要があります。speech to text部分はGoogle assistant(といっていいのか?)、指定語抜き出しはIFTTTが行っています。
(2)で使われる信号パターンも誰かが覚えておいて、必要に応じてRM3に送出する必要があります。Figure 1ではRaspberry piに担当させています。(のこる”ngrok経由”は、家の外から家の中にあるRaspberry piに到着させるためのもので、しゃべって操作という興味からすると中心にはありません)
すべて家の中で完結させるとすれば
Figure 2の、Google Homeの部分を上のオレンジの枠のものに置き換えることができれば、すべて家の中で完結させることができるかもしれない。これをやってみたい。というのが私の興味です。
興味項目は以下の通り。
- Raspberry piが音を拾えるようにする
- Speech to TextをRaspberry pi上で行う
- 構文解析して含まれるキーワード(指定語)を知る
- 信号パターンの記録と記憶
(1)はあまり難しくありませんが、初めての場合にはRaspberry piでの設定に関する勉強が少々必要です。USBマイクでもよし、Figure 3の写真はRespeaker 2-mics pi hatです。(スピーカーを駆動するアンプもボードにのっているので、専用の小さなスピーカーを接続するには便利です。音声出力ミニプラグもついているので、それがないpi zeroに音声出口を与えることもできます)
(2)ここですね。悩みどころは。完全にローカルで単体として動く仕組みのものはいまのところ精度がいまひとつのようです。そこで、Google assistantに降臨願うとか、Alexaをインストールするとか、いろいろ試してみました。どちらもSpeech to Text部分は外部に投げて結果を待ちます。Googleのほうは文が完結する以前から可能な解釈をリアルタイムで返してきます。(その様子をみるだけでも大変面白い)いまのところ、完全ローカルは少し我慢して、Text化は外部に送って実行してもらうのが実用的だと思います。
(3)は、本格的にやろうとすると、文脈の解析をすることになり非常に興味深いのですが、それはそれとして別に勉強することにして、ひとまず指定したキーワードが入っているかどうかを見るという方法でいいのではないか、と思っています。(普段の質問ではあり得ないようなことばの連結をキーワードとすれば確実性は上がるはず)
(4)これはすでにできることなのですが、前の記事のうらばなしに書いた通り、RM mini 3には内部的に少なくとも二つの亜種があるようで、手持ちの4台のRM mini 3のうち、SDKが”日本”と表示される2台しかblackbeancontrolで動かすことができなかった。先日ふとしたことから、python-broadlinkが更新されていることに気が付いて試したところ、日本、美国どちらのSDKのものもうまく動かせることがわかった。これはうれしい。失業していた2台に仕事を提供できる。
ということで、ちょっと外にお散歩することになりますが、実用的なスキームはこんな感じになると思います。
さらに考えごと
Figure 4をじっと見るとわかることなのですが、最終出口はRM mini 3でなくともよい。最初に書いたように、Google Sheetsへの記録、チャットへの投稿など、プログラム的に操作できるものならなんでもいいわけで、コンピューターのシャットダウン、温度センサーからの値の取得と読み上げ、(これにはText to Speechを使います)ミサイル発射など(マジか?)想像・創造・妄想力を発揮すればいろいろ思い浮かびます。
最初の引き金に声を使うからSpeech to Text(STT)が必要になるわけで、(チャットなどを使って)指令は最初から文字で与えるとか、スマホのSTTを使えば別の構図が考えられる(STT?そんなもの使わねえや、というなかれ。手や目が不自由な人には大変有効な入力手段なのです。多くの人が触れて、もっと発展させなければなりません)。
今回は実際の制作例をのせませんでしたが、あれこれ試していろいろわかったきたので、今見えるbird’s-eye-viewを書いておくことにしました。この記事をもとに着地記事をおいおい書くことにします。
こんな記事を書くかもしれないmemo
- Alexa direct
AlexaでコントロールできるWeMoというものがある。ESP8266ボードでWeMoもどきを作ってAlexaの子分deviceとして登録し、Alexaから直接そのdeviceへ指令が飛ぶものを作っている人がいるのを発見。まねしてみたら少なくとも言われているようには動いた。なんだ、単純指令ならこの方法が一番いいかもしれない。ということで何に使うか構想中。 - blackbeancontrolとpython-broadlinkでのRM mini 3操作について
本家のgit hubにある説明を読んでも少しわかりにくい。註がいる。