ルモーリン
ホーム 更新 Perl Sample サービス 雑談 鉄ゲタ Linux リンク 連絡先

YouTube用ラウドネス調整

2020-04-29

最近、YouTubeに投稿することがあり、音源の音量調整を自動的にやりたくなりました。 YouTubeの場合は、動画を投稿した際に大きい音量を自動的に小さくします。 小さい音量は変更しないらしいです。 この「大きい音量」と「小さい音量」の境界線は-13LUFS辺りと推測されているそうです。 YouTubeがルールを公開していないので推測ばかりですみません(汗)。 こちらの記事が詳しいです。
YouTubeでラウドネスノーマライゼーションの値を見る方法

処理自体はffmpegのオーディオフィルターを2パスして行います。 1パス目は音源をチェックして処理に必要なパラメタを決定、2パス目で実際に音量を調整します。 こちらの記事にある方法を自動化しました
任意のラウドネス値に音量を調整する loudnorm

コードハイライトのパースが下手で綺麗に見えない(´・ω・`)

#!/usr/bin/env perl

use v5.26;
use utf8;
use strict;
use warnings;

use Encode;
use Encode::Argv;
use Encode::Locale;

use open IO => ":utf8";
binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";

$| = 1;

my ($org_wav) = @ARGV;
my @loud;
my $isJson = 0;
if (open my $fh, "-|", Encode::encode cp932 => qq#ffmpeg -i $org_wav -af "loudnorm=I=-13:TP=-3:LRA=4:print_format=json" -vn -f null - 2>&1#) {
	while (<$fh>) {
		chomp;
		say;

		last if /}/;
		push @loud, $_ if $isJson;
		$isJson = 1 if /{/;
	}
	close $fh;
}

my %loud;
for (@loud) {
	my ($key, $value) = split /:/;
	($key) = $key =~ /\"(.*)\"/;
	($value) = $value =~ /\"(.*)\"/;
	$loud{$key} = $value;
}

for (sort keys %loud) {
	say "$_ => $loud{$_}";
}

my $norm_wav = $org_wav;
$norm_wav =~ s/\.wav$/_youtube.wav/;
system(Encode::encode cp932 => qq#ffmpeg -y -i $org_wav -af "loudnorm=I=-13:TP=-3:LRA=4:measured_I=$loud{input_i}:measured_TP=$loud{input_tp}:measured_LRA=$loud{input_lra}:measured_thresh=$loud{input_thresh}:offset=$loud{target_offset},pan=stereo|c0=FL|c1=FR,aresample=48000:resampler=soxr" "$norm_wav"#);

system("pause");

exit;

いちいちコマンドプロンプトで指定して実行するのは面倒です。 音源のファイルを右クリックして調整できるように仕込みます。 まず始めにPerlのスクリプトを起動するバッチファイルをスクリプトと同じディレクトリに用意します。

@echo off

setlocal enabledelayedexpansion

perl normalize_youtube.pl %1

このバッチファイルのショートカットを作り(バッチファイルを右クリックでショートカット作成を選択)「normalize_youtube.bat - ショートカット」ができます。 ショートカットの名前を「normalize_youtube」に書き替えます(バッチファイル名はショートカット内に設定されているので名前の書き替え可)。 このショートカットを「C:\Users\takoluka\AppData\Roaming\Microsoft\Windows\SendTo」(takolukaをユーザー名に置き換え)ディレクトリに移動します。 これで簡単に使えるようになりました。

ラウドネス調整したい音源を右クリックしてnormalize_youtubeを選択すれば終わり。 あとは処理終了を待ち調整後の音源が_youtubeが付いたファイルにできあがる寸法です。

最近投稿した動画で使ってみましたからご覧ください。 と言いますか投稿する際にラウドネス調整をやりたかったので作りました(笑)。 ありゃ、音量が1.0dB大きくて、フルボリュームの89%で再生していますね。 惜しかった(むー)。 目標を-14LUFSにすれば良かったかあ(´・ω・`)