Sep 06, 2020

Pulseaudioを使ってRaspberry piにAmazon Prime Musicを転送再生する(9月8日追記)

今回はPulseaudioを使ってみたという話だ。
実は、Pulseaudioで音楽データを転送するというのは数年前にも考えたことがあって、でもスキル不足で実現していなかった。
今回、何故そんなことをしたのかというのは省略。
運用のノウハウだけ記録しておこうと思う。

参考にしたサイトのアドレスは以下の通り。他にも見たけど忘れた。

https://www.alprovs.com/wordpress/?p=439
https://penkoba.hatenadiary.org/entry/20130809/1376064438
http://bluewidz.blogspot.com/2018/04/oslinux-virualboxdebian-8.html
https://www.it-swarm.dev/ja/pulseaudio/

用意したもの。

  1. 普段使いのノートPC、Compaq 6730b。
    OSはFedora。既にPulseaudioはインストールされていて、クライアントとして機能させる。
    FirefoxでAmazon Prime Musicにログインし、音声データをPulseaudioサーバーに送信する。

  2. Raspberry Pi2。
    OSはpiCore9.0.3。Pulseaudioサーバーとして動かす。Amazon Prime Musicのデータを受けて、usb dacに送る。

  3. usb dacはRATOCのRAL-24192ut1を使う。
    RCA出力をオーディオテクニカのAT-SP150 bkで受ける。

こんなイメージ。

Pulseaudio

まずサーバーとなるRaspberry pi2をセッティングしていく。
ダウンロードしたpiCore9.0.3をmicroSDカードに書き込む。今回はusb dacしか使わないので「config.txt」を下記のように設定して、dtparam=i2c、spi、i2s、本体のオーディオ出力の使用を止めている。そうすることでalsaが認識するオーディオ出力がusb dacに固定されるメリットもある。

# Enable peripheral buses
dtparam=i2c=off,spi=off,i2s=off

# Enable onboard audio
dtparam=audio=off

カードをRaspberry Pi2に刺して起動。
sshでログインし「filetool.sh -b」を打つ。「sudo fdisk -u /dev/mmcblk0」でパーティションを拡張。リブート。
再ログインして「sudo resize2fs /dev/mmcblk0p2」で拡張したパーティションを固定。
vi /opt/.filetool.lst で「usr/local/etc」を追加。
filetool.sh -bで保存、で準備完了。
このあたり詳細は過去のエントリーで繰り返し書いているので省略。

pulseaudioとalsaをインストール。
最近は「tce」コマンドから項目を選択してインストールすることが増えた。
pulseaudio.tczのインストールとalsa-utils.tczのインストールの操作だけで完成する。実際にはこの2項目の他にも必要なtczが同時に多数インストールされる。

2021.04.06. 追記。alsa-tczもインストール操作したほうが良さそう?
alsa-utilsだけでalsaもインストールされると思ったんだけど、先にalsa-utilsを入れたらインストールされなかった。要注意ということで。

tceコマンドで表示されるpulseaudioの説明から引用。

howto:
alsa needs to be working for whatever sound device you have.
Create dbus entry for booting into X
$ echo 'dbus-launch --sh-syntax --exit-with-session' > ~/.X.d/dbus
$ /usr/local/etc/init.d/dbus status [Check dbus is running]
If not running, start dbus with
$ sudo /usr/local/etc/init.d/dbus start
If dbus was not, initially running, add a command to start it next reboot
$ sudo echo '/usr/local/etc/init.d/dbus start' >> /opt/bootlocal.sh

exit to console
startx
$ pulseaudio -vv [to test]
When it is running correctly
echo "start-pulseaudio-x11" > ~/.X.d/pulseaudio

if a bluetooth sound devices is paired and configured, pulseaudio should find it automatically if the daemon is running

dbusが動いていないとpulseaudioは動かないらしい。
/usr/local/etc/init.d/dbus status で確認したところ、動いていない。

sudo /usr/local/etc/init.d/dbus start で動く。
下記コマンドで、OS起動時にdbusが動くようにbootlocal.shファイルを編集、設定。
sudo echo '/usr/local/etc/init.d/dbus start' >> /opt/bootlocal.sh

今回、~/.X.d/dbusの設定はしていないが、問題ないようだ。

次にpulseaudioの設定。

$ mkdir .pulse
$ cp /usr/local/etc/pulse/default.pa ~/.pulse
$ vi .pulse/default.pa

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

ホームに.pulseディレクトリを作成。
ここに設定ファイルのdefault.paをコピーする。
この設定ファイルの中の「load-module module-native-protocol-tcp」に、上記のように記述を書き加えることで、ネットワークからのデータを受けることが出来るようになる。
192.168.1.0/24の部分は、各自のネットワーク環境に合わせる。

一応、alsaの状況を確認。「aplay -l」でusb接続しているDACが確認出来たら問題ないだろう。
filetool.sh -bで、dbusとpulseaudioの設定を保存。
これでサーバー完成。
デーモンとしてpulseaudioを起動するときはsshから「pulseaudio -D」、終了には「pulseaudio -k」。

次に、クライアント側の6730bを設定。設定というか、使い方だ。
先ずターミナルソフトでコマンドを打つ。

$ export PULSE_SERVER=192.168.1.xx

これで、このターミナルウィンドウから起動させるプロセスが、赤字のアドレスのpulseaudioサーバーに音声データを伝送するようになる。つまり、赤字の部分はRaspberry Pi2のipアドレスということだ。
同じターミナルウィンドウからコマンドを打ってfirefoxを起動させる。

$ firefox

firefoxが起動したら、amazonにログインし、prime musicの音源を鳴らせばいい。このfirefoxが出力する音声はlanを通じてRaspberry Pi2に転送される。うまくいけばusb dacから音が出る。

注意点としては、ネットワークが遅いと音がぶちぶち途切れる。うちでは6730bの無線lanが遅すぎて音楽にならず、有線100Base-Tでつないだら問題なく鳴るようになった。
ちなみにRaspberry Pi2の出力フォーマットを確認したところs32le 44100で、そこそこのデータ量がある。6730bのネットワーク出力をモニターしてみたら、400KiB/s前後でデータ転送されている。
youtubeの音源だとどうなるか確かめたら、s32le 48000。サイトや音源によって変化するようだ。
DACをRAL-2496ut1に換えると、s16leにフォーマットが変わる。こういう調整はRaspberry Pi2がやってくれているみたい。

あと、クライアントからの信号が止まって暫くしたらサーバーのpulseaudioは自動的にシャットダウンするようで、使う直前にsshでログインして起動しないといけない。
どこかで何か設定できるんだろうけど、確認していない。

さて、2496ut1の光デジタル出力をメインシステムにつないでみたのだけど、問題が。
直接つなぐと音量が大きすぎる。
というか、うちのアンプのボリュームが、普通のデジタル出力からみたら上げ過ぎなのだ。
普段はmpd/libsamplerateで768/32にアップサンプリングしデジタルボリュームで50%前後に絞って出力しているので、逆にアンプのボリュームは上げている。ここに普通のデジタル出力から入力したら、大音量になる。
Firefox上のPrime Musicにもボリュームがあるのだけど、これを下限ギリギリまで下げることになる。モニター画面上、ミリ単位の調節になって使いにくい。

pulseaudioサーバーの音量を下げられるコマンドもあるらしいが、どうもうまくいかない。うちではalsaが動かなくなって音が出なくなった。ここで考えてみたら、s16le 44100のフォーマットで、Raspberry Pi2でデジタルで音量調節というのは、音質に配慮するなら使わないほうがいい手法ではないのか、と思い至る。
そこで、あんまりスマートじゃないけど、メインシステムにつなぐのにはOdeon-Liteを使うことにした。ボリュームがついているので使いやすい音量に設定できる。Odeon-Liteにはusb入力がないので、2496ut1をDDコンバーターとして使う。

突っ込んだ音質評価はしていないが、Prime Musicの音源もそこそこの音質で聞けると思う。

8日、追記。
pulseaudioサーバーの音量を下げるコマンドについて書いておく。
参考にしたサイトは下記。
http://masahiroshiomi.jp/blog/pulseaudio/286/
まず、デバイスの状況を調べるコマンド。

pactl list sinks

いろんな項目について詳細な情報を表示してくれる。
Latency: 79996 usec, configured 75012 usec
よく見たら、こんな記載があったりする。あんまりいい数値とはいえないのかな。どこのLatency?とか、よく分かっていない。

音量を調整するコマンドは下記の通り。

pactl set-sink-volume 0 50%

0というのはデバイスの番号じゃないかと思う。「50%」のところで音量を調整する。
調整後に「pactl list sinks」で確認すると下記のように表示される。

Volume: front-left: 32768 /  50% / -18.06 dB,   front-right: 32768 /  50% / -18.06 dB

音声再生中でもコマンドを打ったら速やかに音量を変更できた。
だけど、音質はどうかといえば、結局は「100%」にしてOdeon-liteやSM-SX100のボリュームを調整したほうが良いように聞こえた。

更に追記。
結局、Odeon-liteは外してしまった。
2496ut1からの光出力をSM-SX100に直に入力することにした。セレクターとボリュームを弄るだけでいいんだから簡単だ。
Brooklyn Ampにはその手は使えないので、他の方法を考えないといけない。

2021年1月1日、追記。「pactl set-sink-volume」がどんな感じに効くのかメモしておく。
pulseaudioの扱いにもだいぶ慣れて、ストリーミング用の日常音源として定着した。Amazon PrimeではなくDeezerを使っている。

pactl set-sink-volume 0 100%
pactl list sinks
Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB

pactl set-sink-volume 0 95%
Volume: front-left: 62259 /  95% / -1.34 dB,   front-right: 62259 /  95% / -1.34 dB
Volume: front-left: 58982 /  90% / -2.75 dB,   front-right: 58982 /  90% / -2.75 dB
Volume: front-left: 55705 /  85% / -4.24 dB,   front-right: 55705 /  85% / -4.24 dB
Volume: front-left: 52428 /  80% / -5.81 dB,   front-right: 52428 /  80% / -5.81 dB
Volume: front-left: 51773 /  79% / -6.14 dB,   front-right: 51773 /  79% / -6.14 dB
Volume: front-left: 49152 /  75% / -7.50 dB,   front-right: 49152 /  75% / -7.50 dB
Volume: front-left: 45875 /  70% / -9.29 dB,   front-right: 45875 /  70% / -9.29 dB


pactl set-sink-volume 0 65536
pactl list sinks
Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB

pactl set-sink-volume 0 61440
Volume: front-left: 61440 /  94% / -1.68 dB,   front-right: 61440 /  94% / -1.68 dB
Volume: front-left: 57344 /  88% / -3.48 dB,   front-right: 57344 /  88% / -3.48 dB
Volume: front-left: 53248 /  81% / -5.41 dB,   front-right: 53248 /  81% / -5.41 dB
Volume: front-left: 49152 /  75% / -7.50 dB,   front-right: 49152 /  75% / -7.50 dB
Volume: front-left: 45056 /  69% / -9.76 dB,   front-right: 45056 /  69% / -9.76 dB
Volume: front-left: 40960 /  63% / -12.25 dB,   front-right: 40960 /  63% / -12.25 dB
Volume: front-left: 36864 /  56% / -14.99 dB,   front-right: 36864 /  56% / -14.99 dB
Volume: front-left: 32768 /  50% / -18.06 dB,   front-right: 32768 /  50% / -18.06 dB

%、整数での指定で設定するとこんな感じ。
うちでは100%以上の音量に上げることは無いので、下げる指定のみ試している。
整数での指定は、16bit=2の16乗=65536、そこから4096ずつ引いていった数値。8回引いたら32768で50%、15bitの情報量に圧縮?になるようで、相応の音質劣化がある。
聴感上、70%以上で使いたい感じ?

不思議なのは、pulseaudioのデジタルボリュームを使うよりも、Firefox、Webプレーヤーのボリュームを使うほうがまだ劣化が少ないような気がすることだ。mpdのボリュームを使っているときにも意外に劣化が少ないと感じるのだけど、それと似たような感触。pulseaudioのボリュームで音量を落とすより、劣化が目立たないように感じる。
全く理由は分からないが。気のせいかもしれないのだけど。

小数点付きの数字で指定だと、以下のような感じ。
音量2.0倍で+6dB、音量2分の1(0.5倍)で-6dBということで概ね相関している。
dBでの指定も出来るんだけど、%と整数による指定はデジタルな指定で、小数点付き数値とdBでの指定は音量によるものということらしい。

pactl set-sink-volume 0 3.0
Volume: front-left: 94519 / 144% / 9.54 dB,   front-right: 94519 / 144% / 9.54 dB

pactl set-sink-volume 0 2.0
front-left: 82570 / 126% / 6.02 dB,   front-right: 82570 / 126% / 6.02 dB

pactl set-sink-volume 0 1.5
Volume: front-left: 75020 / 114% / 3.52 dB,   front-right: 75020 / 114% / 3.52 dB

pactl set-sink-volume 0 1.25
Volume: front-left: 70597 / 108% / 1.94 dB,   front-right: 70597 / 108% / 1.94 dB

pactl set-sink-volume 0 1.0
Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB

pactl set-sink-volume 0 0.75
Volume: front-left: 59543 /  91% / -2.50 dB,   front-right: 59543 /  91% / -2.50 dB

pactl set-sink-volume 0 0.5
Volume: front-left: 52016 /  79% / -6.02 dB,   front-right: 52016 /  79% / -6.02 dB

pactl set-sink-volume 0 0.33
Volume: front-left: 45288 /  69% / -9.63 dB,   front-right: 45288 /  69% / -9.63 dB

dB指定だと、ちょっと扱いが他の指定方法と違ってくる。

pactl set-sink-volume 0 3.0dB
Volume: front-left: 73533 / 112% / 3.00 dB,   front-right: 73533 / 112% / 3.00 dB

pactl set-sink-volume 0 -3.0dB
Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB

pactl set-sink-volume 0 -3dB
Volume: front-left: 58409 /  89% / -3.00 dB,   front-right: 58409 /  89% / -3.00 dB

pactl set-sink-volume 0 +3dB
Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB

指定した値の前に「+ -」を付けると「増減」の指定になる。
つまり「3.0dB」と指定したら「3.0dBの音量」に変更する指定だけど、「+3dB」「-1.5dB」みたいな指定をすると、現在の数値から増減指定になるということだ。

実は「+ -」で「増減」を指定するのは%、整数、小数点付き数字での指定でも出来る。

pactl set-sink-volume 0 -25%
Volume: front-left: 49152 /  75% / -7.50 dB,   front-right: 49152 /  75% / -7.50 dB
pactl set-sink-volume 0 -25%
Volume: front-left: 32768 /  50% / -18.06 dB,   front-right: 32768 /  50% / -18.06 dB
pactl set-sink-volume 0 +50%
Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB


pactl set-sink-volume 0 -1024
Volume: front-left: 64512 /  98% / -0.41 dB,   front-right: 64512 /  98% / -0.41 dB
pactl set-sink-volume 0 -1024
Volume: front-left: 63488 /  97% / -0.83 dB,   front-right: 63488 /  97% / -0.83 dB
pactl set-sink-volume 0 -2048
Volume: front-left: 61440 /  94% / -1.68 dB,   front-right: 61440 /  94% / -1.68 dB
pactl set-sink-volume 0 +4096
Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB


pactl set-sink-volume 0 +1.0
Volume: front-left: 82570 / 126% / 6.02 dB,   front-right: 82570 / 126% / 6.02 dB
pactl set-sink-volume 0 +1.0
Volume: front-left: 104031 / 159% / 12.04 dB,   front-right: 104031 / 159% / 12.04 dB
pactl set-sink-volume 0 -0.5
Volume: front-left: 82570 / 126% / 6.02 dB,   front-right: 82570 / 126% / 6.02 dB
pactl set-sink-volume 0 -0.5
Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB

こんな感じ。

Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.