5个版本
0.1.5 | 2024年8月8日 |
---|---|
0.1.4 | 2024年8月8日 |
0.1.3 | 2024年7月31日 |
0.1.1 | 2024年7月31日 |
0.1.0 | 2024年7月31日 |
20 在 音频
530 每月下载量
1.5MB
712 行
归一化器
“足够好”的重制,旨在大致均衡动态范围和整体响度,适用于演奏较老曲目和/或跨多个流派曲目的DJ。虽然不适用于非舞曲音乐流派,但应该足够适用于它们。
该程序通过根据检测到的跨各种时间段的曲目感知响度在ffmpeg
中配置一些限制器和压缩器。它与ffmpeg-normalize
完全不同,后者旨在保留波形,仅将其缩小,以便在测量整个曲目时,不同的曲目具有相同的整体响度。这个程序将会改变你的曲目声音。虽然ffmpeg-normalize
的目的是信任它所提供的母带,并且仅防止你在将多个曲目放入播放列表时需要调整音量,但这个工具的目的是针对在多种不同风格和响度配置跨曲目的母带进行优化,以适应俱乐部播放。它使用压缩和限制来重制曲目,为你提供一个合理的基准,使混音和制作混音变得更加容易。它还可以
这也可以用作快速掌握未掌握的俱乐部播放曲目的一种简单而有效的方法,无需使用像LANDR这样的AI服务。我在未掌握的曲目上尝试过,看起来效果相当不错,产生的母带至少听起来是可接受的。对于我从专辑中尝试的一条曲目,由于动态范围的减少,它在我的手机扬声器上实际上听起来比专业母带更好,尽管在更好的扬声器上瞬态声音太大,显然与专业母带的质量相差甚远——也不是打算要接近。目前它并没有尝试处理曲目的频率分布(例如,对低音较重的曲目和低音较轻的曲目进行归一化),因为mcompand
(ffmpeg
的多波段压缩器)似乎存在bug,无论设置如何都会产生极其难看的伪影。
为了比较,这里有一条以前比较安静的作品,我在现场表演时很难播放,因为动态范围与我通常播放的响亮、富有攻击性的硬舞和狂欢音乐不匹配。使用的设置相当极端,因为它需要匹配我播放列表中其他曲目的大动态范围,这些曲目的母带非常响亮、富有攻击性。然而,尽管波形看起来被截断,但由于使用了多个限制器和压缩器,最终导出的文件并没有听起来失真。这与现代舞曲通常的处理方式一致,波形看起来被截断,但实际上并没有失真。
安装
您需要ffmpeg
(请参阅他们的网站)和cargo
(请参阅rustup)
使用方法
您可以从源代码运行,使用cargo run --release -- [args..]
,或者使用cargo install normalizer
,然后运行normalizer [args..]
。如果从源代码运行,--release
非常重要!没有它,响度分析将非常慢。最常见的用法是cargo run --release -- <input> -o <output>
。目前这还没有在Windows上测试——它调用ffmpeg
,由于缺少.exe
扩展名,可能会在Windows上失败。我可能将切换到使用Rust的ffmpeg
绑定,而不是调用CLI程序,以避免这种情况。
Usage: normalizer [OPTIONS] <FILE>
Arguments:
<FILE> Path to audio file
Options:
-o, --output <OUTPUT>
Output file (if not specified, report loudness)
--max-iterations <MAX_ITERATIONS>
Max interations to try (in case the loudness is still too far from the target) [default: 2]
--target-integrated <TARGET_INTEGRATED>
Target integrated loudness (in LUFS) [default: -10]
--momentary-offset <MOMENTARY_OFFSET>
Target upper bound momentary loudness offset from upper bound (in LUFS) [default: 1]
--instantaneous-offset <INSTANTANEOUS_OFFSET>
Target instantaneous loudness offset from upper bound (in LUFS) [default: 2]
--target-lower <TARGET_LOWER>
Target lower bound momentary loudness (in LUFS) [default: -18]
-t, --trim-amt <TRIM_AMT>
[default: 0.1]
--headroom <HEADROOM>
[default: -1]
-f, --force
Whether to force-overwrite the final output file
--max-error <MAX_ERROR>
If any of the volume levels are this far away from the target, we run the process again [default: 1]
-d, --dynaudnorm
If true, we always enable `dynaudnorm`
--dynaudnorm-threshold <DYNAUDNORM_THRESHOLD>
The lower threshold for integrated loudness compared to target after an iteration to enable `dynaudnorm`. `dynaudnorm` may introduce artefacts but can be useful to reduce whole-track dynamics. Setting this to 0 or more disables, as it is only intended to reduce dynamics (and therefore boost integrated loudness compared to momentary loudness) [default: 0]
-h, --help
Print help
-V, --version
Print version
详细信息
我们首先检测整首曲目的集成响度,以及瞬时和瞬时响度的IPR(百分位范围)——异常值的比例是可配置的,但默认排除最响亮和最安静的10%。我们使用这个范围来配置压缩器,压缩器的设计使得音量范围较低的曲目部分映射到一个可配置的dB值(默认为-18dB),而音量范围较高的部分则映射到目标整体响度(默认为-14dB)。根据集成响度和目标响度之间的差异添加预增益。测试表明,这似乎给出相当不错的结果,平衡了在过于响亮的曲目中增加动态范围以及减少在俱乐部扬声器上听起来太安静的曲目的动态范围的需求。
然后我们在压缩信号的不同时间范围内检测响度,并通过两个限制器进行处理——一个较慢、更温和的限制器和一个较快的限制器,后者更像是一个削波器。这些限制器和进入它们的前级增益是根据检测到的响度配置的。如果曲目与目标值仍然相差甚远,它将再次执行配置的数量(默认为两次)的可配置次数的过程。如果动态范围仍然太大(即,如果集成响度与上限百分之一的瞬时响度相差甚远),它可以在后续迭代中启用dynaudnorm
,这是一种更复杂的压缩形式,偶尔会引入一些听起来像有人在播放时调整音量的伪影。默认情况下,它永远不会启用dynaudnorm
,但它在下一个迭代中启用它的集成响度和瞬时响度之间的差异是可配置的。如果迭代的成果比前一个迭代更接近目标,它将丢弃最新的结果,并使用前一个结果作为输出。这也适用于原始曲目比处理过的曲目更接近目标的情况。
在编写此工具时,我尝试了许多不同的方法来自动重制曲目。目前,最大的问题是它无法处理已经过处理且响度太高且动态范围太小的曲目。它会尝试添加少量动态范围,但如果母带已经看起来像一条扁平的香肠,我就无能为力了。它目前通常不会进一步提高集成响度,但偶尔会这样做,这是一个需要进一步测试以确定它是否会导致最终母带听起来更差的问题,或者集成响度之所以更高,是因为曲目中包含了一些被提升的非常安静的部分。
总的来说,这个工具需要通过真正的DJ使用真实曲目进行大量的实战测试。它永远不会替代手动重制曲目,当然,它也无法替代一开始就获得更好的母带,但它应该足够好,并且比LANDR(因为LANDR不是为处理已经过处理的曲目而设计的)做得更好。
依赖关系
~4–34MB
~544K SLoC