ラズパイをAirPlayサーバーにしてオーディオ環境を快適にしてみた (Raspberry Pi)



オーディオ環境を快適にするため、ラズパイ(Raspberry Pi)をAirPlayサーバー化することにした。
AirPlayとは、iOSやMacからWiFi経由で音楽を流せるアレである。

今回はAirPlayサーバーを無事、ラズパイで実現できたので、構築までの手順を説明したいと思う。

なお、ラズパイの基本的なセットアップはこちらを参照いただきたい。





shairport-syncのインストール


shairport-sync とは、なんとAppleのAirPlayをサーバーとして実現してくれるプログラムだ。
ただし、このAirPlayサーバーは音声のみを対象としている。

shairport-sync をインストールする前に、いろいろなライブラリをインストールする必要がある。

まずはapt-getを最新のものにしておこう。なぜなら最新にアップデートしておかないとライブラリが見つからなかったりするからだ。
$ sudo apt-get update && sudo apt-get upgrade



そして必要なライブラリをまとめてインストールしていく。
$ sudo apt-get install git autoconf libdaemon-dev libpopt-dev libconfig-dev libasound2-dev libpulse-dev libavahi-client-dev libssl-dev libsoxr-dev



たくさんライブラリを入れたのは良いが、どんな役目があるのか分かっていないとモヤっとするので一応ざっくり調べてみた。

ライブラリ名 役割
git gitコマンドを使えるようにする
autoconf configureを自動で生成してくれる
libdaemon-dev 軽量な C ライブラリで、UNIX デーモンを書きやすくしてくれる
libpopt-dev コマンドラインのパラメータによって変数を設定できるようにする
libconfig-dev configファイルの構造をパースして扱いやすくしてくれる
libasound2-dev ALSAアプリケーション開発に必要な共有ライブラリ
libpulse-dev PulseAudio開発に必要なライブラリ
libavahi-client-dev ローカルネットワーク上のサービスやホストを検索可能にする
libssl-dev OpenSSLを使えるようにする
libsoxr-dev リサンプリングして音質を良くしてくれる

ALSA: Advanced Linux Sound Architecture



準備が整ったところでいよいよ本命の、 shairport-sync をインストールする。
次のように、Gitでクローンする。
$ git clone https://github.com/mikebrady/shairport-sync.git



そしてフォルダへ移動し、コンパイル & インストールしよう。
$ cd shairport-sync
$ autoreconf -i -f
$ ./configure --sysconfdir=/etc --with-alsa --with-pa --with-avahi --with-ssl=openssl --with-metadata --with-soxr --with-systemd
$ make && sudo make install



shairport-sync をインストールできたところで、今度はAirPlayサーバーの設定をする。

管理者権限で /etc/shairport-sync.conf を開き、次のように変更する。
general =
{
	name = "AirPi"; // コメントアウトしてAirPlayの名前を決めよう
...
	interpolation = "soxr"; // soxrを使うと音質が良くなる、ただしCPU負荷も高くなる
...


ラズパイの基板に付いているオーディオミニ端子からラインアウトする場合はこれだけOK。


ラズパイ起動時に自動でAirPlayサーバーが動くようにしたいので、次のようにサービスに登録させておいた。
$ sudo service shairport-sync start
$ sudo systemctl enable shairport-sync.service


ラズパイを再起動して、AppleデバイスからAirPlay (登録名:AirPi) が選択できるようになっていれば成功だ。



ラズパイからの音量が小さい場合は、 alsamixer コマンドで音量設定を変えることができるので試してみよう。



USB DACからの再生


ラズパイ搭載のオーディオミニ出力は、残念ながら音が悪い。
ラズパイ自身の機械的ノイズを受けやすいのだ。

そこで、USB DACを繋ぐことにした。

USB DACを繋ぐ場合は、ラズパイの設定を少し変える必要がある。

まず、USB DACをラズパイに繋いでラズパイを再起動する。

$ aplay -l コマンドでオーディオデバイスを確認する。
すると、次のようにUSB Audioが確認できるはずだ。

**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 6/7
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 IEC958/HDMI [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: ALSA [bcm2835 ALSA], device 2: bcm2835 IEC958/HDMI1 [bcm2835 IEC958/HDMI1]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: Device [USB2.0 Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0


この状態で何か音声データを鳴らしてみる。
たとえば次のように。
$ aplay -D plughw:1,0 hoge.wav


無事、wavファイルの音声を確認できた。

上記の設定の、plughw を環境によっては hw にすると良い。

そもあとの数字は、 $ aplay -l で得られた情報を元にしていて、 plughw:card番号, Subdevice番号 となっている。


さらに、AirPlayでもUSB DACから出力されるように、 /etc/shairport-sync.conf も次のように書き換えた。
alsa =
{
	output_device = "plughw:1,0"; // "hw:1,0"にすると音飛びしてしまう
...



なぜか、hw に設定すると音飛びしてしまうが、plughw にしたら問題なくキレイに再生できた。
やはり、ラズパイ内臓のラインアウトより、USB DACの方があきらかにタイトでパワフルでクリアなサウンドになる。
安物のUSB DACだろうとあなどれない。

後にさらなる高みを目指すため?、ハイレゾまで対応しているI2S通信のDACを試してみた。
I2Sの設定はI2Cと同じようなもので、難しくはないのでここでは省略する。




もはやDACによる音の違いまでは分からない。

ちなみに、ハイレゾはオシロミュージックで大活躍するようだ。



オシロミュージックの音声を、オシロスコープのXYモードで再現できるか試してみた。
この時、低いサンプリング周波数のDACを使っていたとので、細部の表現がつぶれてしまっている。
もっとサンプリング周波数をあげれば、オリジナル動画と同じキレイなアニメーションが表示されるはず。




アンプ選び


100dB以上ある能率の大きなスピーカーを使っているので、1Wのデジタルアンプでも室内なら十分な音量で鳴らすことができる。1Wのアンプなら、電池駆動も余裕でできたり。


性能をテストしたり。


ちなみに上の写真に写っているiPhoneアプリは、自作のオシレーターアプリだ。
音響実験のために作ったので、宜しければどうぞ。






先ほどのオシレーターアプリでLRの両方からサイン派を出し、オシロスコープでリサージュ図形に歪みがないか確認したりできる。



1Wのデジタルアンプでは流石に低音が物足りなく感じたので、10Wのデジタルアンプを使ってみることにした。チップはYAMAHAのYDA-138-Eで、1000円台で買える台湾製のデジタルアンプだ。



安くても侮るなかれ。部品のひとつ一つが驚くほどしっかりしていて、とても1000円台とは思えない。


スパンッ!スパンッ!と立ち上がりが早い感じの音で、デジタルアンプならではの低音の伸びを感じられた。




最後に


そもそもこのプロジェクトはMacやiPhone、iPadの音を1つのモニタースピーカーで聴こうとしたとき、接続切り替えなどが面倒なのでなんとか簡単にならないかと考え出したのがきっかけだ。

当初は次のようなシステムを構築するつもだった。


Bluetoothレシーバーをデュアルで繋いだり、パッシブミキサーで実験してみたり、ラインセレクターを考案してみたりといろいろ試したり考えたりした。


しかしシステムは複雑になるばかりでどうも納得できるものではなかった。そんなときラズパイをAirPlayサーバーにできることを知り、これだと思って取り掛かったのがこのプロジェクトだ。


Apple製品を使う限りではこの上なく便利でシンプルなシステムが構築できたと思う。それにAirPlayならBluetoothとは違いロスレスで音声を送ることができる。何よりもコードレスになったことの快適さと言ったら!私の場合、机に足をかけリクライニング状態でMacBookを操作することが多いのでコードレスの恩恵はとても大きいのだ!






参考サイト


shairport-sync
【快適】Raspberry Pi 3 でつくるAirPlayサーバ【オーディオ】
shairport-sync installation for a Raspberry Pi
ラズベリーパイにUSBスピーカーを接続して音を出す超簡単な方法(Raspbian Stretch Jessie GUI編)
Raspberry Piでオーディオデバイスが期待通りに動作しなかったときに確認したnつのこと
Raspberry Piにshairport-syncをインストールする
Raspberry pi で Amazon Prime Music が使いたい – 音飛び対策編
OpenBSD発の音声フレームワーク - sndio


関連記事


Raspberry Pi のセットアップ!モニター、キーボードなしでMacからSSH
I2C通信でADコンバータの値を読み込む (Raspberry Pi zero)
Raspberry Pi をAirPlayサーバーにしてオーディオ環境を快適にする!
ラズパイオーディオシステムの省エネ化
スピーカーエンクロージャー製作 (ALTEC 604-8H)
ヘルムホルツ共鳴とバスレフポート設計


あなたにおすすめ