pulseaudio を使って Raspberry Pi [から|へ] 音を飛ばす

pulseaudioのネットワーク機能を使うと、音声をリモートマシンから出力することができます。
この仕組みを使って、Raspberry Piにスピーカーを繋がずに別のマシンのスピーカーを使って音楽プレイヤーや音声合成アプリを使用したり、逆にRaspberry Piをリモート(ワイヤレス)スピーカーとして仕立てたりといったことができます。

同様のことを行う手段として、BluetoothA2DPを使う方法がありますが、以下にそれぞれの長所をあげてみます。

pulseaudioのネットワーク機能

  • 設定が簡単
  • 非圧縮なので音が良い

A2DP

  • 対応クライアントが多い(Winやスマホ等)

これらは排他ではないので本気でリモートスピーカーとしたい場合は両方立てておけばよいのですが。
A2DPに関してはまた別の機会に紹介できればと思います。
(2013.9.11 追記:こちらに書きました

以下、Raspberry Pi(raspbian)とFedora16を使って両方向とも試した例について紹介しますが、他のdistroでもそんなに変わらないと思います。

必要パッケージのインストール(サーバー側、クライアント側とも)

Debian系、RedHat系ともに paprefs というパッケージをインストールします。
Debian系(raspbian含む)

% sudo apt-get install paprefs

RedHat

% sudo yum install paprefs

サーバ側(音を受け取ってスピーカーから鳴らす方)

pulseaudio設定

まずはユーザープロセスとしてpulseaudioデーモンを走らせる例を示します。
システムデーモンとしてpulseaudioを走らせる場合(Raspberry Piをリモートスピーカーとして使うなど)については後述します。

/etc/pulse/default.pa を ~/.pulse にコピーして、load-module module-native-protocol-tcp に接続を許可するIPを指定して有効にします。

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.1.0/24

または

load-module module-native-protocol-tcp auth-anonymous=1

など。

また、Raspberry Piの場合は下記設定をしておいた方が良いようです。
/etc/pulse/daemon.conf

resample-method = trivial
default-sample-rate = 48000

これをやっておかないと様々なサンプリングレートの音が再生できません。
また、当初44.1kのCDクオリティの音を再生した時に途中で再生が止まってしまうという現象が起きていたのですが、この設定をしたら解消しました。

さらにこれもRaspberry Piの場合ですが、再生開始時にプチっという音が鳴るのが気になる場合は
~/.pulse/default.pa で下記をコメントアウトすると防げるようです。

#load-module module-suspend-on-idle

以上の設定をしたら、pulseaudioを再起動します。

% pulseaudio -k
% pulseaudio -D

一方、システムデーモンとしてpulseaudioを走らせる場合は、ここまで ~/.pulse/default.pa に行った設定を /etc/pulse/system.pa に行い、また
/etc/default/pulseaudio で

PULSEAUDIO_SYSTEM_START=1

とします。
マニュアルでシステムデーモンを起動するときは以下のようにします。

% sudo service pulseaudio start
Firewall設定

TCP 4713番が通るようにします。
Raspberry Piの場合はデフォルトではとくにファイアウォールは効いていないのでそのままでOKです。

Fedora16のiptablesの設定例を以下に示します。
/etc/sysconfig/iptables

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
 ...
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4713 -j ACCEPT
 ...
-A INPUT -j REJECT --reject-with icmp-host-prohibited
 ...
COMMIT
sudo systemctl restart iptables.restart

クライアント側(オーディオプレイヤー等が走り、音を送信する方)

pulseaudioを走らせます。

% pulseaudio -D

環境変数 PULSE_SERVER に、サーバのホスト名またはIPを設定します。

% export PULSE_SERVER=pulse_server.example.com

以上です。
あとはALSA対応のオーディオプレイヤーで音を再生すれば、サーバー側から音が鳴るはずです。

% aplay xxx.wav

まとめ

Raspberry Pi固有のtipsが少しありましたが、基本的な設定はとてもシンプルであっという間にできます。
pulseaudioが動作するプラットフォーム同士であれば活用したいですね。