无法将 Wav 转换为 Flac,c#,1 错误

Cannot convert Wav to Flac, c#, 1 Error

我在我的代码中使用这个 WaveReader class。我收到此错误:

ERROR: Ensure that samples are integers (e.g. not floating-point numbers)

if (format.wFormatTag != 1) // 1 = PCM 2 = Float
        throw new ApplicationException("Format tag " + format.wFormatTag + " is not supported!");

我只是想将 WAV 文件转换为 FLAC,以便我可以将其提供给 GoogleSpeechAPI。我可以做第一步,录制 WAV 文件。我坚持第二步:将 WAV 文件转换为 FLAC。我可以执行第 3 步:使用 GoogleSpeech API 将 FLAC 转换为文本。

对于第二步,我卡住了,这是我的代码:

public void WAV_to_FLAC_converter()
    {
        string inputFile = "inputFile.wav";
        //string outputFile = Path.Combine("flac", Path.ChangeExtension(input, ".flac"));
        string outputFile = "outputFile.flac";

        if (!File.Exists(inputFile))
            throw new ApplicationException("Input file " + inputFile + " cannot be found!");
        var stream = File.OpenRead(@"C:\inputFile.wav");
        WavReader wav = new WavReader(stream);

        using (var flacStream = File.Create(outputFile))
        {
            FlacWriter flac = new FlacWriter(flacStream, wav.BitDepth, wav.Channels, wav.SampleRate);
            // Buffer for 1 second's worth of audio data
            byte[] buffer = new byte[wav.Bitrate / 8];
            int bytesRead;//**I GET THE ABOVE ERROR HERE.**
            do
            {
                bytesRead = wav.InputStream.Read(buffer, 0, buffer.Length);
                flac.Write(buffer, 0, bytesRead);
            } while (bytesRead > 0);
            flac.Dispose();
            flac = null;
        }
    }

显然我提供给函数的输入 wav 文件有问题。我认为它说我创建的流变量是浮点数而不是整数。但是我该怎么办?我没有弄乱 WAV 文件。它只是一个 WAV 文件。如何将 WAV 文件从浮点数更改为整数?我不知道如何解决这个问题。

我已经用随机波形文件测试了您的代码,它运行良好。 然后我从here下载了一个立体声32位浮点数据波形样本,我得到了和你一样的错误:

ERROR: Ensure that samples are integers (e.g. not floating-point numbers)

然后我调试代码并抛出以下异常

// Ensure that samples are 16 or 24-bit
if (format.wBitsPerSample != 16 && format.wBitsPerSample != 24)
    throw new ApplicationException(format.wBitsPerSample + " bits per sample is not supported by FLAC!");

恐怕 WavReader class 根本不支持 32 位浮点波样本,FlacWriter 也不支持。

更新:我让你的项目开始工作了。您必须在调试文件夹中将 libFlac.dll 重命名为 LibFlac.dll。加载库应该没有问题了。我得到的是 PInvokeStackImabalance 异常。如果你也得到它,你可以按照 post here 中的说明进行操作,或者在 Debug->Exceptions->Managed Debugging Assistans->PInvokeStackImbalance 下简单地关闭抛出此类异常。