Help us understand the problem. What is going on with this article?

ATOM EchoでGoogleHomeへブロードキャストする

※ 追記:2020/06/14 録音完了後のmp3再生対応しました。

仕組み

image.png

horihiroさんのesp8266-google-home-notifierライブラリを使用しGoogleHomeへWaveファイルのURLを送ることで音声を再生できます。
WaveファイルのURLはATOM上にWebサーバーを立ち上げてWaveファイルを送信します。
WaveファイルはMhageさんのマイクからWaveファイル作成するクラスを参考にしました。

Mhageさんのesp32_CloudSpeech
https://github.com/MhageGH/esp32_CloudSpeech
Google Cloud Speech-to-Text APIを使いマイクで録音したWaveファイルをテキスト化しています。
今回はマイクでの録音からWaveファイル化する部分を参考にさせてもらいました。

horihiroさんのesp8266-google-home-notifier
https://github.com/horihiro/esp8266-google-home-notifier
https://qiita.com/horihiro/items/4ab0edf415916a2cd542
GoogleHomeへテキストからmp3を再生するURLを送ることでテキストメッセージを再生できるライブラリです。
使用方法には載っていないのですがplayメソッドを使うことで任意の音声URLをGoogleHomeに送ることができます。

コード

githubに置きました。
https://github.com/ode1022/m5atom_echo_google_home_notifier

下記ライブラリに依存しているのでgit clone等してください。
https://github.com/horihiro/esp8266-google-home-notifier
https://github.com/m5stack/M5Atom
https://github.com/FastLED/FastLED (M5Atomが依存している)
https://github.com/earlephilhower/ESP8266Audio

config.h.sampleをconfig.hにリネームし、Wifi設定、GoogleHome設定をしてください。
GoogleHomeは名前かIPのどちらかを指定します。
名前の場合はmDNSからIP探す処理が入るためIP指定のほうが3秒ほど早いです。
バッテリーで動作などする場合は起動時間を早めるためにIP指定が良さそうです。電源稼働後に1秒ほどで録音処理に入れます(Wifi接続処理に1秒はかかります)

録音完了の効果音のmp3ファイルはSPIFFSに保存しています。
mgo-tecさんの記事を参考にdataフォルダを事前にSPIFFSに書き込んで下さい。
https://www.mgo-tec.com/blog-entry-spiffs-uploader-plugin-arduino-esp32.html

macの場合はarduino-esp32fs-pluginを利用するとエラーがでるため
下記フォルダをコピー(リネームだけでもいいかも?)する必要がありました。

~/Documents/Arduino/hardware/espressif/esp32/tools/esptool/
↓
~/Documents/Arduino/hardware/espressif/esp32/tools/esptool_py/

参考
https://github.com/me-no-dev/arduino-esp32fs-plugin/issues/15

動作説明

起動後に自動で録音を初めてGoogleHomeにブロードキャストします。(ACアダプタ稼働の場合等はconfigで電源接続時に録音再生しないようにできます)
ATOM Echoのボタンを押すことで何度も録音&ブロードキャストできます。
録音時間はバッファの確保した容量に依存します(無音検知で自動終了などはしていません)

ATOM Echo上のIPをブラウザで見ることで
esp8266-google-home-notifierのTTSの機能でテキスト入力したものを音声再生することも可能です(horihiroさんのサンプル通りです)

おまけ機能としてボタンを長押しするとmp3を何度も再生できるモードになります。ボタン押すごとに再生できるので効果音を楽しめます😁

コード説明

メインのinoファイル
大まかな流れは図で書いたとおりのためコードをみると大体わかるかと思います。

Audio.cpp
Waveファイルを生成するクラスです。
音量が小さいためオートゲイン(自動音量調整)を付けました。
録音時間を長くするためにバッファサイズはなるべく確保できる大きい値を指定しています。
mp3再生(非同期再生、再生中のを停止して再生にも対応)

mp3を非同期再生するためにクラスインスタンスのメソッドをxTaskCreatePinnedToCoreに渡しているところが見どころです。
参考URL
https://forum.arduino.cc/index.php?topic=658230.0
mp3再生中に割り込みで停止して別のを再生するなども対応しました。

ATOM Echoのマイクとスピーカーは排他使用のようです。ESP32自体はI2Sは2つ使用できるのですがチャンネルを0,1で分けて利用しようとしても使えませんでした。
恐らく線が一部共用のためかと思われます。
https://docs.m5stack.com/#/en/atom/atomecho?id=schematic

I2S.cpp
I2Sでマイクの初期化処理をします。
ATOM Echo用の設定を加えました。

バッファの確保について

Audioクラスでなぜ一度に大きいサイズのバッファを確保せずに配列で分割してnewしている理由

mp3再生に使うESP8266Audioライブラリについて

公式サンプルですとESP8266Audioをソースごと丸コピーして使用していて不便そうでした。
ソースの違いを見てみましたがデフォルトのpinや一部設定が違うためライブラリを直接修正しているようです。(ライブラリ側が引数対応していないのが原因っぽい。。)
https://github.com/m5stack/M5-ProductExampleCodes/blob/a73fadf7a6ccfc089f9d727b513a0338ac5ce718/Core/Atom/AtomEcho/Arduino/StreamHttpClient_ECHO/src/AudioOutputI2S.cpp#L65
channel_format = I2S_CHANNEL_FMT_ALL_RIGHT
https://github.com/m5stack/M5-ProductExampleCodes/blob/a73fadf7a6ccfc089f9d727b513a0338ac5ce718/Core/Atom/AtomEcho/Arduino/StreamHttpClient_ECHO/src/AudioOutputI2S.cpp#L81
SetPinout(19, 33, 22)

https://github.com/earlephilhower/ESP8266Audio/blob/e59319f605d45d06ae0c6a7f983872c0366dd11c/src/AudioOutputI2S.cpp#L66
channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT
https://github.com/earlephilhower/ESP8266Audio/blob/e59319f605d45d06ae0c6a7f983872c0366dd11c/src/AudioOutputI2S.cpp#L81
SetPinout(26, 25, 22)

ライブラリ直接編集はソースを含めるのもいやなのと、最新ver追従がしずらく扱いづらいのでライブラリをそのまま利用する方向で対応しました。
AudioOutputI2Sをnewしたあとに別途ATOM Echo向けのI2Sの初期化を行うことで対応可能です。

雑記

以前にAmazon Dashボタンを押してブロードキャストするのを作りました(コード未整理)。
ESP32とI2SマイクとSDカードからのmp3再生を組み合わせましたがサイズ的にごちゃごちゃしてあまり使わず。
今回ATOM Echoが発売されたので移植したんですが小さくて良いですね。

odetarou
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした