2018年2月12日月曜日

mp3ファイル の Volume 再調整

 自転車で出かける時、たまに、BGM用のスピーカーをバッグの片隅に入れて持ち出す。 スピーカーは、1年ほど前に2kぐらいで購入した、モノラルバスレフ?で bluetouth対応。 パッキンがとてもチープな防水だが、microSD 再生と、8時間の稼動時間が魅力で購入したものだ。 今はもう少し安くなっているようだ。( ECANDY 防水Bluetoothスピーカー
 以前は、Walkman に Victor の乾電池駆動の薄っぺらなステレオスピーカーを繋いで使っていたが、 音量が足らないとか、低音が聞こえないとか、水はダメとか、色々不満だったのだが、 こいつにしてから、いくつかの不満は解消されて、まずまず満足している。 まあ、選曲とか音量調整とかの操作に関わる不満は、使用方法の性格上諦めていているというのもある。
 で、際立ってきた不満がある。  SDには、mp3ファイルを10時間分ほど入れてるのだが、 たまに、無音でバッテリー切れ?と焦ってしまう曲があるようで、 結構、イラッとなるのだ。走っている間ずっと鳴らしてるわけではなく、 結構快適に走れてる時や、滅入っている時なんかにスイッチONなので、そう感じてしまうのだろう。
 その昔、音量調整をやった記憶はある。その方法が悪かったのか、それともやり忘れなのか、 10時間ぶんを再度調べるのが面倒で、この不快さを何度か味わっている状況だ。
 きっかけは、こんな記事。

- 音楽の「ラウドネス」について考えてみた。すなわち聴く人の体験を考えること。
- 4Gamer.net ― 適切な音量について考える。ゲームサウンドの「ラウドネス基準」はどうあるべきか

 「人間の耳で聞いたときの音量感」、ラウドネスを調整してから、 ボリュームレベルを揃えればよいかも、思った。まあ、その効果のほどは半年以上先になるけど。 TV放送でも、例えば、NHKでは2012年ごろから採用されているようだ。
 やったことは、音質にこだわる方法を探したのでは無く、ffmpeg の使い方を調べただけ。 音楽としては、劣化させる方向なのだろう。 アウトドアでの運動中に、安物スピーカーでBGMを聴くためのソースが、 それなりのテンポでリズムが刻まれるのが感じやいものになれば、それで良い。 まあ、女の子の声とかで刻んでくれると少し嬉しかったりするジジイではあるが。
 主に参考にさせていただいたのは、ニコラボで、 ffmpeg で聞き取りやすい音量に変える dynaudnorm とか 適切な音量が調べられる ffmpeg の ebur128 の使い方。 ありがたや。ありがたや。

1) 波形を見る方法
ffmpeg -i test.mp3 -lavfi showwavespic=split_channels=1:s=1024x400 waveform.png
ffmpeg -i test.mp3 -lavfi showwavespic=s=1024x400 waveform.png

2) ラウドネスの指標見る方法
ffmpeg -nostats -i [input_file] -filter_complex ebur128 -f null -
テレビ放送では -24LUFS ±1dB、PS3では -23LUFS ±2dB 程度らしい。

3) ラウドネスを調整する
 元のデータを調べてから、適切にパラメタを指定して変換するというのが、本来の方法のようだ。
  -  loudnorm -
  -  Audio nomalization with ffmpeg using loudnorm (ebur128) filter -
 で、手間がかかる手作業なんで、当然スクリプトとかどこかにあるだろうと思ったら、やっぱりあった。
 - GitHub - slhck/ffmpeg-normalize: Audio Normalization Script for Python/ffmpeg
pip でインストできる。make しなくていい。ただ私の環境では、mp3 を input 出来なかった。 オプションとか設定とか間違ってるかもしれない。
 ffmpeg-normalize input.wav -o output.wav -f 

4) 適切な音量にする
 ffmpeg -y -i input.mp3 -af dynaudnorm output.mp3 
以上の手続きと、mp3 と wav との変換を組み合わせて、スクリプト書けば、エラーが出ない限り、 勝手にファイルを変換処理してくれる。
#!/bin/bash

MF0=$1
MF1=${MF0##*/}
MF=${MF1%.*}"_norm.mp3"
PF=${MF1%.*}"_wprf.png"
LF=${MF1%.*}"_log.txt"

echo "=========" > log.txt
echo "* origin" >> log.txt
echo "=========" >> log.txt

# オリジナルの諸元を記録
ffmpeg -nostats -i $MF0 -filter_complex ebur128=framelog=verbose -f null - 2> log1.txt
tail -n10 log1.txt >> log.txt
ffmpeg -y -i $MF0 -lavfi showwavespic=s=1024x400 spf1.png

# wav 形式に変換
ffmpeg -y -i $MF0 out.wav

# ラウドネス処理
ffmpeg-normalize out.wav -o out_nor.wav -f

# mp3 に変換
ffmpeg -y -i out_nor.wav out.mp3

# 適切な音量へ
ffmpeg -y -i out.mp3 -af dynaudnorm $MF

# 中間ファイルを削除
rm *.wav

# 結果の諸元を記録
ffmpeg -nostats -i $MF2 -filter_complex ebur128=framelog=verbose -f null - 2> log1.txt
ffmpeg -y -i $MF2 -lavfi showwavespic=s=1024x400 spf2.png

echo "" >> log.txt
echo "=========" >> log.txt
echo "* final" >> log.txt
echo "=========" >> log.txt
tail -n10 log1.txt >> log.txt

composite -gravity west -compose difference spf2.png spf1.png  $PF
mv log.txt $LF

logの例。

=========
* origin
=========

  Integrated loudness:
    I:         -17.4 LUFS
    Threshold: -27.5 LUFS

  Loudness range:
    LRA:         5.7 LU
    Threshold: -37.5 LUFS
    LRA low:   -21.7 LUFS
    LRA high:  -16.0 LUFS

=========
* final
=========

  Integrated loudness:
    I:         -10.8 LUFS
    Threshold: -20.9 LUFS

  Loudness range:
    LRA:         4.8 LU
    Threshold: -30.9 LUFS
    LRA low:   -14.2 LUFS
    LRA high:   -9.5 LUFS

こいつを while とかで、全ファイルに処理してやる。 きっと幾つかの処理をまとめることが出来るんだろうけど、 まあ、一晩あれば全部終わるので、後は半年後とかに考えよう。

[2018.05] 音楽のソースの性格で、この処理が逆効果になる場合があるみたい。ネット経由で入手したものなど、もともと、何らかの処理が施されているようで、スクリプトに何らかの判定を入れなきゃいけないようだ。

0 件のコメント:

コメントを投稿

Emacs の lsp の設定、なう(202310)

前回さらしてから、さらに1年。そう、3年めになる。 が、今回は一段と自信がない。 環境は、 Debian GNU/Linux 12 (bookworm) + emacs(29.1)。consult + company。 embark は未だに使ってない。 用途は、メモ と ...