以前は、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 -
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
#!/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 件のコメント:
コメントを投稿