使用 NAudio 在 32 位 PCM Wav 中标准化音量

Normalize volume in a 32 bit PCM Wav with NAudio

有没有办法使用 NAudio 规范化 32 位 wav 文件的音量?

如果音量过低,那么我想要向下标准化,如果音量太低,反之亦然。

没有内置功能,但如果您使用 AudioFileReader,您可以检查所有样本的值以找到最大绝对样本值。由此您可以计算出原始文件在不剪切的情况下可以放大多少。

然后你可以用AudioFileReaderVolume 属性放大音频,然后用WaveFileWriter.CreateWaveFile写出一个新的(IEEE浮点数) ) WAV 文件。 WaveFileWriter.CreateWaveFile16 如果你想在归一化后得到 16 位输出,可以使用。

下面是一些非常简单的示例代码

var inPath = @"E:\Audio\wav\input.wav";
var outPath = @"E:\Audio\wav\normalized.wav";
float max = 0;

using (var reader = new AudioFileReader(inPath))
{
    // find the max peak
    float[] buffer = new float[reader.WaveFormat.SampleRate];
    int read;
    do
    {
        read = reader.Read(buffer, 0, buffer.Length);
        for (int n = 0; n < read; n++)
        {
            var abs = Math.Abs(buffer[n]);
            if (abs > max) max = abs;
        }
    } while (read > 0);
    Console.WriteLine($"Max sample value: {max}");

    if (max == 0 || max > 1.0f)
        throw new InvalidOperationException("File cannot be normalized");

    // rewind and amplify
    reader.Position = 0;
    reader.Volume = 1.0f / max;

    // write out to a new WAV file
    WaveFileWriter.CreateWaveFile(outPath, reader);
}