Aquestalk ESP32音声合成を試す
組み込み機器で簡単に音声合成で発話するには、秋月電子で販売されている音声合成ICを使うのが大変便利でした。
これは株式会社アクエストさんの製品で、ICはAVRマイコンATmega328Pです。内蔵クロックで動作するし外付け部品はオペアンプとスピーカーで簡単な回路を付ければ十分実用になります。
ESP32でもこれを接続すれば簡単に音声合成機能を持たせることができますが、せっかく高速32ビットCPUを搭載しているCPUなので、できればソフトウエアシンセサイザーにしたいところです。
株式会社アクエストさんには、AquesTalk ESP32 という音声合成エンジンがちゃんと用意されています。
いろんな種類の中で、
「 AquesTalk ESP32 : Espressif Systems製のマイクロコントローラ ESP32用の音声合成ライブラリです。AqKanji2Koe-MとAquesTalk picoエンジンが移植されており、漢字を含むテキストからの音声合成ができます。」
というのがあります。これちゃんと使うにはライセンスが必要ですが、ライセンス無しの評価版で使う分には発話が少々不正確になるようになっているようです。
ArduinoかEspressif IDFから使えるライブラリが配布されていますので、以下のサイトを参照してインストールする必要があります。
https://www.a-quest.com/products/aquestalk_esp32.html
今回はArduino IDEから、スケッチ例のサンプルプログラムを使ってみましたが、そのままではうまく動作してませんでした。
先の説明サイトは、Arduino IDE 1.xx 、Arduino Core も1.06 までの説明のようで、最新のArduino IDE 2.xx、 Arduino Core 2.xx の環境ではサンプルを書き換える必要がありました。
コンパイルすると分かりますが、deprecated のワーニングが出ます。 I2S_COMM_FORMAT_I2S_MSB の定義に関してのメッセージですが、これが書かれている i2s_types.h には以下のように書かれています。
/** * @brief I2S communication standard format * */ typedef enum { I2S_COMM_FORMAT_STAND_I2S = 0X01, /*!< I2S communication I2S Philips standard, data launch at second BCK*/ I2S_COMM_FORMAT_STAND_MSB = 0X02, /*!< I2S communication MSB alignment standard, data launch at first BCK*/ I2S_COMM_FORMAT_STAND_PCM_SHORT = 0x04, /*!< PCM Short standard, also known as DSP mode. The period of synchronization signal (WS) is 1 bck cycle.*/ I2S_COMM_FORMAT_STAND_PCM_LONG = 0x0C, /*!< PCM Long standard. The period of synchronization signal (WS) is channel_bit*bck cycles.*/ I2S_COMM_FORMAT_STAND_MAX, /*!< standard max*/ //old definition will be removed in the future. I2S_COMM_FORMAT_I2S __attribute__((deprecated)) = 0x01, /*!< I2S communication format I2S, correspond to `I2S_COMM_FORMAT_STAND_I2S`*/ I2S_COMM_FORMAT_I2S_MSB __attribute__((deprecated)) = 0x01, /*!< I2S format MSB, (I2S_COMM_FORMAT_I2S |I2S_COMM_FORMAT_I2S_MSB) correspond to `I2S_COMM_FORMAT_STAND_I2S`*/ I2S_COMM_FORMAT_I2S_LSB __attribute__((deprecated)) = 0x02, /*!< I2S format LSB, (I2S_COMM_FORMAT_I2S |I2S_COMM_FORMAT_I2S_LSB) correspond to `I2S_COMM_FORMAT_STAND_MSB`*/ I2S_COMM_FORMAT_PCM __attribute__((deprecated)) = 0x04, /*!< I2S communication format PCM, correspond to `I2S_COMM_FORMAT_STAND_PCM_SHORT`*/ I2S_COMM_FORMAT_PCM_SHORT __attribute__((deprecated)) = 0x04, /*!< PCM Short, (I2S_COMM_FORMAT_PCM | I2S_COMM_FORMAT_PCM_SHORT) correspond to `I2S_COMM_FORMAT_STAND_PCM_SHORT`*/ I2S_COMM_FORMAT_PCM_LONG __attribute__((deprecated)) = 0x08, /*!< PCM Long, (I2S_COMM_FORMAT_PCM | I2S_COMM_FORMAT_PCM_LONG) correspond to `I2S_COMM_FORMAT_STAND_PCM_LONG`*/ } i2s_comm_format_t;
サンプルスケッチでは、I2S_COMM_FORMAT_I2S_MSB が使われていますが、
//old definition will be removed in the future.
となっており、実際に動作しないようです。なので同等の I2S_COMM_FORMAT_STAND_MSB に変更する必要がありました。
またコンパイラ設定で、platform.local.txtを追加することになっていますが、Arduino IDE 2では必要ありません。