音楽ファイルのダイナミックレンジ圧縮
家で音楽を聴く時、音量が小さい時にボリュームを最適な位置に合わせると、音量が大きくなった時にちょっとうるさ過ぎる。
こういう時はダイナミックレンジを圧縮して対処するようだ。最初はこれをアナログでやろとしていた。電子ボリュームを使って音量が大きくなったら自動でボリュームを絞る回路を作っていた。回路はほぼ完成してあとはソフトウェアの方を実装すれば良いところまで来ていたが、ふと、これってデジタル処理ではできないのだろうかと疑問がわいた。
もともとデジタル処理をしなかったのは、Spotifyのトラウマがあったからだ。Spotifyはデフォルトで強烈なダイナミックレンジ圧縮がかかるようになっていて、ちょっと聴けたものではない再生をする。もちろん設定でoffればいいのだが、あの体験があったためデジタル処理は最初からあきらめていたのだ。
しかしSpotifyみたいな極端な圧縮ではなく適切な圧縮なら大丈夫なのではないかと思い、試してみることにした。最初はffmpegにalimiterという機能があるので、これを使ってみた。ただ、どうも自分には不自然な効きかたをするので、自分で作ってみることにする。calmtuneがそれで、入力にwavファイル受けとって、音量が80%を超えたら80%になるようにボリュームを絞る。音量が20%を切ったらボリュームを戻すが、一度音量超えが起きたらタイマーが起動して、3秒経つまではボリュームを戻さないようにする。これにより頻繁にボリュームが変更されることによる不自然な揺れを防いでいる。このあたりはパラメータで調整できるようになっている。
早速試すと、やはり音質の低下がちょっと気になる。そこで一旦32bit wavに量子化してからcalmtuneを実行してみることにした。
-
soxを使って、flacファイルを32bit wavに変換する。この時正規化をして最大音量が32bit wavの帯域全体を使うようにする
sox [[FILE]] -b 32 -e signed-integer /tmp/normalized32.wav norm 0 -
calmtuneでダイナミックレンジ圧縮をする
calmtune /tmp/normalized32.wav -o /tmp/compressed.wav -
24bit wavに戻す
sox /tmp/compressed.wav -b 24 /tmp/output24.wav -
あらためflacで圧縮。圧縮したファイルはcompというディレクトリに置く
flac -f -8 /tmp/output24.wav -o [[comp/FILE]] < /dev/null
これで音質の低下は気付かないレベルになった。気になるのは、まずファイルサイズが大きくなる。だいたい2倍くらいになる。元がCDで16bitなのが24bitになるから1.5倍くらいかと思っていたのだけど、ダイナミックレンジ圧縮のせいで、flacの圧縮が効きにくくなっているようだ。あと、全体が静かなファイルだと、最初の正規化で音量が上がってしまうので音量のバランスが変な感じになる。これは多分ディレクトリ内のファイル全体で最大音量を調べて、それを元にファイル全体に一律で音量上げの処理をしないといけなそうだ。
というわけで電子ボリュームの方は必要なくなってしまった。まぁファイルそのものを変更する方法ならスマホでの再生でも有効なので、この方がファイルサイズの点を除けばメリットが大きい。
るいもの戯言