ドロイド君成長日記7「Bluetoothスピーカからの音楽再生」
今回、ドロイド君開発当初から、ずっとやりたいと思っていた機能の一つである「Bluetoothスピーカからの音楽再生」が実装できました!
その動画がこちら。
作った動機は動画でも触れているとおり、現在のスマートスピーカで音声認識を使って気軽に音楽を聴こうとすると、基本的に音楽サービスへ加入する(=毎月定額を支払う)必要があるんですよね。
でも、別にネット上にある最新の音楽を聴きたいわけじゃなくて「お気に入りの音楽を気分によって気軽に聞きたい」だけなんですよ!(プンスコ)
なので、ローカルにある音楽ファイルを好きに再生させてよ!そうずっと思ってました。そうならない理由は、大人の事情があるのかもしれませんが。
今更知ったのですが、GooglePlayMusicを使うと、クラウドに無料でローカルの曲を5万曲までアップロード可能でした。しかも、そのアップロードした曲をGoogleHomeから音声指示でストリーミング再生できるという…。
今回開発した新機能の有用性が、大分薄れてしまいました。
ただ、ドロイド君の場合は、GoogleHome以外の他のBluetoothスピーカからでも音楽を流せる、という利点は残りますが…。メリットとしては、ちと弱い。
そこで、今回は聞きたい音楽をドロイド君のmicroSDに保存しておく方式にしています。
カテゴリ別フォルダ(元気な曲、落ち着いた曲など)にそれぞれ保存しておけば、あとは気分を伝えるだけでドロイド君がGoogleHome経由で再生してくれる、そんな方向性で作ってみました。
以下では、Bluetoothスピーカ連携に向けて調べた、技術的な話をメモしておきます。
ただ、備忘録も兼ねており、若干脱線しています。また、専門ではないので、間違ってるかもしれません。
これらをまとめるにあたり、色々なサイト様にお世話になりました。ありがとうございました。
Bluetooth基礎
ClassicBluetoothとBluetooth Low Energy(BLE)
Bluetoothにはいくつかのバージョンがある(※1, ※2, ※3)。
基本的に、v1~v3までは「通信速度」の向上に力を入れて改善されたが、v4で方向転換し「消費電力」を少なくすることが重視されるようになった。
v1: BR(Basic Rate: 1Mbps)
v2: EDR(Enhanced Data Rate: 3Mbps)
v3: HS(High Speed: 24Mbps)
v4: LE(Low Energy: 1Mbps)
v4で開発された技術では、消費電力が(とても)少なくなった代わりに、通信速度がv1程度に戻った。
このため、オーディオのストリーミングのような、大きな帯域が必要となる通信をしたい場合は、v3以前の技術でないと対応できなかったりする。
また、v3以前とv4で開発された技術の間には、通信方式に互換性がない。
このため、v3以前の「通信速度重視」な技術を「ClassicBluetooth」、v4で登場した「消費電力重視」な技術を「Bluetooth Low Energy(BLE)」と区別するようになった。
新ブランド「Bluetooth Smart」の誕生
ここまでの話で注意すべき点がひとつある。それは「v4 = BLE」ではない事。
v4は、v3までの技術にBLEの技術を統合したものである。つまり、v4と謳っている製品でも、v3以前の技術で通信することもありうる(※4)。
一方で、BLEのみ対応していて、v3以前の技術には対応していない(=v3以前のデバイスとは通信できない)機器も存在したりする。
このように、対応状況が混在するようになったため、次のような新しいブランドが誕生した(※12)。
Bluetooth(無印): v1~v3のみ対応
Bluetooth Smart Ready: v1~v3, BLE共に対応
Bluetooth Smart: BLEのみ対応
また、BLEのみの通信に対応したホストデバイスを「シングルモード」、v3以前とBLEのどちらとも通信できるようなホストデバイスを「デュアルモード」とも呼ぶ。
Bluetoothのプロファイル
Bluetooth通信は様々な用途で使われるため、相互の機器で意図したサービスの通信ができるよう、「プロファイル」というものが定義されている(※5)。
今回のBluetoothスピーカとの連携でいうと、やりたい事は「オーディオデータの送信」と、再生・停止などの「リモコン制御」。
これを実現するために一般的に用いられているプロファイルは、それぞれ「A2DP」と「AVRCP」である。
この中でも、A2DPはオーディオデータの送信に大きな帯域が必要となるため、v4では対応できない。このため、現在もv2.1(+EDR)の技術で運用されている。
また、各プロファイルにもバージョンが存在しており、A2DPやAVRCPなど昔からあるプロファイルの公式ドキュメントはこちら(※6)。
ちなみに、プロトコルとプロファイルの違いはこちら(※7)。
A2DPのコーデック
先述のとおり、A2DPはステレオ音質のオーディオデータを送信するためのプロファイルである。
このため、音楽圧縮技術と同様、送信されるデータのコーデックにもいくつか種類がある(※8)。
SBC(Side Band Codec): 必須要件。
AAC, aptX: オプション。
aptX-HD, LDAC: 最近登場。ハイレゾ相当の音質も可。
送信・受信側がともに対応しているコーデックの中で、高品位なコーデックが採用され、通信に用いられる。
また、送信側をSource, 受信側をSinkと呼ぶ。
ESP32での対応状況
サンプルコード
A2DPに関しては、公式からSource側/Sink側ともにサンプルコードが出ている(※9)。
一方、AVRCPについては、Sink側は対応しているものの、Source側はまだ未対応っぽい(※10)。
ちなみに、AVRCPのAPI解説において、メインとなるコールバック関数に以下のような記述がある。
for now only AVRCP Controller role is supported.
サンプルコードを見てもSink側のみ対応されてるっぽいので、その通りなのだろう。
プロファイルのバージョン等
こちらにESP32のBluetoothアーキテクチャについて述べられたドキュメントあり(※11)。
あまり詳しく読んでいないが、ざっと見ると各種バージョンは以下っぽい。
A2DP: Ver1.2
AudioCodec: SBCのみ
AVRCP: Ver1.3
以上をまとめると「ClassicBluetoothを使ってA2DPは対応可(コーデックはSBCのみ)、AVRCPはリモコン信号を受ける側(ドロイド君側)について、まだ未対応」となる。
ドロイド君上での実装
A2DPの実装は、サンプルコードを参考にすればいけた。
一方、リモコン操作は問題あり。GoogleHomeに「Ok Goole, 音楽停止」と言って、AVRCPで通知したとしても、ドロイド君でそれを受けて処理することはできない。残念。
なので、リモコン操作に関しては、AVRCPを使うのではなく、GoogleHomeからIFTTT経由でドロイド君に指令を送ることにした。
(電気消して、という指示を伝えるのと同じ経路)。
なので、「OK Goole, ドロイド君 音楽停止」と、頭に毎回「ドロイド君」をつけないといけない。
んまぁ、別にいいか。
今後に向けて
これまた、結構長くなってしまいました。
そして、後半になるほど雑になるという人間の性。ええ、分かってるんです。だって人間だもの。
今後はカテゴリのカスタマイズ機能や、今は決め打ちになっているBluetoothスピーカーのアドレスをちゃんと検索する機能をつけたりしようかなぁ、なんて。
いや、めんどくさいからそこまでは作らないかもしれません。だって人間だもの。
では、また次回のドロイド君をお楽しみに!
参考サイト
※1: Bluetooth「Wikipedia」様(https://ja.wikipedia.org/wiki/Bluetooth)
※2: 【エンジニアブログ】クラシックBluetoothとBluetooth Low Energyについて「無線モジュール.com」様(http://www.musen-module.com/news/2014/nov2014/news01.html)
※3: 【解説】誤解していませんか?「Bluetooth 5対応」の真の意味とは「PHILE WEB」様(https://www.phileweb.com/review/article/201805/21/3037.html)
※4: Core Bluetooth / BLEで音声データをやりとりする「Over&Out その後」様(http://d.hatena.ne.jp/shu223/20140130/1391033579)
※5: Bluetoothプロファイルの一覧「Wikipedia」様(Bluetoothプロファイルの一覧)
※6: Traditional Profile Specifications「Bluetooth本家」様(https://www.bluetooth.com/specifications/profiles-overview)
※7: プロトコルとプロファイル「YTSのホームページ」様(http://www.yts.rdy.jp/pic/GB002/protocol.html)
※8: 今さら聞けない「Bluetooth」最新事情を解説!「価格.comマガジン」様(https://kakakumag.com/av-kaden/?id=10341)
※9: A2DPソースサンプル「github(@espressif)」様(https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/a2dp_source)
※10: AVRC API(ESP-IDF Programming Guide)「Espressif」様(http://esp-idf.readthedocs.io/en/latest/api-reference/bluetooth/esp_avrc.html)
※11: ESP32 Bluetooth Architecture「Espressif」様(https://www.espressif.com/sites/default/files/documentation/esp32_bluetooth_architecture_en.pdf)
※12: Bluetooth 4.0 に新ブランド「engadget」様(https://japanese.engadget.com/2011/10/25/bluetooth-4-0-bluetooth-smart/)