Pulseaudio の高音質化について思うことです.
最近,pulseaudio で色々遊んでいるのですが,どうせなら高音質化してみようと設定とか見直してて思ったことを少し書きたいと思います.
いつもの通り,結論から言うと,
pulseaudio は意外とデフォルトのまま使うのが良いのかもしれないなぁ……
です.
pulseaudio のお手軽高音質化?
pulseaudio の高音質化については英語の記事ですが,
に倣うのが簡単です.この記事によると,とりあえず,
- ~/.config/pulse/daemon.conf
- /etc/pulse/daemon.conf
のいずれかに以下の設定を入れれば良いそう.それぞれの設定項目の概要説明もキチンとありますし,実際試してみると若干 CPU の使用率は上がりますが,問題なく使えます.
default-sample-format = float32le default-sample-rate = 48000 alternate-sample-rate = 44100 default-sample-channels = 2 default-channel-map = front-left,front-right default-fragments = 2 default-fragment-size-msec = 125 resample-method = soxr-vhq enable-lfe-remixing = no high-priority = yes nice-level = -11 realtime-scheduling = yes realtime-priority = 9 rlimit-rtprio = 9 daemonize = no
もちろん設定したら,
$ systemctl --user restart pulseaudio.service
とか
$ pulseaudio -k $ pulseaudio --start
のようにして pulseaudio を再起動させてやる必要があります.
なお,より尖った設定をしてみたい人は,
default-sample-rate = 96000
とか
resample-method = src-sinc-best-quality
を試してみても良いかもしれないです.
なにが問題か?
しかし上の設定にはある種の問題があります.それはなにかと言うと,非常に高精度かもしれませんが,音が
再サンプリングされてしまう
ってことです.
ただし,これは pulseaudio がサウンドサーバーって位置づけからすると仕方ない部分ではあります.届けられた複数の音をミキシングして不具合なく出力するには,全ての音のサンプリン形式・周波数等が一致してないとダメだからです.だから,再サンプリングは仕方がないけど,せめて高精度にそれをしたい,ってのが上の設定の意図するところな訳ですね.
再サンプリングしない方法はあるか?
じゃあ,pulseaudio に再サンプリングさせない方法があるのかって言うと,実はキチンと設定項目に用意されています.設定ファイルに,
avoid-resampling = yes
を入れておくと,不必要な場合は再サンプリングしないようにできるようです.実際設定してみると,
$ pacmd list-sink-inputs 1 sink input(s) available. index: 6 ..... resample method: copy .....
のようになって,再サンプリングせずそのまま入力された音データを copy していることが分かります(もちろん必要な場合は再サンプリングされてしまいます).
必要がなければ再サンプリングされず,必要があれば高精度にサンプリングされるようにできましたのでメデタシメデタシ……と言いたいところですが,それ以前の問題点があることに気が付きました.
音源はなに?
その問題点とは,そもそも,
もともとの音源のサンプリング形式・周波数はそれほど高精度ではないことが多いよなぁ……
ってことです.
私が持ってる音源で最も高音質なのが CD を FLAC 化したもので,サンプリングは 44.1kHz/16bit で行われています.これ以外によく聴くのは Amazon の Prime Music ですが,そもそも圧縮音源です.なお,Amazon の Prime Music の場合,chrome からの出力は float32le, 2ch, 44100Hz で行われているようです.
$ pacmd list-sink-inputs 1 sink input(s) available. index: 5 ..... current latency: 36.46 ms requested latency: 23.22 ms sample spec: float32le 2ch 44100Hz channel map: front-left,front-right ステレオ resample method: copy module: 12 client: 14 <Chromium> properties: application.icon_name = "google-chrome" media.name = "Playback" application.name = "Chromium" native-protocol.peer = "UNIX socket client" ....
いずれにせよハイレゾでも何でもない(float32le の分高精度ではありますが)です.
pulseaudio に(SONY の DSEE などの)アップスケーリング技術があるのなら,もともと 44100Hz でサンプリングされている曲を 96000Hz とかにする意味もありますが,そんなものもちろんありません.つまり,普通の音源で使う限り pulseaudio のこのあたりの設定をあまり高音質側にする意味はないんじゃないのかなとおもっています.だから,私の場合は今のところは以下だけ設定に入れることにしました.
avoid-resampling = yes resample-method = soxr-vhq
不必要な場合は再サンプリングなし,必要な場合は少し CPU は食いますがキレイに再サンプリングしてねって感じですね.
以上!