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/
用意したもの。
普段使いのノートPC、Compaq 6730b。
OSはFedora。既にPulseaudioはインストールされていて、クライアントとして機能させる。
FirefoxでAmazon Prime Musicにログインし、音声データをPulseaudioサーバーに送信する。Raspberry Pi2。
OSはpiCore9.0.3。Pulseaudioサーバーとして動かす。Amazon Prime Musicのデータを受けて、usb dacに送る。usb dacはRATOCのRAL-24192ut1を使う。
RCA出力をオーディオテクニカのAT-SP150 bkで受ける。
こんなイメージ。

まずサーバーとなる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.shexit 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
こんな感じ。
wikieditish message: Ready to edit this entry.
A quick preview will be rendered here when you click "Preview" button.