結局HRM1017のBLEで認識可能な品質の音声をPCに送るのはかなり厳しい、というかほとんど無理であることがわかったので、音声の送信は無線LANが使えるESP-WROOM-02を使うことにしました。
このチップにはTOUT端子という、AD変換してくれる端子があるのでこれを利用することにしました。0〜1Vの範囲ですので、増幅した音声信号を一旦コンデンサで直流成分を除去した後、バイアスを0.5V与えるようにしました。また、アンプのゲインを調整するため、一部の抵抗を可変抵抗にしました。下の図はアンプの回路図と、音声送信回路の全体の写真です。なお、回路定数は正確ではありませんので悪しからず。
写真の左のブレッドボードにはUSBシリアル変換モジュールと、ESP-WROOM-02の基板をつけてます。ESP-WROOM-02の電源は3.3Vなのですが、今回はUSBシリアル変換モジュールの3.3V出力を使ってます。プルアップ抵抗は基板の裏にあって見えないですが、チップ抵抗ではなく、普通のリード線タイプの抵抗を使ってます。パスコンは手持ちのチップコンデンサをはんだ付けしました。
右のブレッドボードは前の記事で紹介したコンデンサマイクの信号を増幅するための増幅回路です。右上に見えるつまみはゲイン調整用の可変抵抗器です。
次はソフトの話。最初はUDPで単純にシーケンシャルに音声を送ろうとしましたが、連続してパケットを送るとなぜかエラーになり原因を探るも全く埒が開かなかったので、このチップを使って音声をクラウドに送って認識させるためのシステムを紹介されているこちらのサイトのコードをほぼ丸々使わせていただき、無事送ることができました。音声をPCに送るまでの手順をかいつまんでいうと、まず音声をダブルバッファを使ってサンプリングします。いっぱいになったバッファは定期的にESP-WROOM-02のフラッシュメモリに書き込み、それが終わったらHTTPサーバを立ち上げてフラッシュメモリに書き込んだ音声データをPCからGETする、という方法です。今回は音声データは無圧縮で、8kHz、16bit(ただし、ADCの精度としては10bit)の生PCMで送っています。
ハマったことといえば、ESP-WROOM-02のハンダ付け(表面実装)がうまくなかったためか、最初は不安定だったので、なぜ動かないのか、の原因がなかなかわからなかったのですが、ハンダ付けを何回かやり直したところ、安定して動作するようになってからはスムーズに行きました。
試しにこのシステムで録音した音声をMicrosoftの音声認識APIで認識させて見たところ、ほぼ100%の確率で認識してくれるようになりました。やっぱり精度よく認識させるには、サンプリングレートが8kHzは必要なんですね〜。
それにしても、ESP-WROOM-02はほぼ千円(ピッチ変換基盤含む)なのに、無線LANを使えたり、USBシリアル変換モジュールがあればArduino IDEも使えるのでかなりお得です。
[amazonjs asin=”B01C8B67CS” locale=”JP” title=”ESP-WROOM-02ピッチ変換済みモジュール《フル版》”]
