M5Stackにお喋りさせる


R5.3.31 AquesTalkのブチッ音

 M5Stackシリーズで使うAquesTalkにはAquesTalk ESPというのがある。2種類あって、ローマ字音声記号列からの音声合成と漢字テキストから音声合成ができるもの。前者は滑らかな発音ができるものの、喋らせる文章をローマ字音声記号列に変換しなければならない。そのため用のツールがWEB上にはあるが、一目見て人間には理解しにくい。それに対して後者は、人間が使う文章をそのまま発声してくれるので見やすい。ただ、発声前後にブチッ音が出た。開発者のブログN.Yamazaki's blogには改善方法が書かれていたが、知識に乏しい私には理解不能だった。

 今回、ChatGPTを使うにあたり、再度読み直すことにした。

 そして、AquesTalkTTS.cpp(下図)を見ていたら、既に対策ことに気づいた。DAC_startとDAC_stopの関数のところで、reduce pop noize とある。ブログの説明と併せて読むと、滑らかに音量を上げたあと発声し、発声後に、滑らかに音量を下げるのだ。

 それでもあの音が出るのはどうして? 対策無ければどうなる? と疑問に思って4つのfor文外したら、ブチッ音が消えたのでした。ノイズ対策とはM5Stackの内部DACに対するものだったということか。外部に出す場合は、少なくとも私の環境では対策が逆に作用したということだな。未だきちんと理解できたわけではないけれど、理屈はどうあれ、まずい現象がなくなったのはOKです。


R4.1.16 完成

 道具箱を探したら、TDA2822というオーディオアンプと必要な部品があったので、(1)のように考えました。しかし、アンプボードを発見したので(2)に変更。8Ω1Wのスピーカも付けました。スイッチを取り付けているのは、Talkを使わないプログラムの場合はこのセットをOFFにして、電源節約。(3)では3.3Vを使っているけれど、現在は5V使用。スピーカも古いノートPCを分解処理したときに取りだし保管しておいた4Ω1Wのものが丁度いい音量になりました。(^^)

(1)(2)(3)(4)


R4.1.11 覚書

 今更だけど、ATP3011をUARTで使う時の覚書。PMOD0をLOW(GND)、PMOD1をHIGH(VCC)の「セーフモード」(何がセーフ? この辺、初心者に分かるように説明してくれるとありがたいよね )にすると、とても扱い易い。これでマイクロビットでもM5StackでもAtom等でもいける。ようやく気づきました(^^;) M5StackではGPIO17で難しいことなくSerial2が使えます。

 今回は収穫が大きかった! マイクロビットでも安定的に動作させることができましたから。

 図中、点線の配線は不必要でした。もちろん取扱説明書にあるように配線するのが原則ですが、私的には簡単にということで。


R4.1.10 M5Stackのお喋り

 M5Stackにスタックさせる「M5Stack用 AquesTalk pico LSIモジュール基板」というものをボタニックさんが作成されて、スイッチサイエンスで販売中です(^^)/ M5Stackでもできるんだ。ということで、マイクロビットに搭載していたATP3011を使ってM5Stackで鳴らしてみる実験を開始することにしました(^^)

 M5Stackでは、AquesTalkをソフトウェアで実現できるのですが、ライセンスを取得しないと発声に制限が出ることや、M5Stackのスピーカー周りに弱点があることで遠ざかってしまいましたが、ボタニックさんに勇気をもらいました(^^)/

 残念なことに、上写真のマイクロビット用基板はギリでM5Stackには入りません、残念(^^;)

 UART接続、セーフモードでボタニックさんのサンプルプログラムを使って実施。喋りました(^^)/ 有難うございます。初めは喋らなかったのだけれど、ブレッドボード上のATP3011の位置をずらしたら動作しました。ブレッドボード穴の接触不良に注意ですね、使いこんでいるのであれば...

ここで実験の様子を見れます。


R2.6.4 アバターも使えるようになってました

 いろんなものを無節操にインストールしていたからでしょうか、いろんなスタイルのM5Stack.hがあったり、Avatar.hの配置ミスやパスが通っていなかったりしたからでしょうか、コンパイルエラーが出て難儀したことがありますが、何と今回の実験でスムーズにアバタートークができてしまいました。できて勿怪の幸い、できなかった理由については目をつぶります。


R2.6.3 外部音源でアクエストーク2

 AquesTalkの声に重なるビジュー音。mp3でも起きていたのだけれど、その時に解消できた方法に倣ってやってみました。今回は、wav音声ですので、

#include "AudioGeneratorWAV.h" #include "AudioOutputI2S.h" AudioGeneratorWAV *wav; AudioOutputI2S *out;
として、
out = new AudioOutputI2S(); // Output to 外部_DAC(私の環境) out->SetOutputModeMono(true); out->SetGain(0); // 音量大きかったら小さい値にして wav = new AudioGeneratorWAV();
のセットをどこかに入れる。最初は、スケッチの方に入れたのですが、書き込まれて最初の発生はビジュー音が解消されたものの、2回目からはビジュー音入りとなりました。そこで、大元を解消しなければ無駄だと思い、AquesTalk.cppファイルに目をつけました。

 最初の方にインクルード文群を置いて、インクルードと宣言をして、out関係群を試行錯誤で置きながらコンパイルしてM5Stackの反応を見ていったところ、int AquesTalkTTS::playK(const char *kanji, int speed){...}の中に置くのが良かったのでした。ビジュー音がなくなりました。ただ、再生速度が早くなり音質が良くないような。音質は我慢して、再生速度はスケッチの方で加減ができるので良しとします。


 この結果をツイートしたら、いろいろな方々からアドバイスをいただけました。やはりAquesTalk.cppファイル中にwavのゲインをコントロールして音量を調整する記述ができるらしい。

 ということで早速やってみたところ、ゲイン0.1にすると声色の変わり方が激しくて驚きました。私の工夫を削除して、ゲイン0.1で喋らせると、なかなかいいようです。このあたり動画を作成してアップしようと思います。

ここで見ることができます。


R2.6.2 外部音源でアクエストーク

 M5Stackでmp3で聞こうと思ったら、スピーカーの音がよろしくないので、内部DACを諦め外部音源ボードを内蔵してしまいました。これは、「音楽してみる」ページの4月10日の記事に書きました。mp3はそれなりに楽しめるのですが、副作用としてAquesTalkが使えなくなりました(^^;) あれから苦節2カ月の間(感覚的にはもっとかな?)ネットで解決方法を検索してようやく本日、何気なく解決しました(^^)/ ただ、まだ課題はあるのですが。

 その覚書。

 ずっと前から気になっていた記事。これが解決方法でした。Qiitaの 1969 od さんの「ESP32で外付けDACを使う」という記事。さらに、AquesTalkについての「N.Yamazaki's blog」での山崎さんの説明。後半に、「外付けDACを使うには」として、次の3点を提示してくれています。

  1. i2s_config.modeでI2S_MODE_DAC_BUILT_INフラグを外す
  2. i2s_set_pin()で使用するピンの設定を行なう
  3. 符号無しデータに変換している処理(92行目)をしない。
 この3点について、AquesTalkTTS.cppファイルの中で変更します。ファイルの後ろの方、I2S DAC についての記述があるところ。//i2s configuration から3行目、「 | I2S_MODE_DAC_BUILT_IN」をそのまま切り取ってしまいます。これがフラグを外すこと。
 static i2s_config_t i2s_config = {....}; が終わった後に、次の項目を挿入。
static const i2s_pin_config_t pin_config = { .bck_io_num = 26, .ws_io_num = 25, .data_out_num = 22, .data_in_num = I2S_PIN_NO_CHANGE };
 これは、1969 od さんの真似をしました。GPIOは自分の環境に合わせています。

 static void DAC_create() { の中では、

//i2s_set_pin((i2s_port_t)i2s_num, NULL); i2s_set_pin((i2s_port_t)i2s_num, &pin_config);
としています。これらがピンの設定。

 最後に、符号無しデータに変換している処理(92行目)をしない。もともとのAquesTalkTTS.cppに記載があってコメントアウトされている for External SPI-DAC の行に入れ替えることで完了です。アバターと組み合わせるとコンパイルエラーが出ますが、他では今のところエラーなく動いてくれるので良しとしましょう。私にしては大進歩です。I2S-DACでなくSPI-DACなのが気になりますが。

 課題としては、音が、声がビジューという音と重なってしまい、聞きつらいことですね。これもどうにかしたいものです。


R1.11.27 ライセンスが届いた

 AquesTalkを購入したところライセンスが届きました。スケッチにキーを入れて書き込んでみると、流石に違和感なく発音してくれます。

 もちろんアクセントは不自然ですが、テキスト入力者が努力しなければなりません。


 M5StackのLCDは320×240と大きいのでいろんなものを表示できます。気に入ったのはAvatarというアプリケーションで、さまざまなものが公開されています。取りあえずサンプルに入っていたものを表示。これは、ずっと見ていると表情を変えてくれますが、ボタンを押すと吹き出しで喋ってくれます。

 ならば喋らせたいということで、マイクロビットで作ったATP3011のボードを結んでみました。ArduinoUNOではうまく喋ってくれたのですが、M5Stackでは小さくブッと鳴っただけで沈黙!

 そこで、ソフトウェアのAquesTalkを導入。同じメーカーさんですね。懇切丁寧な解説ページを読み乍ら試してみるとうまくいきました。
 AvatarのプログラムとAquesTalkのプログラムを並べて、必要なところ同士を合体するという、お手軽な方法で完了。画面表示は日本語は今のところできないので削除しました。画面下に喋る内容がスクロールといいんですけどね。今後の課題。

 あまり気がつかないのですが、評価版ではナ行とマ行がヌと発声されるようです。これなら、ライセンスを購入しようかと。

 顔があって声が出るとなかなか可愛いもんです。孫が、マイクロビットのお話を喜んでいましたので、気にいるかと思ってます。M5StackはWiFiを持っているので(持ってたよね!?)、どうにかすると自然会話ぐらいできるのではないかな?