ESP32には、Wi-Fiルーターを介さず端末同士が直接つながる「ESP-NOW」という通信方式がある。これを使えば、マイクとスピーカーを付けたESP32ボードを、トランシーバーのように仕立てられる。ただしESP-NOWで一度に送れるデータは250バイトまでと小さく、音声をそのまま流すには容量が足りない。
開発者の田中正幸氏が公開したArduino用ライブラリ「PCMFlowG722」は、この制約の中でHD音声(広帯域=電話より高音質)の双方向通信を成り立たせる。鍵になるのは、ビデオ会議などで使われてきたG.722という音声圧縮方式だ。
G.722は、16kHzでサンプリングした最大7kHzの音声を、電話用のG.711と同じ64kbpsの帯域に収める。通信量は電話並みのまま、扱える音の幅が約2倍に広がる仕組みだ。具体的には、20ミリ秒ぶんの音声が160バイトに収まる。これはG.711と同じサイズで、ESP-NOWの250バイトの枠に余裕で入る。無圧縮のPCMなら同じ20ミリ秒で640バイトを要するので、約4分の1に圧縮できる計算になる。
音質をさらに上げるならOpusという選択肢もあるが、Opusはプログラム容量で150KB前後を占め、処理も重い。G.722は圧縮の方式が単純で、必要な容量は約10KB、メモリーも片方向あたり約512バイトと軽い。1988年に標準化された方式で関連特許も切れているため、ライセンス面の心配も少ない。PCMFlowG722自体のコードはMITライセンスで公開されている。
動作の土台には、同じ開発者の「PCMFlow」ライブラリを使う。マイクからESP-NOWを経てスピーカーまでをつなぐ送受信のサンプルも同梱する。対応するのはESP32シリーズやRP2040、Teensyなど、ある程度のメモリーを積んだ32bitマイコンで、SRAMが2KB級のArduino Unoなどは対象外だ。手元のESP32ボードで高音質のトランシーバーを作ってみたい人にとって、すぐ試せる土台になる。