是A C#(非常)初学者开发人员,我正在使用Naudio库中的出色样本,并尝试将录制字节直接保存到以下记忆流中:
Wrater是WaveFileWriter对象; memstream是一个内存式对象void OnDataAvailable(object sender, WaveInEventArgs e)
{
if (InvokeRequired)
{
//Debug.WriteLine("Data Available");
BeginInvoke(new EventHandler<WaveInEventArgs>(OnDataAvailable), sender, e);
}
else
{
//this is my new MemoryStream object
memStream.Write(e.Buffer, 0, e.BytesRecorded);
//this is the reguler working writer object
writer.Write(e.Buffer, 0, e.BytesRecorded);
int secondsRecorded = (int)(writer.Length / writer.WaveFormat.AverageBytesPerSecond);
if (secondsRecorded >= 5)
{
StopRecording();
}
else
{
progressBar1.Value = secondsRecorded;
}
}
}
尽管此编译并运行正常,但MemoryStream不被API接受,这会导致运行时错误(不良请求)。
我只能猜测我的内存流确实没有波浪格式。
任何建议我如何确保我的内存流确实代表WAV音频内容?谢谢你, Márcio
该问题的答案/解决方案是使用WaveFileWriter并将字节直接保存到MemoryStream而不是文件。 WaveFileWritter将原始字节[]包裹为格式的波流。根据需要更改率和渠道。
writerMem = new WaveFileWriter(memStream, new WaveFormat(44100, 16, 1));
写入字节给WaveFileWriter:
writerMem.Write(e.Buffer, 0, e.BytesRecorded);
呼叫API仅通过内存流
var recResult = speechToText.Recognize(
audio: memStream,
model: "pt-BR_Multimedia",
contentType: "audio/wav");
这种方式,API接受内存并从内部识别波流。