SONY sPresenseっておもしろそうか?

GPSモジュールのことを調べていて、SONYのマイコンボードがおもしろそうではないか?という気がしてきた。値段は5千円程度。単体では通信機能を持たないが、拡張基板を接続するといろいろと通信機能が追加できるようだ。

sPresense
という製品。今年の夏に発売された物のようだ。Arduino環境で開発できる。

5千円位なのだが、CPUは6コアなんだとさ。プログラムサイズが700KBていどで、ESP32とかと比べるとかなり小さいのだが、それがどの程度問題になるかは作ってみないとわからないよな、というのが経験の無い私の感覚だ。

ところがこれ、私がいつも使っている開発環境である
PlatformIO
には対応していないが、
対応させる方法
を書いてくれている人がいたのでそのうちやってみたい。

それにしても、マイコンがたくさん集まってきたな。なにかしら作品作らないとな。

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,

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

最後に

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

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

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