ドロイド君成長日記7「Bluetoothスピーカからの音楽再生」

今回、ドロイド君開発当初から、ずっとやりたいと思っていた機能の一つである「Bluetoothスピーカからの音楽再生」が実装できました!

その動画がこちら。

作った動機は動画でも触れているとおり、現在のスマートスピーカで音声認識を使って気軽に音楽を聴こうとすると、基本的に音楽サービスへ加入する(=毎月定額を支払う)必要があるんですよね。

でも、別にネット上にある最新の音楽を聴きたいわけじゃなくて「お気に入りの音楽を気分によって気軽に聞きたい」だけなんですよ!(プンスコ)

なので、ローカルにある音楽ファイルを好きに再生させてよ!そうずっと思ってました。そうならない理由は、大人の事情があるのかもしれませんが。

【2018/07/28追記】
今更知ったのですが、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)。

【A2DPのコーデック】
 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)。

あまり詳しく読んでいないが、ざっと見ると各種バージョンは以下っぽい。

【ESPにおける対応状況】
 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/)