2012-05-14 5 views
4

Я пытаюсь вывести текст в речь wav-файла и воспроизвести его с тегом HTML5 <audio>. Метод text-to-speech выводит байты, но элемент управления html5 не воспроизводит его.Воспроизведение wav с помощью HTML5

Если вместо потоковой передачи байтов непосредственно в элемент управления, я сначала сохраняю его как файл, а затем конвертирую файл в байты с файловым потоком и вывожу его, он начинает воспроизводиться, но я не хочу, чтобы мне нужно было сохранять файл каждый раз. Я использую MVC 4.

// in a class library 
    public byte[] GenerateAudio(string randomText) 
    { 
     MemoryStream wavAudioStream = new MemoryStream(); 
     SpeechSynthesizer speechEngine = new SpeechSynthesizer(); 
     speechEngine.SetOutputToWaveStream(wavAudioStream); 
     speechEngine.Speak(randomText); 
     wavAudioStream.Flush(); 
     Byte[] wavBytes = wavAudioStream.GetBuffer(); 
     return wavBytes; 
    } 

    // in my controller 
    public ActionResult Listen() 
    { 
     return new FileContentResult(c.GenerateAudio(Session["RandomText"].ToString()), "audio/wav"); 
    } 

    // in my view 
    <audio controls autoplay> 
     <source src="@Url.Content("~/Captcha/Listen")" type="audio/wav" /> 
      Your browser does not support the <audio> element. 
    </audio> 

ответ

0

Я также воспроизводите файл WAV на аудио-элемента, и ваш код имеет ту же логику, что и у меня. Я просто заметил, что вы очищаете свой поток, прежде чем возвращать массив байтов, который будет казаться пустым.

Кроме того, вы можете использовать файл как возвращаемый тип и передать массив байтов его конструктору. Тип контента такой же, как и в вашем коде. Я хотел бы упомянуть (возможно, это тоже может помочь), что я использовал 2 потока: поток внешней области и фактический поток, в котором данные будут сохранены. После того, как я заполнил фактический поток, я скопировал его содержимое во внешний поток, используя stream.CopyTo(), а экземпляр этого внешнего потока - тот, который я использовал в своем операторе return. Это позволяет избежать ошибки «Не удается получить доступ к закрытому потоку» (не точный оператор ошибки).