ESP-EYE マイク を bluetooth で、PC につなげて聞きたい。
マイクロフォンを、Bluetooth で通信するには、HS(Head Set) profile を使うみたい。
HFP(Hands-Free Profile) などでもできるみたいだが、HS がシンプルなので、こちらを使うことにした。
最初、A2DP Source でもできそうなので、試していたが、結局うまく行かなかった。
esp32 で、hsp-hr を検索したら、
@atomic14/esp32-hsp-hf が出てきたので、早速試してみた。
それと同時に、Ubuntu Mate 24.04 上で、VScode で、ESP-IDF拡張機能 が使えるそうなので、それの勉強を兼ねて試してみた。
また、 esp-idf v5.5 が最新なので、こちらも使うことにした。
1. 最初に、VScode で、ESP-IDF 拡張機能を使えるようにする。
下記ページを参照させて頂いた。ありがとう!!
VSCodeのESP-IDF拡張機能「Espressif IDF」を使ってみる
注) ESP-IDF のバージョンは、最新の v5.5 を、github からダウンロードさせてもらった。
ESP-IDFプロジェクトの構成とCMakeの仕組みを徹底解説!(VSCode+ESP-IDF拡張機能
2. 本題の、esp32-hsp-hf を試してみる。
@atomic14/esp32-hsp-hf
README.md をみたら、
@bluekitchen/btstack も必要らしい。
手順としては、先に、上記、github ブランチをダウンロードして、
btstack/port/esp32 の integrate_btstack.py を実行すると、esp-idf/components/btstack へ必要ファイルがコピーされるみたい。
早速ためしてみる。
$ cd ~/local/git-download
$ git clone https://github.com/bluekitchen/btstack.git
$ cd btstack/port/esp32
ここで、esp-idf をインストールしたパスが必要。
1. の作業の中で、パスが、 ~/esp/v5.5/esp-idf だと思うので、
$ export IDF_PATH=/home/your-id/esp/v5.5/esp-idf
$ ./integrate_btstack.py
こで、必要ファイルが、/home/your-id/esp/v5.5/esp-idf/components/btstack へコピーされる。
また、 btstack/port/esp32/example に、さんぷるがコピーされる。
時間があれば、このサンプルを試してみても良いかも。
2.1 本体のダウンロード。
どこでもOKだが、おんちゃんは、
$ cd ~/Documents/esp-idf
$ git clone https://github.com/atomic14/esp32-hsp-hf.git
あとは、 code を起動して、~/Documents/esp-idf/esp32-hsp-hf フォルダーを開けば、OK
ただし、結構 esp-idf のバージョンが古いので、/drivers/i2s.h は、旨く動かなかった。
esp-idf v5.5 は、driver/i2s_std.h でないといけない。
サンプルが、あるので、それを参考に、従来の i2s.h から変更する。
i2s_std_example_main.c
結局、i2s の read を別スレッドにして、動かすことにした。
なんとか、プログラムが出来上がったが、
PC 上で、ESP-EYE のマイクに話した声を聞きたいのでどうすればよいか、いろいろ考えた挙句、
python で、bluetooth MIC の入力を read して、PC の出力 デバイスに write すれば、ESP-EYE のマイクの音が聞けた。
やれやれじゃ。だが、音はあんまり良くはない!!残念。
後日、github にでもあげるぞね!!
@tosa-no-onchan/esp32-hsp-hf
3. PC のスピーカーで、音を確認する。
PC: Ubuntu Mate 24.04
Bluetooth ドングル買ってきて、USB に挿す。
1) PCで、ペアリングと接続
メニュー>コントロールセンター>Bluetooth マネージャ
一覧のなかから、下記をペアリングして、接続する。
HFP HF Demo AC.....
2) 入力デバイスを、bluetooth の HFP HF Demo にする。
コントロールセンター>サウンド
"入力" タグを表示
サウンドの入力デバイス: HFP HF Demo AC.....
にすれば、OK
この、メニューを閉じると、通信が切れるので、開いたままにする。
3) python で、入力 Stream を、PC の 出力デバイスにリダイレクトする。
$ python mic2Speaker.py
これで、PC の出力デバイスから、音が出ると思う。
ESP-EYE のマイクに、話してみる。
ガサガサ と シャー の2種類のノイズでるみたい。
ガサガサ は、使っていると出なくなる。
シャー のノイズは、仕方がないみたい。
ガサガサは、I2S の Read が間に合っていない状態みたいな気がする。
一応、I2S Read は、別スレッドにして、Queue 渡しにしているが、
基本的に、ESP-EYE の I2S Mic の転送性能が悪いのかも知れない。
以前の、 i2s.h では、バッファリングを指定できていたきがするが、 i2s_std.h には、
該当箇所がわからないままじゃ。
3.1 i2s_std.h のバッファ指定。
i2s_usb_example_main.c
に、バッファを指定している箇所があった。
自分の方にポーティングして試してみた。
改善はないが、ノイズの質が変わったみたい。
ただし、音に少し透明感が加わったかも?
3.2 音の改善。
どうやら、ES8311 等をあいだにかましたほうがよいみたい。
ESP-EYE はやめて、普通の ESP32 に ES8311、ES7210 をつないで、MIc、Speaker につなげた方がよいみたい。
ES8311 サンプルプログラムが、下記にある。
i2s_es8311
![]() |
M5STACK Atomic Echo Base マイクロフォン/スピーカーが搭載され、M5 Atomシリーズ専用に設計された音声認識ベース 新品価格 |

おんちゃんは、M5Stamp Pico Mate を持っているので、使えるのだろうか?
一応、スペックシート等を見ると、I2S は使えるみたい。だが、ピンアサインがわからない。
esp32-pico datasheet が下記にあったが、
esp32-pico_series_datasheet_en.pdf
4.2.5 I2S Interface
Pin Assignment
The pins for the I2S Controller can be chosen from any GPIOs via the GPIO Matrix. For more information about the pin assignment, see ESP32 Series Datasheet > Section Peripheral Pin
Configurations and ESP32 Technical Reference Manual > Chapter IO_MUX and GPIO Matrix.
M5Stamp Pico Mate のピンを自由に選んでつかえるようだが、
I2C を使わなければ、それのピンが使えるのだろうか!!
2.4 Pin Compatibility Between ESP32-PICO Variants
2 Pins
Table 7: Pin Compatibility Between ESP32-PICO Variants
が、参考になるのかも。
4. Android で試してみる。
Android の通信の Bluetooth で、 HFP HF Demo をペアリングして、接続する。
後は、google の検索窓のマイク をタップして、音声入力まちにする。
ESP-EYE のマイクで、話してみる。
多分、Android で、認識できると思う。
5. BLE(Blue Truetooth Low Energy) での音声通信について。
Google AI で調べたら、次世代の「LE Audio」とそのコーデック「LC3」でできるとのこと。
音楽だと、複数クライアントで、聞けるみたい。
音声だと、双方向の通信ができるみたい。
ただし、LE Audio は、Bluetooth Ver 5.2 か 5.3 あたりみたいじゃ。
おんちゃんも、今日、調べて、初めて知ったぞね。
ESP32 だと、最新の esp-idf v5.5 では、BLE ver 5.0 みたいなので、今は、試せない!!
残念。
Raspi でも、外付け、Intel AX210 chipset をつかってやっとみたい。
Bluetooth LE Audio with Intel AX210 chipset
このページをみていると、
$ lsusb
で、bluetooth USB デバイスをチェックしているだけなので、普通に Ubuntu PC で、bluetooth ドングルを使う方法のような気がする。
ならば、Amazon で、 "bluetooth 5.2 アダプター" を検索すると一杯でてくるが、これを単純に、Raspi か、Raspi Zero
に挿せば使えるのではないのかな....?
問題は、ドライバーがあるかどうかか。
しかし、これだと、Server 側としての利用に限定されるのか?
おんちゃんがほしいのは、MIC をつけた、BLE V5.2 LC Audio をつけたデバイスじゃが?
Raspi だと、デバイス側にならないのかも。
Amazon で、 "bluetooth子機 5.2 アダプター" だとどうなんだろう。
これって、単純に、PC と Android を Bluetooth でペアリング&接続すればよいだけか?
Ubuntu Mate 24.04 with Bluetooth USB ドングル と、 Galaxy と bluetooth でつなげてみる。
Bluetooth USB ドングル は、親機、子機などと意識して買っていない。
1) 最初に、PC のBluetoth が見えるようにする。
コントロールセンター>Bluetooth アダプター
◎常に表示
2) Android の方で、PC との接続をする。
設定>接続>Bluetooth
多分接続可能デバイスに、PC の名前が出ているので、
それを、ペアリング and 接続 すれば、OK
PC の方でも、ポップアップの確認が出てきたら、接続許可を応答する。
HF、HS のプロファイルで接続できたと思う。
後は、これを使うアプリの問題か。
親子関係はどうなの?
音楽での、Android and Windows PC の接続例が、webで検索できる。
設定をすると、Andorid で音楽を再生すると、PC 側で聞けるみたい。
なんとなく、PC が聞く(Sink)側 で Androidが親(Source) みたい。
逆もありなのか?
BLE の BL Audio の音声だと、両方向みたいだが。
どうも、話が複雑になっていかん。
Bluetooth Classic と、 Bluetooth v5.2 以降と音楽と音声をそれぞれ別々に論じるべきか。
おんちゃんのAndroid は、GalaxyA21 で、かなり古い機種みたい。
Bluetooth Ver 5.0 で、一応 BLE の初期は入っているみたい。
A23、A24、A25 辺りだと、LE Audio が使えるみたい。残念!!