Google Home と M5Stack と スマホ で双方向リアルタイム日本語通信する実験

M5Stack

Arduino core for the ESP32 のインストール

Arduino IDE は 1.8.7 で動作確認しています。

Arduino core for the ESP32 ( 以下 Arduino – ESP32 )は、Stable 1.0.0 で動作確認しています。
インストール方法は以下の記事を参照してください。

Arduino core for the ESP32 のインストール方法

自作ライブラリ最新版のインストール

私の自作ライブラリをインストールします。
最新版の、beta ver 1.0.65 をインストールしてください。
GitHub の以下のリンクにあります。

https://github.com/mgo-tec/ESP32_mgo_tec

※古いバージョンのライブラリはフォルダごと削除してから再インストールしてください
※BOSCH 製 BME280 および BME680 ドライバライブラリをインストールされていない方は、ESP32_mgo_tec ライブラリの中の Sensor フォルダを削除してください
Windows 10 の場合、以下のパスになります。

C:\Users\__user_name__\Documents\Arduino\libraries\ESP32_mgo_tec-master\src\ESP32_mgo_tec_bV1\Sensor

GitHub から ZIP ファイルをダウンロードして、Arduino IDE にインストールする方法は、以下の記事を参照してください。

GitHubにある ZIP形式ライブラリ のインストール方法 ( Arduino IDE )

google-home-notifier ライブラリのインストール

ほりひろさん作の esp8266-google-home-notifier という素晴らし過ぎるライブラリを Arduino IDE にインストールしておいてください。
esp8266 とあっても、M5Stack および ESP32 で動作します。
バージョンは以下で動作確認しています。
esp8266-google-home-notifier ver 1.0.6
esp8266-google-tts ver 1.0.6

使い方は以下の記事を参照してください。

ESP32 および M5Stack で Google Home を自発的に喋らせる実験

Firebase Realtime Database とスマホで、M5Stack と連携できるようにしておく

以下の記事を参照して、Firebase Realtime database とスマホで、M5Stack と連携できるようにしておいてください。

Firebase Realtime Database のデータ保存、取得、ストリーミング受信実験( ESP32 , M5Stack )

Firebase Realtime Database をスマホで操作およびストリーミング受信する実験

Firebase Realtime database を使った ESP32, M5Stack, スマートフォン相互通信してみる

クラウドサービスの Firebase に登録したり、Arduino core for the ESP32 をインストールしたり、micro SDHC カードに日本語フォントを保存したりする作業があります。
Firebase については、Google Cloud Platform よりは格段に簡単です。

Firebase Realtime Database のユーザー階層を新たに作成し、ルールも追加してアクセス制限をかけておく

今回の実験用に、Database の新たなユーザーを作成しておきます。
下図のように、ここでは例として test_user2 というユーザー階層を作成しておきます。

次に、データベースのルールを下図の様に付け加えます。
ユーザー UID は新たに生成しても良いのですが、ここでは以前の記事で作成した UID を使い回して、test_user2 にも test_user1 と同じアクセス権限を与えておきます。
以前作ったユーザー名 test_user1 を消さずに test_user2 を追加する場合、カンマを入れて追加します。
xxx の所をご自分で作成したユーザー UID に書き換えてください。

{
  "rules": {
    "test_user1": {
      ".read": "auth.uid === 'xxxxxxxxxxxxxxxxxxxxxxxx",
      ".write": "auth.uid === 'xxxxxxxxxxxxxxxxxxxxxxxx'"
    },
    "test_user2": {
      ".read": "auth.uid === 'xxxxxxxxxxxxxxxxxxxxxxxx'",
      ".write": "auth.uid === 'xxxxxxxxxxxxxxxxxxxxxxxx'"
    }
  }
}

IFTTT に登録して、Applets を作成できるようにしておく

初めて IFTTT を使う方は、以下の記事を参照して、IFTTT で Google Home に指令できるように準備しておいてください。
そして、IFTTT の使い方に慣れておいてください。
慣れると簡単です。

Google Home Mini を使って、声で ESP32 の LED を光らせてみた

IFTTT で Applets を作成する

では、今回の IFTTT の Applets を作成していきます。

message 保存用 Applets の作成

まずは、Google Home で喋ったメッセージを、Firebase Realtime database へ保存する Applets を作成します。

IFTTT で、New Applet をクリックし、「 this 」を選択し、Google Assistant を選択します。
そうしたら、下図の一番右を選択します。

次に、下図のように入力していきます。

入力する時、#と$の記号は半角です、ご注意ください。
そして、#と$の記号の前後には半角スペースを入れることを忘れないでください。
Language は Japanese を選択してください。

次に「 that 」を選択し、「 Webhooks 」を選択して、下図の様な設定にします。

ここで、URL欄では、ご自分のデータベース Host URL と、先ほど新たに作成したユーザー名、そして、Firebase のデータベースシークレットを合わせた URL を入力します。

まず、Host URL と ユーザー名 URL は Firebase Realtime database の下図のようなところにあります。

そして、先ほど作成したユーザー名( test_user2 )と、データベースシークレットを合わせると以下のようになります。
xxx… のところがご自分のデータベースシークレットです。

https://my-test-pj01.firebaseio.com/test_user2.json?auth=xxxxxxxxxxxxxxxxxxxxxxxxxxxx

これはつまり、Google Home から喋ったキーワードが、管理者権限で Firebase のデータベースを書き換えてしまうことを意味しています。
データベースシークレットの管理は十分気を付けたいところですね。

そして、Body 項目は、以下のように入力してください。

{"message{{NumberField}}":"{{TextField}}"}

ここで、注意して欲しいのは半角スペースを入れないことです。
「Add ingredient」ボタンで入力しても良いのですが、半角スペースが入ってしまうので、その場合は削除しておきます。

全て入力出来たら、「Create action」ボタンを押してください。

color 用 Applets の作成

上記と同様に、文字の色を変える color フィールド用の Applets を作成します。
color フィールドを書き換える音声コマンドは、本来は、

「OK. Google」
「メッセージ1番、カラー緑」

という指令にしたかったのですが、この場合、先に作成した、message コマンドと最初の言葉が被ってしまうのです。
ですから、コマンドは

「カラー1番、緑」

という風にしました。
実は、これ、自分自身で言う時に何度も間違えました。
とっさに出てこないコマンドですね。
慣れが必要です。

ということで、Google Assistant 側は下図のようになります。

そして、Webhooks 側の設定は下図のようになります。

speed 用 Applets の作成

同じように、今度は文字スクロール速度調整用 speed フィールドの Applets を作成します。
コマンドは

「OK. Google」
「スピード1番、90%」

というようにします。
Google Assistant 側は下図のようになります。

そして、Webhooks 側の設定は下図のようになります。

以上で、IFTTT 側の設定は終わりです。
これで、Google Home の音声入力で Firebase Realtime database のデータを書き換えることができます。

データベースシークレットを使っているので、管理者権限でアクセスしています。
ですから、color や speed フィールドを作成していなくても、最初に紹介した動画のように Google Home に喋れば、フィールドも作成されます。

では、次では M5Stack のスケッチ(プログラム)を紹介します。

コメント

  1. juchang より:

    mgo-tec 様

    「凄い!」の一言では済まされない私の何十倍もご苦労をされた事と思います。
    どうにか動作確認させていただきました。
    初心者のトラブルであまり参考になりませんが成功までの経緯を報告させていただきます。
    1. コンパイルエラー
     ESP8266-google-tts ライブラリーのインストール忘れによりコンパイルエラーとなる。
    2. 15行目、データベースシークレットの入力ミス
     auth.uid と勘違いして入力したためデータ転送ができない。
    3. 38行目、const char displayName = ” デバイス名 ” を見落とし
     Google Home との接続ができない。
    後は、テキスト通りの入力で動作OKです。
    これからも素晴らしい作品の発表をお待ちしております。

    • mgo-tec mgo-tec より:

      juchangさん

      いつも動作させていただき、本当に感謝しております。

      そうなんです!
      これは、パッと見た目は地味ですが、実は凄いんです!!!
      凄いんですけど、Twitter での評判はイマイチでした。
      これの凄さは、実際に自分で動作させてみて分かるんです。
      その点、juchangさんに試していただいて、ホントに嬉しいですね。
      (^^)
      これを応用すれば、とんでもないことができそうですよね!

      ところで、コンパイルエラーやデータベースシークレット、Google Home のデバイス名などは、スルーしてしまう人がいると思います。
      記事を修正して、強調表示しておきたいと思います。

      ご指摘ありがとうございました。
      今後とも、よろしくお願いいたします。
      m(_ _)m

      • mgo-tec mgo-tec より:

        juchangさん

        写真を投稿いただき、ありがとうございます。
        バッチリですね。
        ケースがコンパクトになっていて Good ! です。
        これなら、M5Stack 要らずですね。
        こんな風に作っていただけるとは、メチャメチャ光栄です。
        皆さんに見て頂くために、このコメント欄に貼らせていただきますね!
        (^^)
        jcg_googlehome_firebase_m5stack01.jpg

        • juchang より:

          mgo-tec 様

          早速掲載いただきありがとうございます。

          「 よく解りません 」「 お役に立てそうにありません 」
          我が家の Google Home はなかなか相手にしてくれません。
          メッセージ1番が一番繋がるように感じるのですが気のせいでしょうか。
          「 サンキューベリマッチ 」と発声すると、アルファベットが表示され、「 サンクスベリマッチ 」と応えてくれます。
          秋の夜長、なかなか寝付けそうにありません。

          • mgo-tec mgo-tec より:

            juchangさん

            こちらこそ、いろいろありがとうございます。

            Google Home は IFTTT を使うと認識率が下がります。
            ご存知だと思いますが、Dialogflow を使うと格段に認識し易くなりますが、設定がとても面倒で、テストモードでしかできません。
            IFTTT は設定が「簡単」ですから、結局は「IFTTT でいいや」っていう感じですね。
            IFTTT の使い方のポイントは、IFTTT が認識し易いようなフレーズにご自分で設定するしかありません。
            例えば、
            「M5Stack メッセージ1スピード50」
            という設定にしても認識してくれません。
            最初の単語フレーズに、世間的によく使われる単語にするところがポイントです。
            Dialogflow では M5Stack は認識してくれますが、IFTTT はダメでした。
            また、最初に「メッセージ」が入ると、カラーなのかスピードなのかを認識する時間がかかって、認識できなくなるようです。
            ですから、
            「スピード1番50パーセント」
            というように工夫して IFTTT が認識してくれるように設定しなければなりません。
            ご自分が Google Home に喋る「喋り方」もいろいろ工夫しなければならないところが、ちょっと面倒です。

            そして、IFTTT の欠点として、Applet を修正すると、5~10分は反映されませんので、気長に待つことです。
            待てなければ、Applet を削除して、新たに作り直すと時間が短縮されます。

            また、私も「メッセージ1番」が一番よく繋がりますが、カラーが認識しない場合、「色」というフレーズ Applet も作って置くと良いかもしれません。
            いずれにしても、IFTTT は簡単ですが認識悪いということで割り切るしかありませんね。

  2. マッキー より:

    お世話になります。
    動作はほぼ動作してるのですが、2,3うまくいきません。
    1 color1番 赤と言うとメッセージ1番に「赤」と入り、redと変換して  くれない。メッセージとスピードは所望の動作しております。
    2 9841でそっくりさんを作ったのですがボタンABCが押されたままとなります。もちろん
    const uint8_t buttonA_GPIO = 35;
    const uint8_t buttonB_GPIO = 34;
    const uint8_t buttonC_GPIO = 25;
    宣言してもダメです。ソースコードでは記述がないのでたぶんM5stackの
    ライブラリーでやっておられると思いますが、9841で動作できる改善方法を教えてください。

    • mgo-tec mgo-tec より:

      マッキーさん

      いつもブログご覧いただき、そして試していただき、ありがとうございます。
      ところで、9841 とはいったいどのボードでしょうか?
      おそらく、ILI9341 ボードのことだろうと思いますので、それでお話を進めさせていただきます。

      まず、1番の回答:
      記事の文章でも注意事項として書いてありますが、IFTTT の Applets を入力する時に、自動的に半角スペースが入力されてしまう場合があるので、Applets の Body 部分に半角スペースが入っていないか再度確認してみてください。
      そして、シリアルモニタをみて、しゃべった単語が以下のように、半角スペースが一切無く変換されているか確認してみてください。

      data: {"path":"/","data":{"color1":"赤"}}
      

      私の場合は、赤の前に半角スペースがあって、検知してくれないことがありました。
      その場合は、たいてい、IFTTT の Applets の Body に半角スペースが入っています。
      あとは、color と 1 の間にスペースが入っていて、color1 フィールドにメッセージが入らないことが考えられます。

      その他、Google 192-211行で、Firebase に入力された単語とif文で条件分けする単語が合っているか、再確認してください。
      半角スペースが入っている場合はそれを含めて見直してみて下さい。
      Google Home からは、単語ごとに半角スペースが入って来ますので、そこも注目しておくと良いと思います。
      Firebase の「赤」が入っているのに、[red]と変換してくれないのは、半角スペースが原因の可能性があります。

      2番の回答:
      申し訳ございませんが、ここの記事では M5Stack で使うこと限定で書いています。
      別途 ILI9341 ボードを使う方用にはプログラムを組んでおりません。
      ライブラリも M5Stack 用です。
      ですから、ILI9341 ボードで組みたい場合は、以下の記事
      https://www.mgo-tec.com/blog-entry-select-box-news-m5stack-esp32.html/5#title11-4
      のサンプルスケッチを参考にして組んでください。
      当記事のサンプルスケッチにこの記事の4-16行を追加し、46-47行をこの記事の60-69行(65行は不要)に挿し替えれば動くかもしれません。
      そして、ボタンが押されているということは、GPIO入力が常時 GND レベルになっているということですので、回路に問題があるかもしれません。
      テスターで測りながら、ボタンが押されていない時の GPIO 入力は 3.3V。
      ボタンが押されたときのGPIO入力が 0V になっているか確認してみてください。
      それぞれのボタンが独立して電圧レベルが変化していることが重要です。
      どこかのボタンが押されたら、他のボタンの GPIO 入力が変わってしまう場合は、回路が間違えているということです。

      とりあえず、これでもう一度ご確認ください。

タイトルとURLをコピーしました