韓国のSTREET WOMAN FIGHTERを観てビヨンセのRun The World(Girl)が頭から離れなくなって困っていますw

この続きになります


さて、どうやってTTSさせる?

まぁそんなことはいいとして、最初に思いついたのがGoogleTTSを使った方法です。

上のブログは予め読んでいたので、このライブラリを使って生成したURLをESP8266AudioのストリーミングURLに食わせればTTS完了っと

うはwwよゆーじゃんwww

っと思ってた時期もありました。

が…実際にやってみると再生はするんですがストリーミングが止まらずノイズを再生し続けてクラッシュします。ESP8266Audioのissuesにも載っていました。

理由はわかりませんが、どうやらGoogle TTSの仕様のようなので諦めます。代替のサービスを探しているとSound Of Textというものを見つけました。


Sound Of Textとは

web上でテキストを入力してmp3を生成できるサイトです。どうやら生成にはGoogleTTSを利用しているようで、そこそこ有名らしいです。多言語対応という点で〇。実際生成したURLをESP8266Audioに食わせてみた(https->httpへ変えた)ところ、ちゃんと再生できていました。イケそうです!

しかもこのサイトはAPIを公開しています。

流れとしては

  1. POST /soundsでID取得、mp3生成要求
  2. GET /sounds/:idでmp3のURLを取得
  3. URLをESP8266Audioに渡してストリーミング再生

です。一つずつ実装していけば大丈夫そうです


HTTPSリクエストの準備

JSONでリクエストしてJSONで受け取るので、そんなに難しくはないですが、このAPIはhttpsなんですよね…ダメもとでhttpに変えてRESTでリクエストしてみたところ

308 Permanent Redirectでhttpsにリダイレクトされています。ということは結局、ESP32でhttps接続をしないとならないです。esp32でhttps接続は遅いし、証明書は入れとかないとダメとかで、気が進みませんが仕方がありません。

ESP8266の時もhttpsでいい思い出がありません…ハァ…まずはルート証明書を取得することから始めます。

上の記事を参考にSoundOfTextの証明書をブラウザから取得します。ちなみに私はESETのウイルス対策ソフトを入れているのですが、証明書がESETになっており、本来の証明書ではないものを使ってハマり時間が溶けました

ほかのウイルス対策ソフトはわかりませんが、上の記事を参考にESETであれば無効にしときましょう。

後から知ったのですが、上の記事の「WiFiClientSecure用の簡単な証明書の取得方法」でルート証明書を取る方法の方が簡単でいいです。先にこの記事を読んでれば…とりあえず取得できた証明書は以下です。


再生コードの実装

めんどいので、いきなり全コードいきますw、SPIFFSには0004.mp3と0001.mp3を入れときます(効果音ならなんでも)

一応、コードのベースはESP8266AudioのサンプルソースのStreamMP3FromHTTP.inoに付け加える感じで書きています。各種コールバックは邪魔なら消してもOKです。ログが汚れるのでコメントアウトしています

サンプルと違うところは、loop()ではなく別タスクを用意してそれをTTS専用として動かしています。メインでは地震監視処理と画像合成を行う予定の為、別タスクにしました。マルチタスクについては以下の記事を参考にしてください。

ttsのみさせる場合はloop()に直書きでもokと思います。

ESP8266Audioで用いる変数でメモリリークが発生してしまうようなので再生完了後はdeleteさせる必要があります(Closeさせてdeleteしている部分)

ストリーミング時のバッファサイズは大きければより安定しますので、PSRAMがあるESP32-wroverシリーズでは積極的にPSRAMに確保したほうがよさそうです。PSRAMなら遠慮なしに確保できますね

スピーカーやI2SDACの接続は前の記事の接続編を読んでください。うまくいけば下のように再生できると思います。TFTやらSDカードついてますがTTSだけなら不要です

投稿者 まる

Twitter : @dinagon Instagram : @d_dinagon フォロバします!!最近、ESP/Arduinoいじりすぎでアプリ開発が進んでない。歯医者なのに歯のことはあまり触れませんw