ちょっと話題の記事

Raspberry Piを使って無線ヘッドホンを複数入力から同時に出力出来るようにする

2019.07.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

皆さん音楽をどういった機器で聴いていますか?私は普段WH-1000XM3(Bluetoothヘッドホン)で聴いています。

WH-1000XM3はノイズキャンセリング機能を始めとして、本当に私がオススメしているBluetoothヘッドホンであり、かなり満足度の高い製品です。しかしながら、1点少し満足しきれていない箇所があります。

WH-1000XM3に限ったことではないのですが、大抵のBluetoothヘッドホン/イヤホンでは、1つの送信元デバイス(スマホ等)としか同時に接続が出来ず、切り替えにいくらか手間と時間がかかってしまうという点があります。

私は普段AndroidとiPhoneとiPadを持ち歩いているのですが、例えばAndroidとヘッドホンをBluetoothで接続しているときに、iPadをカバンから取り出してさて動画を観ようと思った際には、Androidを再度ポッケから出して接続を解除し、iPadの設定を開いてヘッドホンと接続をする必要があります。

さほど大きな手間と時間ではないのですが、個人的な信条としてどのデバイスも平等に使ってあげたいので、頻繁に切り替える必要があり、チリツモでそこそこかかってしまっているような気がしています。

また、今ヘッドホンと接続したいデバイスだけで切り替え動作が完了するような「横取り」ペアリングのような機能が知る限りでは存在せず、例にも挙げたように一旦今接続中のデバイスを操作して接続を解除する必要があり、この今使う必要のないデバイスを取り出して操作する必要がある、というのがどうもイケてるように思えず、ちょっと悩みのタネでした。

どうにかして上記の問題をRaspberry Piを使って解決してみたので、共有させていただきたいと思います。

得られるもの、必要なもの

結論から申し上げます。タイトルと被るところがありますが、以下のことが可能になります。

  • Bluetoothヘッドホンへ、複数の送信元デバイス(スマホ、タブレット等)から、Bluetooth経由で同時に音声を流せるようになる
    • このときの音声は専有的ではなく、PCでブラウザのタブを2つ開いてYouTubeを流した時のように、音声がミックスされ本当に同時に流れる
      • 3台同時再生を確認済み
    • 遅延は単純計算で倍以上になるはずだが、個人的には普通に動画などを再生しても許容出来るレベル
  • スマホから音量調節が出来る
    • スマホからは単なるBluetooth音声出力機器に見えるので、別途専用アプリをインストールしたりする必要はない
    • 上記の理由から、今普通にBluetoothヘッドホンに対して送信している音声であれば、なんでも聴ける
  • Bluetoothヘッドホンから音量調節が出来る
    • 再生/一時停止、前/次の曲のような曲操作は、今のところは出来ないように見える
  • BluetoothヘッドホンはRaspberry Piと自動接続が出来る(ただ、遅い時やA2DPで接続してくれない時もある)

図のように、Raspberry Piが一旦各デバイスの音声を受け、ミキサーのような役割をしてヘッドホン等に送る、ということをしています。

上記を実現するため、以下のパーツとスキルが必要です。

  • Raspberry Pi(あるいはLinuxマシン)
  • 内蔵、外付け(USB)問わずBluetoothアダプタを、接続するBluetoothデバイス分
    • 例えば、1つのBluetoothヘッドホンを2つのスマホから同時に出力させたい場合は、合計3つ必要
  • Raspbian(Linux)をインストールするスキル
  • ファイルを書き換える程度の、簡単なLinuxコマンドを叩くスキル

検索で来る方もいるかと思い、ちょっとちゃんと並べてみましたが、普段Developers.IOを見てくださっているようなエンジニアの方であれば、なんの問題もなく実現可能かと思います。

手順

さて、では実際に作っていきましょう。

まず、Raspberry PiにLinuxをインストールしてください。今回はRaspberry Pi 3に「Raspbian Buster with desktop 2019-06-20」をインストールしました。インストール後はBluetoothアダプタを接続した状態で起動し、パスワード変更等の初期設定を済ませてください。

次に必要なBluetoothモジュール(pulseaudio-module-bluetooth)とGUIのBluetoothマネージャ(blueman)をインストールします。CLIで操作したいぜという方は、以下の記事でbluemanで操作してるところをbluetoothctlなどで操作してみてください。Bluetoothのペアリングの仕組みと、help叩いたりググる能力があれば普通にできるかと思います。

sudo apt install pulseaudio-module-bluetooth blueman

次に、スマホ等の送信元デバイスからの音量調節を有効化するために、systemdのファイルの上の箇所を下のように書き換えてください。

/lib/systemd/system/bluetooth.service

ExecStart=/usr/lib/bluetooth/bluetoothd
ExecStart=/usr/lib/bluetooth/bluetoothd --plugin=a2dp --compat --noplugin=sap

次に、音楽を聴くには適切でないHSP/HFPプロファイルを無効化するために、bluezの設定ファイルに以下の行を追加してください。

/etc/bluetooth/main.conf

[General]
Disable=headset

以上が済んだら以下のコマンドでBluetoothサービスを再起動してください。

sudo systemctl daemon-reload
sudo systemctl restart bluetooth

以上で下準備は完了です。あとはGUIでポチポチして接続していくだけです。それではBluemanを利用して各機器を接続を行っていきましょう。

左上のスタートメニューを開き、設定の中にあるBluemanを起動してください。

まず、スマホ等の他端末から見える名前を変更したいと思います(アダプタによるのか、単にタイミングの問題かもわかりませんが、別の名前で表示されることもあります)。初期設定だとすべてのアダプタが「BlueZ」という名前で区別がつかないと思うので、BluemanのメニューのAdapterからPreferencesを選択し、設定を開いてください。

今回はBlueZ1/2/3という名前にしました、iPhoneなどだと再生中であればロック画面にこの端末名が表示されたりするので、何か面白い名前にしたりするのもアリかと思います。Visibility Settingでは、スマホでBluetooth設定画面を開いてるときのように、他端末から見えるかという設定になります。Bluemanから探索出来るので、常時Hiddenでもいいかと思いますが、最初の接続でうまくBluemanから見つけられず、スマホからはBluetoothアダプタが見えたという場合もあったので、初期設定時はVisibleにしておいてもいいと思います。

実際にまずスマホ等の音声入力デバイス(A2DP Source)を接続していきます。スマホ等を開き、Bluetoothの設定画面を開く等をして探索可能な状態にし、Bluemanのボタンメニューにある、虫眼鏡のSearchをクリックし、端末を探索してください。スマホからでもBluemanからでもペアリングを開始して大丈夫ですが、今回はBluemanから接続します。該当の端末を右クリックし、Pairを選択してください。以下のようなPIN入力プロンプトが出た場合は、「0000」と入力し、スマホ側でもPIN入力があれば「0000」を入力してください。

その後スマホでもBluemanでも本当に接続するかといったようなプロンプトが出れば、OKを押してください。ペアリングが完了し、接続が出来た場合は、Bluemanで該当の端末を右クリックし、以下の画像のようにAudio ProfileがA2DP Sourceになっているかを確認してください。なってない場合はA2DP Sourceを選択し、エラー等が出た場合は再接続してみてください。

上記の操作を、接続したい機器分行ってください。ただし、各Bluetoothアダプタは1つの端末としか接続できないようなので、接続完了した場合は、以下の画像のようにBluemanのAdapterメニューから別のアダプタを選択した上で、接続をしてください。このため、必要なものの一覧にあったように、接続する機器だけBluetoothアダプタが必要となります。

次にヘッドホン等の出力デバイス(A2DP Sink)を接続します。接続するときはスマホ等と接続するときと同様に、ヘッドホン等をペアリングモードにし、Bluemanから探索を行ってペアリングを行なうという手順です。接続を行なう際は、以下の画像のようにAudio Sinkとして接続するようにしてください。

ペアリングを行い、接続が出来た場合は、同様にプロファイルがA2DP Sinkになっているか確認してください。なっていない場合はA2DP Sinkを選択し、変更出来ない場合は再接続してみてください。

以上で設定は完了です。複数のスマホ等から音声を流し、ヘッドホン等で同時に再生が出来るはずです。

おわりに

外出先でも利用する場合は、Raspberry Piをモバイルバッテリー等に接続して持ち歩き、更にそのRaspberry PiもBluetoothアダプタを複数接続してゴテゴテになっていると思うので、見た目はあまり良くないかもしれません。

しかし、そこから得られる体験としては本当に素晴らしいものがあります。

一切の再接続等の手間なしに、お気に入りのヘッドホンで真のマルチポイント接続が出来ます。これこそ私が求めていた無線環境です。

以前からずっとこういうのを求めてきましたが、市場にもないように見えるし、調べても出てこないので、すごく難しいのかと思ってました。しかし、細かな設定はあるものの、ほぼ単にRaspberry Piに各機器を接続するだけで実現することができました。

実のところ、はじめにで挙げたような不満点は私しか抱えておらず、他の人には響かないのかもわからないですが、それでも誰かのためになれば幸いです。