2016-09-20 3 views
0

У меня есть URL-адрес аудиофайла MP4, который мне нужно отправить в Speech-To-Text API. API принимает только поток WAV. Я использую NAudio 1.7.3 и следующий код, чтобы загрузить файл и получить соответствующий поток для отправки API:Создайте поток WAV в памяти

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 и все работает правильно, хотя и очень медленно из-за ввода-вывода на диск.

Я решил переписать этот код и выполнить все необходимое в памяти. Для этого я написал следующий код (который не дает мне правильный поток):

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

Вам нужно перемотать поток памяти обратно к началу

ms.Position = 0 
+0

Спасибо, Марк. Это сработало! –