しゃべるESP8266/ESP-WROOM-02/ESP-WROOM-32(音声合成・テキスト読み上げ)のデモンストレーションをしてみるページ。
WiFiもBluetoothもBLEも使わないなんてESPらしくはありませんが、先日のしゃべるArduinoデモに続くESP版なんていうのもありかなと。
今回は、ESP8266の内、ESP-01を使いましたが、これでいけるということは、上位モジュールESP-02〜ESP-12〜ESP-14、ESP-WROOM-02、ESP32/ESP-WROOM-32でもいけるということで。
と言いつつ、ESPシリーズの内、日本の技適を通っているのは、いまのところ、ESP-WROOM-02/ESP-WROOM-32(とこれらを搭載した開発ボード)のみですが。
ただ、ESP-WROOM-02については、わからないし、Amazonでは見かけませんが、Aliexpressなどを見ているとESP-WROOM-32については、日本の技適を通っていない(通る前の製品?)も存在するので技適マークの有無は確認した方がよいでしょう。
何れにしても最も手軽で手間がなく、限りなく悩みどころが少ないのは、開発ボードです。
Arduino IDEが利用できることは、もちろん、ESP8266やESP32をArduino IDEで使えるようにしておくこと。
ESP-01やESP-02〜ESP14などのESP8266チップなら、Arduino IDEの[ツール] => [ボード]から[Generic ESP8266 Module]を選択、ESPモジュールにスケッチをアップロードできる状態であること。
ESP32なら、[espressif/arduino-esp32]の要領でESPモジュールにスケッチをアップロードできる状態であること。
ちなみにこれらArduino IDEの環境設定で追加する方法の場合、カンマ区切りで複数指定可能。
参考までに自身の使用しているOSは、Debian(Linux)、Arduino IDEのバージョンは、1.8.6(1.8.6を素直に起動できない場合、起動方法参照)。
尚、ESP8266やESP32の開発ボードである場合、先のようにArduino IDEで利用可能にするとボード情報に様々な関連ボードが追加されるので、使うボードに適したものを選択することになるわけですが、例えば、次のようになります。
ESP8266 NodeMCUボードなら、Arduino IDEの[ツール] => [ボード]から[NodeMCU 0.9 (ESP-12 Module)]や[NodeMCU 1.0 (ESP-12E Module)]などを選びます。
ちなみにESP8266 NodeMCUボードについては、ボード上のピン番号(D0-D8)と実際のGPIOが異なるのでプログラム・スケッチを書く場合、標準でインクルードされる模様のpins_arduino.hの定義に沿って指定します。
また、ESP32 DevKitCやDevKitボードなら、[ESP Dev Module]を選びます。
開発ボードについては、あとは基本的にArduinoボードと同様にスケッチをアップロード、電源としてUSBケーブルをつなぐか、VIN(5V)/G(ND)に5Vを供給して組んだ回路を実行するだけです。
今回は、earlephilhower/ESP8266SAMのサンプルスケッチSpeak.inoをそのまま使わせて頂きました。
リンク先にもあるように、これを使うにあたり、earlephilhower/ESP8266Audioも必要とのこと。
ESP8266Audioライブラリは、機能が豊富でサンプルスケッチだけでもミキサーサンプル、PROGMEMからAAC再生、PROGMEMからDACにFLAC再生、SPIFFSからMIDI再生、PROGMEMからDACにMOD再生、SPIFFSからMP3再生、I2S DACにRTTTL再生、PROGMEMからWAV再生、HTTPからMP3ストリーム、HTTP_SPI RAMからMP3ストリーム、WebRadioと今の自身には、何を言っているのかよくわからないものもありますが、実に多彩。
そこでESP8266SAMライブラリには不要そうも、そのページにある通り、Gianbacchio/ESP8266_Spiramもgit clone( or ダウンロード・展開)しておきました。
また、例えば、ESP8266の場合、Arduino IDEの[ツール]メニューから[lwIP]を[v1.4 Open Source]か[V2 Higher Bandwidth]、CPU Frequencyを[160MHz]にする必要があるとのことなので、それぞれデフォルトの[V2 Low Memory]から[V2 Higher Bandwidth]、[80MHz]から[160MHz]に変更してみました。
ESP8266Audioには、ESP32も対応しているかのような記述もあり、試してはいませんが、ESP8266SAMもそのままいけるのかもしれません。
前述の通り、今回のケースでは、WiFiモジュールはどれでもよいですが、ESP-01を使いました。
今回使ったスピーカーは、100均セリアで買った1つでモノラル、2つでステレオになるというもの、USBケーブルもセリア、Nano互換機は、Amazonマーケットプレイス直で買ったもので全部で800〜900円といったところかと。
スピーカーを使う場合、スピーカーにつながっているステレオ(ミニ)プラグの根元にマイナス、他の極にプラスをつなげば、音を出す準備は完了。(電源を要するものは電源も入れる。)
出力については、スピーカーでなくとも、ヘッドフォンやパッシブブザーでもいけますが、圧電ブザーを使う場合は、ワニグチクリップは不要な代わりに別途ブレッドボードが必要となったり、スケッチに該当するプログラム行の追記が必要になります。
また、ヘッドホンだと聴こえすぎるほど大きく、スピーカーは、少し小さいが聴こえるには聴こえる、一方、ブザーだと耳を当てないと聴こえないほど、ちょっと音が小さいのでトランジスタを噛ませた方がよいかもしれません。
ESP32開発ボードを使う場合には、FTDIシリアルUSB変換モジュールやminiUSB-USB Aケーブルは不要な一方、microUSB-USB Aケーブルが必要。
ESP-01や開発ボード以外のESP-12Fにプログラムをアップロードするには、USBポートを備えたCP2102やFTDI系のシリアルUSB変換モジュールを併用する必要があります。
尚、USBポートを備えた開発ボードではないESP-01〜ESP-14単体及びブレイクアウトボード(≒ピッチ変換基板)との組み合わせは、全て同様にシリアルUSB変換モジュールを要します。
ESP-01の定格電圧は3.3VなのでシリアルUSB変換モジュールも3.3V専用か3.3V/5V兼用なら3.3Vに切り替えて接続します。
尚、ESP-01や開発ボード以外のESP-12Fは、プログラム書き込み時と実行時、ESP-01では、RSTとGPIO0のHIGH/LOWを巧みに切り替える、ESP-12では、GPIO00/GPIO15をLOWにする一方、実行時には、GPIO00はHIGHにしておく必要がありますが、RTS/DTRピン(ホール)のあるFTDIモジュールなら、これらにESP-01のRST/GPIO0をそれぞれ、ESP-12ではRESETを接続することで自動でアップロードできる為、これを使うことをおすすめします。
ただ、これらRTS/DTR、ブレッドボード上でピンホールにジャンパワイヤを挿す場合、ピンヘッダや3.3V/5V切り替え用ジャンパピンのハンダ部が隆起しているのですが、ピンホールが、この付近にある為、USBシリアル変換モジュール並びに挿したジャンパワイヤを手でうまく押さえる必要はあるでしょう。
なんなら、手で持った方が、安定するでしょう。
ちなみにESP-01については、SPIFFSを使おうにもフラッシュメモリ容量の関係でArduinoOTAは難しい模様。
ESP-12 | FTDI | 別電源 |
---|---|---|
RX | TX | - |
TX | RX | - |
RESET | RTS | - |
GPIO00 | - | マイナス |
GPIO02 | - | プラス |
GPIO15 | - | マイナス |
CH_PC | - | 3.3V |
VCC | - | 3.3V |
GND | マイナス |
ESP-01 | FTDI | 別電源 |
---|---|---|
RX | TX | - |
TX | RX | - |
RST | RTS | - |
GPIO0 | DTR | - |
CH_PD | - | 3.3V |
VCC | - | 3.3V |
GND | マイナス |
また、パソコンのUSBは最大500mAと大丈夫そうに思えるし、実際、たいていの場合、書き込みできますが、往々にしてWiFiモジュールは多くの電流を必要とすることがあり、ESP8266も300mAを超えることもあるとのことなのでそれらが要する電流量不足やパソコンのUSBポートの損傷回避などを考慮し、実行時はもちろんのこと、書き込み時も念の為、別電源をとった方がよさ気。
尚、検証・運用時には、元電源が3.3Vだと過電流により2V程度まで電圧降下し、ESP8266にリセットがかかり、WiFi接続が途切れるなどの状況になる可能性があるので5Vから降圧、更に電圧降下に耐え得るよう、より短時間で通常電圧に戻る負荷過渡応答特性に優れた電圧レギュレータを使う必要がありそう。
全ての回路で同じとは限りませんが、とある回路を作って9V電池で動かしてみたところ、7V切ったあたりで動作が不安定になり、電池を交換したら正常になりました。
ただし、これは、ESP-01やESP-xx+ピッチ変換基板での話であって、開発ボードについては、何らかの対策が講じられているようで、この必要はなさそうです。
ESP-01/ESP-12 | スピーカー ヘッドホン 圧電ブザー | 別電源 |
---|---|---|
RX | プラス | - |
TX | - | - |
GPIO0/RESET | - | (マイナスでリセット) |
-/GPIO00 | - | プラス |
CH_PD | - | 3.3V |
VCC | - | 3.3V |
GND | マイナス |
スケッチは、ESP8266SAMライブラリのサンプルスケッチSpeak.ino。
ESP-01の信号出力用ピンには、ESP8266Audioライブラリの説明にある通り、RXピンを使いました。
シリアルモニタで確認するわけでもない為、運用・実行時には、USBシリアル変換モジュールは、不要。
配線すれば、再生されるはずですが、そうでない場合には、リセットします。
Speak.inoについては、Arduinoのデモと比べると雑音が多いようで、かなり聴き取りづらい感は否めありませんが、確かに"Can you hear me now?"、"I can't hear you!"と言っているようです。
ここで入れたESP8266Audioライブラリのサンプル動かないなぁ...、イマイチ回路もわからないし、...他に何か必要なのか?と思いつつ、ぐぐっていると...kghrlabo/esp32_simple_wav_playerを発見し、試させて頂くことにしました。
ただ、このesp32_simple_wav_playerライブラリ、ページ末尾にLicenseがTBD(≒「未定」≒「決め兼ねている」≒「後で決める」という意味らしい)とあったので、なんとなく、新たにページを起こすのは控え、ここに追記することにしました。
と言ってもESP8266AudioにもあったのでGPIO25/GPIO26が出力なのもスピーカーやヘッドホンのオーディオプラグの接続もわかるが、やはり、回路がイマイチよくわからないと思っていた中、github.com内を眺めていて目に止まったh-nari/ESP32_bt_speakerの後段にある回路が明快で、そのままいけそうだったので使わせて頂いたところ、ESP32とkghrlabo/esp32_simple_wav_playerで再生できました。
結果、日本語で「これは、4KHzのモノラル、これは、8KHzのモノラル、これは、16KHzのモノラル、これは、22.05KHzのモノラル」という音声が繰り返されました。
コンデンサには、0.1μFではなく、1μFを、2K(202)の半固定抵抗は、中央あたりにし、調整した際の差異は、よくわからなかったのですが、いずれにしても、4KHzはロボットっぽいものの、それ以外は、人間の女性らしい自然な声ではっきりと再生されるのを確認できました。
よって再生するにあたり、音声フォーマットからテキスト変換後、16進数に変換できれば、言語は関係なさそう。
ちなみに音声合成やテキスト読み上げは、Speech Synthesisだけでなく、Text to Speechもキーワードにして検索してみるのがよさ気。