先日、Spotifyアプリを現行版に切り換えた。アンプなどの改良の効果か、以前試した時に起こった耳の問題が起こらず安心していたのだが、別の問題が発覚した。それは、音量正規化をonにしているのに、他より小さく聞こえる曲(演奏)があることだ。
実は少し前から気付いていて、その時に調べたのだが、正規化しても演奏ごとの音量に ある程度の幅ができることや、主観的な差(音の作りで聞こえ方が違うのと耳の調子)ではないかと思って居た。しかし、今日、TOTOの"Africa"が明らかに小さく聞こえたので、ebumeterというプログラムで音量(ラウドネス)を測ってみた。比較のため、普通の音量に聞こえるELOの"Don't bring me down"も測った。以下にIntegrated loudness("I")を示す。なお、アプリの音量正規化のモードは"Normal"である。
- Spotifyの音量正規化Normalでの音量(ラウドネス, LUFS)
- Africa: -22.8
- Don't bring me down: -17.0
両者の差は5.8 LUFS(dB)と2倍近く、Africaが小さく聞こえるのも無理はない。
参考までに、"Africa"の正規化offの場合と旧版Spotifyと別の再生アプリ(gmusicbrowser, GMB)での正規化なしでの音量(ラウドネス, LUFS)を示す。
-
- Spotify(新版, 音量正規化: off): -22.8
- Spotify(旧版, 音量正規化: Normal): -17.6
- GMB(音量正規化: off): -15.2
不思議なことに、正規化をoffにしても同じ音量となった。これは、正規化をonにしているのにonになっていないように感じたことに合っている。
旧版での"Don't bring-"の音量は測定していないが、新版と同じとすれば 音量が揃っているので、聴感に合う。それから、メディアやバージョンが異なるせいか(手持ちはBlu-spec CD, Spotifyは無印)、GMBでの音量はSpotifyより大きい。
アプリの設定を いろいろ変えて試したが、効果はなかった。それで、アプリにバグがあって、"Normal"モードでは正規化されないのかと思った。
それで、(別の理由で以前やっていたように、)全体的に音量が小さいQuietモードの出力をJACKのアンプで増幅して音量を上げるようにしてみた。すると、どういう訳か、耳に問題(軽い耳閉感)が起こった。原因は、ピークの大きい演奏を増幅すると、ピークがオーバーフローしてクリップして音が歪むからではないかと推測している。だから、Quietモードでも増幅しなければ良さそうなことが分かった。
それで更に、そもそも どういうことか検討したら、音量が小さい演奏があるのはアプリのバグではなさそうなことが分かった。: Spotifyの音量正規化に関する資料を良く読み、試しにゲインなどを計算したら分かった。以下に重要な箇所を引用する(太字は筆者)。
Positive or negative gain compensation gets applied to a track while it’s playing.
-
- Negative gain is applied to louder masters so the loudness level is -14 dB LUFS. This lowers the volume in comparison to the master - no additional distortion occurs.
- Positive gain is applied to softer masters so the loudness level is -14 dB LUFS. We consider the headroom of the track, and leave 1 dB headroom for lossy encodings to preserve audio quality.
Example: If a track loudness level is -20 dB LUFS, and its True Peak maximum is -5 dB FS, we only lift the track up to -16 dB LUFS.
上の例(Example)の計算を細かくすると、以下になるだろう。
本来のゲインG= 基準音量 Ref(-14) - Loudness(-20)= 6 dB
Gで増幅した場合のヘッドルーム H= TruePeak(-5) + G(6)= 1dB (オーバーフロー → クリップ)
確保したいヘッドルーム H'= -1dB なので、修正ゲイン G'= H'(-1) - TruePeak(-5) = 4dB
修正後の基準音量 Ref'= L(-20) + G'(4)= -16 LUFS:上に合う
それで、問題の"Africa"(True peakは推定-0.6dBFS)では どうなるかと言うと、
本来のゲインG= 基準音量 Ref(-14) - Loudness(-22.8)= 8.8 dB
Gで増幅した場合のヘッドルーム H= TruePeak(-0.6) + G(8.8)= 8.2dB (オーバーフロー)
確保したいヘッドルーム H'= -1dB なので、修正ゲイン G'= H'(-1) - TruePeak(-0.6) = -0.4dB
修正後の基準音量 Ref'= L(-22.8) + G'(-0.4)= -23.3 LUFS: 元の音量-22.8 LUFSとほとんど変わらない。
と、音量正規化後の音量は聴感や実測した音量(LUFS)に合う。更に、想像だが、修正後のゲイン(G')が負の場合には正規化しないとすると音量が変わらないので、実測値と一致する。
なお、Quietの場合も、修正ゲインG'と修正後の基準音量Ref'はNormalと同じ-23.3LUFSとなり、基準音量(-19LUFS)より小さいが、Normal(基準音量は-14LUFS)より差が小さくなる(9.3 dB (2.9倍) → 4.3 dB (1.6倍))ために目立たないのではないか。
実際にQuietで聴き・音量を実測したら、聴感も数値も見事に揃った。実測の音量は以下である。
- Spotifyの音量正規化Quietでの音量(ラウドネス, LUFS)
- Africa: -22.8
- Don't bring me down: -22.0
また、別のレベルメータで調べたところ、クリップしていない(最大値が0dBFS未満)ことも確認した。
そのためか、今のところ耳の問題も起こっていないので、これで一件落着か。
とは言え、いつものように、以下のような余計な考え・こだわりはあるw
Quietにして全体の音量が小さくなったため、(本物の)アンプのボリュームを少し(5dB, 約1.8倍)大きくする必要があるが、まあ仕方ない。1.8倍は大きく見えるが、ボリュームの特性上、今までより少し(時計の5分分未満, 10°くらい?)回転が増える程度だ。
ただ、(上に書いた、以前のJACKのアンプでの増幅の理由に関係するが、)DACからの出力の精度やダイナミックレンジ(有効数字的なもの)が約1ビット減る(1/2になる)ので、その分音質は悪くなるはずだ。増幅してクリップするのと、ビット数が減るのとどちらが良いかの話になった。
丁度良いゲインと良いコンプレッサーで「うまく」増幅するといいのだろうが、JACKには良いコンプレッサーがなさそう、かつ、設定が難しいので、とりあえずは これで行こう。
あと、期待混じりであるが、ほとんどの音源は16ビット精度で、PCの内部では浮動小数点数で処理され、DACは24ビットなので、DACに出す時の変換で1ビット分が消えずに残る可能性がある。それなら音は悪くならない。せいぜい、DACから出る信号が弱いために雑音が入りやすくなる程度だ。そうであれば、コンプレッサーを入れて常に音を変質させるより ずっと良い。
ただ、そうは言っても、アナログ信号が弱いと雑音が入りやすいのは確かだ。そこで、音量正規化の時だけ(JACKで)クリップしない程度に増幅して、ちょっと大き目に出せれば(気分が)良さそうだ。
が、Spotifyが音量正規化しているかどうかは設定だけでは分からないという問題がある。: 音量正規化の設定がonでもアルバムを再生する時はoffになる、賢く便利だけど ある意味余計な お世話的機能があるためだ。
実際に音量正規化しているかの状態は外部から取得できないので、例えば再生キュー内の曲のアルバムが同じかどうかで判断(推測)することが考えられるが、面倒なうえに時間が掛かる。仮に再生開始時に判断して増幅するかどうかを変更するとすれば、演奏の先頭の音量がおかしくなる可能性がある。
と、ちょっとした思い付きでも実現は面倒だ。どうにかできないかAIに聞けば、教えてもらえるのだろうか??
例によって だらだらしたので まとめると、(現行版の)Spotifyアプリで音量正規化をNormalにしていて、やたらに音量が小さい曲(演奏)がある場合は、Quietにしてボリュームを上げれば良いことが分かった。これはLinux版だけなのか、他のプラットフォームでも有効なのかは分からない。
参考・補記
検索して この問題(現象)を調べたけど同じものは見付からず、Spotifyのフォーラムに類似のもの(2022)があったものの、例によって未解決だった。もしかしたら同じなのかも知れないが、分からない。
それから、これはLinux版固有なのかも不明だ。想像だが、Linux版が新しくなった時に音量正規化の方法が変わり、他のアプリ(例: スマフォ用)と共通になったのかも知れない。そうであれば、Linux版以外でも起こるかも知れない。
最初に書いた、以前新版を試した時に起こった耳の問題は、これとは関係なさそうだ。というのは、上に書いたように、Normalではクリップするほど無理に増幅しないため、音量が小さい代わりに歪みが発生しないからである。
それでは旧版(音量が揃っていた)では どうなのかは気になるところだが、(結果的にピークがオーバーフローすることになっても)増幅しているものの、うまく圧縮してひどい歪みが起こらないようにしていたのではないだろうか。これは他の再生アプリや配布される音源(例: 「海苔弁」)と同じことで、多少音を悪くする代わりに ひどいことにならないようにしているのだろう。
この問題に関して検索した時に、「(音が悪くなるから)音量正規化はoffにすべきだ」みたいな意見があったが、僕は全くそうは思わない。音量正規化をするのは音質よりも便利さを求めるからで、耳に問題が起こるほど音が悪くならない(「それなりに聴ける」)なら問題ない。
逆に、現行版のSpotifyアプリのNormalの動作は音質の点では正しいとは思うが、一貫性がなくて不便で、無意味だとすら思う。せめて、デフォルトをQuietにすべきなのではないだろうか?
てことは、つまり、Spotifyが-14 LUFSに合わせているのが おかしいってことでは? -22や-23辺りで良かったんじゃないの?? と思うが、YouTubeなどの他のサービスは-14辺りのようなので、仕方なさそうだ。
あと、平均音量を下げるとダイナミックレンジが小さくなって音質が劣化する演奏が増えそうだ。その点では、24ビットで配信をすれば まるっと解決しそうだ。