我在我的代码中使用此WaveReader class。我收到此错误:
错误:确保样本是整数(例如,不是浮点数)
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文件从float-point更改为Integer?我不知道如何解决这个问题。
答案 0 :(得分:2)
我已经使用随机波形文件对您的代码进行了测试,但效果非常好。 然后我从here下载了一个立体32位浮点数据波样本,我得到了和你一样的错误:
错误:确保样本是整数(例如,不是浮点数)
然后我调试了代码并抛出了以下异常
// 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类不支持32位浮点波样本,FlacWriter也不支持。
更新:我的项目现在正在运行。您必须在调试文件夹中将libFlac.dll
重命名为LibFlac.dll
。加载库时应该没有问题。我得到的是PInvokeStackImabalance异常。如果你也得到了它,你可以按照here帖子中的说明,或者在Debug-> Exceptions-> Managed Debugging Assistans-> PInvokeStackImbalance下简单地抛出这种类型的异常。