ちょっと間が空いてしまいましたが、前回の記事で Raspberry Pi を NAS 化しましたので、この記事ではNAS の中の音楽データを再生するミュージックサーバの設定を行います。ミュージックサーバとしては、Music Player Daemon(mpd) を使い、スマホなどからNAS内の音楽を再生できるようにします。
今回は pulseaudio を使ってサウンドを出力したのですが、pulseaudio の設定をいじるのは初めてだったので、色々と落とし穴にハマりました。そのハマったポイントも含めて説明していきます。
Table of Contents
軽くおさらい
Raspberry Pi に NAS を構築し、Music Player Daemon(mpd) を使ってミュージックサーバを立ち上げてNASの中に格納された音楽を再生できるようにします。MPD はサーバ/クライアント構成の音楽プレイヤーで、Raspberry Pi にサーバを立ち上げ、スマホやPCのクライアントから音楽が再生することができます。
スマホの音楽を再生するのではなく、NASの中の音楽を再生するので、スマホに音楽を転送する必要はありません。逆に、この構成ではスマホの中の音楽をスピーカーで聴くことはできません。
再掲ですが、図にすると以下のような構成です。
音楽プレイヤーの構築
前回の記事までの手順で Raspberry Pi に HDD を接続して NAS を構成することができました。
続いて、NAS の中の音楽データを再生する機能をインストールします。まずは NAS に音楽データをコピーしてください。以降では share\Music (Raspberry Pi の内部的には /mnt/hdd/share/Music) に音楽データ(.mp3, .m4a ファイルなど)が置かれているものとします。サブフォルダも検索しますので、ディレクトリを作って管理して大丈夫です。
必要なパッケージのインストール
以下のコマンドでインストールします。結構な数のパッケージをインストールするので、時間がかかります。
$ sudo apt install mpd mpc pulseaudio pulseaudio-utils
Music Player Daemon(mpd) とそのクライアントの mpc だけでなく、今回は pulseaudio もインストールします。
pulseaudioはサウンドサーバと呼ばれるもので、簡単に言えば 1つのサウンドデバイスに対して複数のアプリケーションから音声を再生するための仕組みです。以下のページの一番下にある概念図がわかりやすいです。
今のところは mpd しか音声を出力するアプリケーションはいないので、mpdが直接サウンドデバイスに出力してもよいのですが、将来の目論見として Bluetooth スピーカ機能も持たせようと考えているので、pulseaudio 経由で出力することにします。
Pulseaudio デーモンの立ち上げ
systemd に Pulseaudio サービスを登録
pulseaudio は GUI 環境で使われる場合はログインしたユーザで起動するのが一般的らしいです。しかし今の Raspberry pi はログインせずに単体で動作する必要があるので、system-wide なデーモンとして起動させます。
デーモンとして起動させるため、/etc/systemd/system/pulseaudio.service という名前で以下のファイルを作成します。
$ sudo vi /etc/systemd/system/pulseaudio.service [Unit] Description=Pulse Audio [Service] Type=simple ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disable-shm [Install] WantedBy=multi-user.target
作成したら pulseaudio を起動してみます。
$ sudo systemctl start pulseaudio.service
以下のように pulse ユーザで pulseaudio が起動していればOKです。
$ ps aux | grep pulse
pulse 293 0.7 1.8 181568 18116 ? S<sl Sep26 15:01 /usr/bin/pulseaudio --system --disallow-exit --disable-shm
正しく起動できたら、システムの起動時に自動起動するように有効化しておきます。
$ sudo systemctl enable pulseaudio.service
pulse-access グループにユーザを追加
pulseaudio にアクセスできるユーザを追加します。pulse-access グループに所属しているユーザ以外は、たとえ root ユーザでも pulseaudio を操作することはできません。
pulse-access グループに自分のユーザ、root を追加します。root はデバッグの時に使うくらいなので、必須ではありません。
$ sudo usermod -a -G pulse-access ユーザ名 $ sudo usermod -a -G pulse-access root
usermod でグループを変更してもログイン済みのユーザには反映されないため、一度 ssh 接続をログアウトして、再度ログインし直します。もしくはシステムの再起動でもOKです。
再ログイン/再起動後に以下のコマンドを実行して自ユーザが pulse-access に所属していればOKです。XXXXXには自分のグループ名が入っていると思います。
$ groups
XXXXX adm dialout cdrom sudo audio video plugdev games users input netdev pulse-access gpio i2c spi
Pulseaudioの設定: ユーザ権限で勝手に Pulseaudio デーモンが起動しないようにする
pulseaudioで一番最初にハマったのが、ALSA/pulseaudioを操作しようとすると、そのコマンドを実行したユーザ権限でも pulseaudio が起動してしまうという問題でした。
再生テストするために speaker-test コマンドを実行したり、状態を確認しようと pactl コマンドを実行すると、system-wide な pulseaudio デーモンが起動しているにもかかわらず、なぜかユーザ権限でも pulseaudio が起動してしまうという症状です。
例として、piユーザで speaker-test を実行後にこんな感じになります。
$ ps aux | grep pulse pulse 366 1.5 0.9 181200 17948 ? S<sl 22:24 0:02 /usr/bin/pulseaudio --system --disallow-exit --disable-shm pi 814 2.5 0.9 181852 18404 ? Ssl 22:27 0:00 /usr/bin/pulseaudio --daemonize=no
pulseユーザで system-wide なデーモンが起動している傍ら、pi ユーザでもデーモンが起動してしまっています。
色々とグーグル先生に聞いてはアレコレ試したところ、以下のサイトを参考に設定を追加することで、この症状が解消しました。
/etc/pulse/client.confファイルの最後に以下を追加します。
$ sudo vi /etc/pulse/client.conf <省略> default-server = /var/run/pulse/native
設定後、不要な pulseaudio デーモンを止める意味も含めて、Rapsberry Pi 全体を再起動させます。
$ sudo reboot
これで pactl や speaker-test などを実行しても pulseaudio デーモンが複数起動しなくなりました。
Pulseaudioの設定: 強制的にステレオ出力に変更する
続いてハマったポイントは、Raspberry Pi の音声ドライバ(ALSA)としてはステレオをサポートしているのですが、なぜか pulseaudio 経由で再生するとモノラルになってしまうという問題です。
speaker-test コマンドを使うと、再生テストとして左右のチャネルからピンクノイズを再生することができます。
$ speaker-test -c 2
本来なら、左のスピーカーから雑音が流れ、続いて右のスピーカーから雑音が流れるはずなのですが、モノラルになって両方のスピーカーが鳴ってしまいます。
pactl で再生デバイスの情報を取得してみると、以下のようにモノラルと認識されています。
$ pactl list sinks Sink #0 State: SUSPENDED Name: alsa_output.platform-bcm2835_audio.analog-mono Description: Built-in Audio Analog Mono Driver: module-alsa-card.c Sample Specification: s16le 1ch 44100Hz Channel Map: mono Owner Module: 4 Mute: no <<省略>>
こちらの問題は色々と調べましたが、答えがなかなか見つからず手こずりました。
Rapsberry Pi で pulseaudio を使っている例は、ほとんどUSBDACなどを繋げている場合であることが多く、ステレオジャックから音を出す設定例がほとんどなかったためです。あまりこの問題で困っている人はいないのでしょうか??
色々と探した結果、Rapsberry Pi のフォーラムの以下のトピックが参考になりました。
- analog Sound Raspberry PI 4 is mono, not stereo – Raspberry Pi Forums
- Pulse audio and surround – Raspberry Pi Forums
どうやら、ステレオ用のプロファイルで認識される前に、モノラルのプロファイルで認識されてしまうのが問題らしいです。
解決策として、ステレオのプロファイルで認識するデバイス名に hw:0 デバイスを追加します。/usr/share/pulseaudio/alsa-mixer/profile-sets/default.conf というファイルの、[Mapping analog-stereo] セクションの device-strings に hw:%f を追加します。
$ sudo vi /usr/share/pulseaudio/alsa-mixer/profile-sets/default.conf <<省略>> [Mapping analog-stereo] ;device-strings = front:%f # こちらが変更前 device-strings = front:%f hw:%f # 最後に hw:%f を追加 channel-map = left,right paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic priority = 15 <<省略>>
以上の設定を行った後、pulseaudio サービスを再起動します。
$ sudo systemctl restart pulseaudio.service
再度 pactl でデバイス情報を確認すると、ステレオとして認識されているはずです。
pi@raspberrypi:~ $ pactl list sinks Sink #0 State: SUSPENDED Name: alsa_output.platform-bcm2835_audio.analog-stereo Description: Built-in Audio Analog Stereo Driver: module-alsa-card.c Sample Specification: s16le 2ch 44100Hz Channel Map: front-left,front-right Owner Module: 4 Mute: no <<省略>>
Pulseaudio での再生のテスト
色々設定が完了したので、再生のテストを行います。ALSA系のコマンドと Pulseaudio 系のコマンドで確認します。
Raspberry Piにスピーカを接続します。ボリューム設定をしていないため大きな音が鳴る可能性もありますので、まずはスピーカ側のボリュームを絞って試してください。
まずは、ALSA系の確認とステレオの確認も兼ねて前述の speaker-test コマンドを実行します。以下のコマンドを実行して左右のスピーカーから「ザー」というピンクノイズが確認できればOKです。
$ speaker-test -c 2
続いて Pulseaudio 系です。以下のコマンドを実行後、「フロント、ライト」と音声が再生されればOKです。※この音声はモノラルデータなので左右両方から再生されます
$ paplay /usr/share/sounds/alsa/Front_Right.wav
音が再生できたら、pulseaudioデーモンが複数起動していないことを確認します。
$ ps aux | grep pulse
pulse 293 0.7 1.8 181568 18116 ? S<sl Sep26 15:01 /usr/bin/pulseaudio --system --disallow-exit --disable-shm
pi 18107 0.0 0.0 7348 572 pts/0 S+ 10:01 0:00 grep --color=auto pulse
speaker-test や paplay で再生できない場合は、pulse-access グループに所属しているかを確認してください。pulseaudio デーモンが複数起動している場合は前述の default-server の設定を確認してください。音声がモノラルだったら、前述の [Mapping analog-mono]セクションを確認してください。
設定変更後はサービス、もしくはシステム全体の再起動も忘れずに。
ここまでで音楽を再生する環境が整いました。
Music Player Daemon(mpd)の設定
mpd も pulseaudio 経由で音声を出力するので、前述の pulse-access グループに mpd ユーザを追加します。
※これを忘れると音が鳴りません (私がハマったポイント)
$ sudo usermod -a -G pulse-access mpd
mpd の設定は /etc/mpd.conf で行います。
/etc/mpd.conf を以下のように変更します。
--- /etc/mpd.conf.orig 2020-09-28 09:32:24.598415770 +0900 +++ /etc/mpd.conf 2020-09-28 09:36:40.048524957 +0900 @@ -11,7 +11,8 @@ # be disabled and audio files will only be accepted over ipc socket (using # file:// protocol) or streaming files over an accepted protocol. # -music_directory "/var/lib/mpd/music" +#music_directory "/var/lib/mpd/music" +music_directory "/mnt/hdd/share/Music" # # This setting sets the MPD internal playlist directory. The purpose of this # directory is storage for playlists created by MPD. The server will use @@ -82,7 +83,8 @@ # activation is in use. # # For network -bind_to_address "localhost" +#bind_to_address "localhost" # # And for Unix Socket #bind_to_address "/run/mpd/socket" @@ -91,6 +93,7 @@ # to. # -#port "6600" +port "6600" # # This setting controls the type of information which is logged. Available # setting arguments are "default", "secure" or "verbose". The "verbose" setting @@ -121,7 +124,7 @@ # This setting enables automatic update of MPD's database when files in # music_directory are changed. # -#auto_update "yes" +auto_update "yes" # # Limit the depth of the directories being watched, 0 means only watch # the music directory itself. There is no limit by default. @@ -236,15 +239,17 @@ # # An example of an ALSA output: # -audio_output { - type "alsa" - name "My ALSA Device" -# device "hw:0,0" # optional -# mixer_type "hardware" # optional -# mixer_device "default" # optional -# mixer_control "PCM" # optional -# mixer_index "0" # optional -} +#audio_output { +# type "alsa" +# name "My ALSA Device" +## device "hw:0,0" # optional +## mixer_type "hardware" # optional +## mixer_device "default" # optional +## mixer_control "PCM" # optional +## mixer_index "0" # optional +#} # # An example of an OSS output: # @@ -310,12 +315,12 @@ # Please see README.Debian if you want mpd to play through the pulseaudio # daemon started as part of your graphical desktop session! # -#audio_output { -# type "pulse" -# name "My Pulse Output" +audio_output { + type "pulse" + name "My Pulse Output" # server "remote_server" # optional # sink "remote_server_sink" # optional -#} +} # # An example of a winmm output (Windows multimedia API).
変更している内容は以下のとおりです。
- music_directory に /mnt/hdd/share/Music を指定
- bind_to_address “localhost” をコメントアウトして外部から接続可能に
- 自動更新を有効化 (ファイルを追加すれば勝手にDBに登録してくれます)
- 音声の出力先としてALSAを無効化して、pulseaudioを有効化
変更が終了したら mpd を再起動します。
$ sudo systemctl restart mpd.service
初めて起動した時はデータベースが空なので、MPD クライアントからファイルのスキャンを実行します。
※このスキャンを行わないとライブラリに楽曲が表示されません! (私がハマったポイント)
ここでは mpc コマンドを使います。
$ mpc update
楽曲数にも依りますが、スキャンが完了するまで結構時間がかかります。/var/log/mpd/mpd.log というログファイルに処理しているファイル名が出力されますので、tail -f などで表示しながらスキャンが終わるまで待ちます。
スキャンされたかどうかは mpc ls で確認できます。DBに登録されたディレクトリ/ファイルが表示されていれば OK です。
$ mpc ls
MPDクライアントからの再生テスト
PC の場合は Cantata、Android は MPDroid が有名なようです。
Cantataの場合は以下の等に「ホスト」のところに Raspberry Pi の IP アドレスを設定すれば接続できます。他のクライアントでも同様です。
接続に成功すると、「フォルダ」や「ライブラリ」のタブに楽曲一覧が表示されるはずです。
再生したい楽曲をキューに追加して再生できるかを確認してください。
再生できない場合は、pulseaudio デーモンが起動しているか、pulse-access グループに mpd ユーザが追加されているかを確認してみてください。
/var/log/mpd/mpd.log にエラーが出ていないかも確認のポイントです。
正しく楽曲を表示できて再生ができたら音楽サーバの立ち上げ完了です。お疲れ様でした。
おまけ: 曲名などが文字化けする場合
古いMP3など、ID3タグ内の日本語がSJISで保存されていたりすると mpd 上では文字化けして表示されてしまいます。
私は初代 iPod が発売されるよりも前から、かれこれ20年以上(遠い目) mp3 で楽曲を保存していたので、古めの曲はほとんど文字化け状態でした。
ということで ID3 タグを編集して漢字コード等を修正します。
以下のサイトが参考になります。今は ID3 タグは ID3v2.3 UTF-16で保存するのが無難なようです。
Windows PC にて mp3tag というツールを使い、NAS上のタグを変更していきます。
変更したファイルは数秒後に自動的に mpd に認識されますので、変更を保存後、すこし待ってMPDクライアントから確認すれば文字化けが直っていることが確認できます。
“Raspberry piをNAS兼音楽プレイヤーにする(MPD編)” への1件のフィードバック