M5Stack(esp32)で音声合成してみる

最近ESP32のネタばかりだな。それにしても、こんな高機能なマイコンが20年前の暇な時期にあったなら、おいらの人生もうちょっと変わったかもしれないなとか、無駄な妄想をしている。まっ、今このマイコンで遊んでいるんだから、それで良いことにしよう。

ものすごく音質が良いわけではないけれど、小さなシステムで音声合成ができるというのがおもしろい。そう言えば、それこそ20年以上前にリコーが作っていたのだと思うVC2とかいうMS-DOS用の音声合成システムがあった。テキストファイルを指定すると男性の声でしゃべっていた。MS-DOSの時代だからそんなに潤沢にメモリーがあったわけではない。CPU速度だって今の1/100位かもしれない。

さて、前書きが長くなったので、そろそろ本題に入ろう。

AquesTalk

超軽量の音声合成ライブラリである。
AquesTalk
をM5Stackで使ってみよう。作業は以下のようなステップになる。

  1. 上記サイトからライブラリをダウンロード
  2. 各開発環境に合わせてファイルを配置
  3. ビルドとマイコンへの書き込み
  4. 動かして遊んでみる。

ダウンロード

上記ファイルをダウンロードする。このファイルはライセンスキーを指定しないと評価版となる。

ファイルの配置

platformioでの開発

$ platformio init -b m5stack-core-esp32

これでプロジェクトのビルド準備ができた。lib, includeというディレクトリができていることだろう。それぞれに先ほど取ってきた.zipファイルに含まれているヘッダとスタティックライブラリを置く。

続いて、platformio.iniを編集する。

m5stack-core-esp32セクションに以下を追加する。

build_flags =
  -laquestalk
  -Llib/

これで準備は整った。適当にプログラミングしてビルドしてみよう。

サンプルコード

ありがたいことにアクエストのサイトにサンプルプログラムがある。一発でビルドが通るので試して見るには良い。

ところが、このスケッチだと音声が倍速再生になってしまう。原因をちゃんと追っていないのだが、モノラル→ステレオ変換の問題か、サンプリングレートの問題かどっちかだろうな。

これを踏まえて、

.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT,

とかにしてやるとちゃんと再生できる。

最後に

駅の自動券売機で、テンキーを入力しても鳴り出した音声が止まらずにいらいらすることってないだろうか?「設計者は誰だ!」と思わず叫びたくなるわけだ。

実際にプログラミングしてみるとわかるが、音声を出しながらテンキーから入力されているかを監視して処理をしたり、割り込みという手法を使って音声を停止させたりと、設計段階からちゃんと考慮していないと忘れられることなんだなって思う。自分も「とりあえずいっかな?」とか思ってキー入力による音声の中断は実装しなかったりする。

まあ、ちゃんとしたインフラに入っている物なんだからそのくらいは作っといてほしいなとも思うのだが。