概要
一年前にESP32の1.0.3で動作確認をしていましたが、一年経過して環境が変わっているので、再度検証し直しました。ざっくりと今のバージョンのArduino IDEとESP32 1.0.4だと前回方法では利用できなくなっています。
※公式にてこの記事の内容を一部取り込んでいただきライブラリを更新していただけました。下記のブログに公式版の利用方法があります。このブログの内容も公式ライブラリの導入に変更してあります。
AquesTalkの仕組み
AquesTalkのライブラリはソースコードが公開されておらず、コンパイル済みのファイルをリンクする形で利用します。Arduino IDEでプリコンパイルという機能があり、それを利用していたのですが、最近バージョンがあがってAVR向けのバグフィックスで利用できなくなってしまいました(涙)
もともと、Arduino UNOなどが利用しているAVR環境のためのArduino IDEなので、AVR環境のためなら互換性壊しちゃいますよねー。
対処法
上記のAVR向け改修のPRで、ESP32が影響を受けると報告があり、修正方法もかかれています。
それに伴い、上記のPRで修正されたはず、、、なんですが検証したら書き換える場所間違えている(涙)
そのうちなおるとおもいますが、結局のところESP32 1.0.5が出ない限り修正されません。1.0.4から一年ぐらい経過しているので、そろそろあージョンアップしそうなんですけれどね。
platform.local.txt作成
ビルドオプションが変更された関係で、ESP32ではplatform.txtの更新が入っています。同じ修正を入れることで動くようになるのですが、platform.txtの編集は推奨されておらず、差分をplatform.local.txtに書くことが推奨されています。
- C:\Users\%username%\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4
Windows環境の場合には上記のPathにplatform.txtがありますので、platform.local.txtを作成して差分を追記します。
compiler.libraries.ldflags= recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} -Wl,--start-group {object_files} "{archive_file_path}" {compiler.c.elf.libs} {compiler.libraries.ldflags} -Wl,--end-group -Wl,-EL -o "{build.path}/{build.project_name}.elf"
一行目はプリコンパイラが指定されていない場合、エラーにならないように空文字を設定しています。2行目で{compiler.libraries.ldflags}が追記になっています。
この設定をすることで、従来のプリコンパイラを使っていたライブラリがコンパイルできるようになります。ESP32 1.0.5などがでれば、この設定がデフォルトで入っているはずです。
※1.0.5がリリースされましたが、まだplatform.local.txtを作らないと動きませんでした
AquesTalkライブラリの導入方法
※公式からライブラリが提供されたので内容を変更してあります。
AquesTalk ESP32の最新のファイルをダウンロードしてください。
次に、Arduino IDEを起動して、「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール」から、先程保存したZIPファイルを選択すると導入完了です。
スケッチ例
こちらのスケッチ例は公式ではなく、私が作成したものへのリンクとなります。
hello_aquestalk
- https://github.com/tanakamasayuki/aquestalk/blob/master/examples/hello_aquestalk/hello_aquestalk.ino
公式スケッチ例をベースにした例です。最底辺の変更しかしていませんが、呼び出している関数が現在非推奨なので、他の例を使ってください。
hello_aquestalk_dac
DAC出力の例です。GPIO25かGPIO26にアナログスピーカーが接続されている場合で、M5StackやM5StickCにスピーカーHATをつなげた場合が該当します。ただし、この2機種は個別に画面付きのスケッチ例があります。
hello_aquestalk_dac_M5Stack
M5Stack(BASIC, GRAY, FIRE)のアナログスピーカーを利用した例です。ボタンを押すことでボイスが再生されます。音は悪く、大きいです。
hello_aquestalk_dac_M5StickC_SpeakerHat
M5StickCにスピーカーHATを接続した場合の例です。こちらも3つのボタンを押すと異なったボイスが再生されます。音は非常に悪いです。
hello_aquestalk_i2s_M5StackAtomEcho
ATOM Echo内蔵のI2Sスピーカーを利用した例です。I2Sはやっぱりきれいです。ボタンが1つしかないので、押すたびに異なるボイスになります。
hello_aquestalk_i2s_M5StackCore2
M5Stack Core2の例です。ECHOよりスピーカーサイズが大きいので一番安定していると思います。タッチパネルを利用したボタンの処理が入っています。
M5Stack Core2でAquesTalk動かすテスト pic.twitter.com/HWT2dVPaqq
— たなかまさゆき (@tnkmasayuki) October 19, 2020
上記が動作例です。
音声の変更方法
上記本家サイトから音声の指定文字を生成できます。
音声合成エンジンをAquesTalk picoに設定して、読み上げる文字を入力して「Convert」を押すと下に文字列が生成されます。こちらの文字列を再生させることで読み上げが実現できます。
発話速度について
int iret = CAqTkPicoF_SetKoe((const uint8_t*)koe, 100, 0xffffU);
上記の100が速度で50-300(%)が指定できます。
// Set Speed(8000:Yukkuri, 12000:Normal) DAC_Create(8000);
上記でも変更できます。こっちはサンプリングレートなので、本来固定値のほうが正しいです。ただ、初期サンプルは8Kを3倍した24Kだったのですがどうも早いので、8Kにしています。こっちを触ると音の高さも変わってしまうので注意してください。
AquesTalkのライセンスについて
AquesTalk ESP32は有償の商品であり、利用するためにはライセンスを購入する必要があります。ただし無償の評価版があり、「ナ行、マ行」の音韻がすべて「ヌ」になる制限がありますが、試してみることができます。
ROMバージョン
AquesTalk pico LSIという、28pin DIPもしくは32pin TQFPの製品もあります。AquesTalk ESP32はMAC Addressに対応したライセンスで、いろいろな本体で開発をしていると、台数分だけライセンスが必要になります。
AquesTalk pico LSIはUART/I2C/SPIで通信をすることで、音声出力をすることができます。別途スピーカーなどが必要になりますが、M5StickCにスピーカーハットを使うよりは、LSIを使ったほうが高音質なシステムになると思います。M5Stack Core2やATOM EchoだとAquesTalk ESP32からのほうが音質がいいと思います。
まとめ
突然の仕様変更で使えなくなってしまったプリコンパイルですが、次回のバージョンアップで復活するかな?
現状はplatform.local.txtを利用する必要があるので、ちょっと面倒ですよね。AquesTalk自体は非常にすぐれた製品で、使い勝手もいいのですがちょっとライセンスが本体に紐付いているのと、LSIに比べて高いので手が出にくいかもしれません。
コメント
アクエストの山崎です。
様々な音声出力環境でのサンプル、とても参考になります。ありがとうございます。
当サイトを参考にさせていただき、Arduino IDEのライブラリ形式に準拠したAquesTalk ESP32(Ver.2.1.1)を当社サイトにアップロードしました。
また、サンプルプログラム”hello_aquestalk_dac_M5Stack”をベースに、I2S周りを一部修正して、使わせていただきました。
ありがとうございます!
非公式版からスケッチ例以外を消して公式ライブラリを使ってもらうように修正させていただきました。
ありがとうございます。参考にさせていただきました。
Macの場合は、platform.txtの置き場は以下でした。
/Users/(ユーザ名)/Library/Arduino15/packages/esp32/hardware/esp32/1.0.6/
ありがとうございます
Macは古いバージョンしか持っていないのであまり試せていません