是否有方法对文件夹内的音频文件进行批量归一化处理?
音频批量归一化到-14dB解决方案
以下提供两种可直接修改使用的脚本,均支持批量遍历文件夹内音频,无需逐个手动处理。
Python 实现方案
依赖安装
- 系统层面先安装FFmpeg(对应你使用的操作系统版本安装即可)
- 安装Python依赖包:
pip install pydub
可直接使用的脚本
import os from pydub import AudioSegment from pydub.utils import mediainfo # 配置参数,自行修改对应路径 TARGET_LUFS = -14 SUPPORTED_FORMATS = ('.mp3', '.wav', '.flac', '.m4a', '.aac') INPUT_FOLDER = "替换为你的音频输入文件夹路径" OUTPUT_FOLDER = "替换为归一化后音频的输出文件夹路径" # 自动创建输出文件夹 os.makedirs(OUTPUT_FOLDER, exist_ok=True) for filename in os.listdir(INPUT_FOLDER): if not filename.lower().endswith(SUPPORTED_FORMATS): continue input_path = os.path.join(INPUT_FOLDER, filename) output_path = os.path.join(OUTPUT_FOLDER, filename) ext = os.path.splitext(filename)[1][1:].lower() # 读取音频文件 audio = AudioSegment.from_file(input_path, format=ext) # 计算当前音频响度 current_lufs = float(mediainfo(input_path)['loudness']) # 计算需要调整的增益值 gain_db = TARGET_LUFS - current_lufs # 应用增益完成归一化 normalized_audio = audio.apply_gain(gain_db) # 导出处理后的文件 normalized_audio.export(output_path, format=ext) print(f"已处理:{filename},增益调整{gain_db:.2f}dB")
如果需要更高精度的响度计算,可以额外安装pyloudnorm、numpy、soundfile库替换默认的mediainfo响度计算逻辑。
C# 实现方案
依赖安装
在NuGet包管理器中安装NAudio,如果需要处理MP3格式额外安装NAudio.Lame。
可直接使用的脚本
using System; using System.IO; using NAudio.Wave; using NAudio.Lame; namespace BatchAudioNormalizer { class Program { const double TargetLufs = -14; static readonly string[] SupportedFormats = { ".mp3", ".wav", ".flac" }; static void Main(string[] args) { // 自行修改对应路径 string inputFolder = @"替换为你的音频输入文件夹路径"; string outputFolder = @"替换为归一化后音频的输出文件夹路径"; Directory.CreateDirectory(outputFolder); foreach (string file in Directory.GetFiles(inputFolder)) { string ext = Path.GetExtension(file).ToLower(); if (!Array.Exists(SupportedFormats, f => f == ext)) continue; Console.WriteLine($"正在处理:{Path.GetFileName(file)}"); using (var reader = new AudioFileReader(file)) { long sampleCount = reader.Length / (reader.WaveFormat.BitsPerSample / 8); float[] buffer = new float[sampleCount]; reader.Read(buffer, 0, (int)sampleCount); // 计算RMS并转换为近似LUFS double sum = 0; foreach (float sample in buffer) { sum += sample * sample; } double rms = Math.Sqrt(sum / sampleCount); double currentLufs = 20 * Math.Log10(rms) - 0.691; double gain = Math.Pow(10, (TargetLufs - currentLufs) / 20); // 应用增益+削波保护 for (int i = 0; i < buffer.Length; i++) { buffer[i] = (float)(buffer[i] * gain); buffer[i] = Math.Clamp(buffer[i], -1f, 1f); } // 导出文件 string outputPath = Path.Combine(outputFolder, Path.GetFileName(file)); if (ext == ".wav") { using var writer = new WaveFileWriter(outputPath, reader.WaveFormat); writer.WriteSamples(buffer, 0, buffer.Length); } else if (ext == ".mp3") { using var writer = new LameMP3FileWriter(outputPath, reader.WaveFormat, 192); writer.WriteSamples(buffer, 0, buffer.Length); } } Console.WriteLine($"处理完成:{Path.GetFileName(file)}"); } } } }
如果需要更高精度的LUFS计算,可以引入专业的音频响度计算第三方库替换上方的近似转换逻辑。
注意事项
- 所有脚本默认不修改原文件,处理后的文件统一输出到指定的输出文件夹,仍建议你提前备份原文件避免意外损失
- 若要支持更多音频格式,可自行扩展
SUPPORTED_FORMATS列表,同时安装对应格式的解码依赖即可
内容的提问来源于stack exchange,提问作者Tenkai
相关产品推荐
相关产品推荐

