M5StackをVSCODEとPlatformIOで開発 ESP32で音声合成(AquesTalk pico for ESP32)をしてみる

ようやくM5Stackで株式会社アクエストの音声合成エンジン[AquesTalk](https://www.a-quest.com/index.html)のESP32版である、[AquesTalk pico for ESP32](https://www.a-quest.com/products/aquestalk_pico_esp32.html)を使えたのでメモ

[前々回のよくはまるポイント](https://qiita.com/watarukato/items/04525a17972f2fd893b2
)
[前回のLDFの使い方](https://qiita.com/watarukato/items/455c74c625e178de385d)
を学んだおかげで、比較的スムーズにできたと思う。

## 新規でPlatformIO Projectを作る

作成内容
[env:m5stack-core-esp32]
platform = espressif32
board = m5stack-core-esp32
framework = arduino

Project nameはM5_Aquestalk_picoとした。

## AquesTalk pico for ESP32を準備する

### AquesTalk pico for ESP32のダウンロード
 
[公式のダウンロードページから](https://www.a-quest.com/download.html#a-etc)AquesTalk pico for ESP32をダウンロードして解凍する。

今回利用するのは、
ヘッダファイル:aquestalk.h
スタティックライブラリ:libaquestalk.a
※aq_dic　この辞書フォルダの使い方はわからなかった。ぐすん

### サンプルコードの入手と分析

[公式からリンクされている開発者blog](http://blog-yama.a-quest.com/?eid=970188)を一通り読んだら、さらにそこからリンクされているサンプルコードを入手する。
https://www.a-quest.com/blog_data/esp32/hello_aquestalk.ino

このサンプルコードの冒頭の部分を読んでみると、

```hello_aquestalk.ino

#include "driver/i2s.h"
#include "aquestalk.h"
```
i2s.hは、Framework:Arduino, platform:espressif32を選択したときに、PlatformIOがsdkとして自動でインストールしてくれるものなかに入っている。

"C:\Users\xxxxx\\.platformio\packages\framework-arduinoespressif32\tools\sdk\include\driver\driver\i2s.h"

aquestalk.hは、先程ダウンロードしたヘッダファイルでこいつも同様に中をみると、stdint.hのみインクルードしているようなのでこれも当然、標準ライブラリとして使えるだろう。

以上より、今回のサンプルコードを動かすだけならば、AquesTalk pico for ESP32以外には特別なライブラリなどは不要だろう。

### AquesTalk pico for ESP32のファイル類を適切な場所に設置してplatformi.iniを編集

PlatformIOのなるべくProject毎に独立した環境をつくるべきという考え方に則って（則ったつもり）設置した。
この置き方ならばLDF Modeは標準のchainのままで充分(実際はoffでもBuildできた)

- ヘッダファイル:aquestalk.h → Project用のincludeファイル置き場へ設置
"C:\Users\xxxxx\Documents\PlatformIO\Projects\M5_Aquestalk_pico\include\aquestalk.h"

- スタティックライブラリ:libaquestalk.a → Project用のlibファイル置き場へ設置
"C:\Users\xxxxx\Documents\PlatformIO\Projects\M5_Aquestalk_pico\lib\libaquestalk.a"

#### スタティックライブラリをリンクするようにplatformi.iniを編集
build_flagsを加えて
-l(小文字のエル)でaquestalkというライブラリを
-Lで指定したフォルダ内を探して、ビルド時にこのスタティックライブラリlibaquestalk.a(.aなので複数オブジェクトファイル)を実行ファイルに変換する時にリンクするようにする。

```platform.ini
[env:m5stack-core-esp32]
platform = espressif32
board = m5stack-core-esp32
framework = arduino
build_flags =
# -l[aquestalk]: Search the library named (lib)aquestalk(.a) in (-L)projectname\lib\ when linking
  -laquestalk
  -Llib/
```

※豆知識
 -llibaquestalk.aでも-llibaquestalkでも-laquestalk.aでも-laquestalkでもビルドできる。ファイル名の最初の(lib)と拡張子.aは省略できるみたい。

platform.iniの編集のときに、オプションの内容を複数指定するときは半角スペース2文字以上開けること。また、コメントは横にかかないこと。　C++プログラムしている人なら当たり前のことなのかな？でも、これ気づくのに半時くらいはまった。

これだとスペースが2文字以上空いていないからエラー

```
build_flags =
-laquestalk
-Llib/
```
これはコメントが余計なところにあるからエラー

```
build_flags =
-laquestalk #ここにコメントしちゃだめだよ
-Llib/
```

### サンプルコードの編集
最初の2つは必須。これやらないとビルドできない。最後の声のスピードはお好みで。でも100だと早すぎて全然わからない。

- ```
#include <Arduino.h>
```の追加

-  setup()の前に関数のプロトタイプ宣言の追加

```
// function prototype declaration
void DAC_Create();
void Play(const char *koe);
void DAC_Release();
int DAC_Write(int len, int16_t *wav);

void setup(){
```

- 読み上げ速度を標準の100から40に落とす

```
	int iret = CAqTkPicoF_SetKoe((const uint8_t*)koe, 45, 0xffffU);
```


ふう。ようやく動いた～～～。GWの2日目から取り組んでたから7日かかったのか。。。