我有一个MP4音频文件的URL,我需要发送到Speech-To-Text API。 API仅接受WAV流。我正在使用NAudio 1.7.3和以下代码下载该文件并获取要发送到API的相应流:
string filePath = "C:\Windows\Temp\file.wav";
using (MediaFoundationReader reader = new MediaFoundationReader(audioFileURL))
{
WaveFileWriter.CreateWaveFile(filePath, reader);
}
System.IO.FileStream fs = new FileStream(filePath, FileMode.Open);
然后我将fs
流发送到API,一切正常,但由于I / O到磁盘的速度非常慢。
我决定重写这段代码并执行内存中所需的全部内容。为此,我编写了以下代码(不能为我提供正确的流):
using (MediaFoundationReader reader = new MediaFoundationReader(audioLocation)){
MemoryStream ms = new MemoryStream();
IgnoreDisposeStream ids = new IgnoreDisposeStream(ms);
WaveFileWriter writer = new WaveFileWriter(ids, reader.WaveFormat);
//Doing one of the following (both provide the same outcome):
//1. reader.CopyTo(ids);
//or
//2. this code from NAudio source:
var buffer = new byte[reader.WaveFormat.AverageBytesPerSecond * 4];
while (true)
{
int bytesRead = reader.Read(buffer, 0, buffer.Length);
if (bytesRead == 0)
{
// end of source provider
break;
}
// Write will throw exception if WAV file becomes too large
writer.Write(buffer, 0, bytesRead);
}
writer.Dispose();
Stream streamToSendToAPI = ids.SourceStream;
//Send streamToSendToAPI to Speech-To-Text API
}
我的期望是使用第二个代码示例,我使用WAV标头创建流,然后将数据添加到流,将为我提供有效的WAV流。但是,当我将其发送到语音到文本API时,API会给出错误,指示无法处理流(意味着流无效)。
请告知如何修复内存中的代码示例以创建有效的WAV流
答案 0 :(得分:1)
您需要将内存流回退到开头
ms.Position = 0