Edw*_*ssi 5 html c# asp.net-mvc wav text-to-speech
我正在尝试输出一个文本到语音的 wav 文件并使用 HTML5<audio>标签播放它。text-to-speech 方法正在输出字节,但 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>
Run Code Online (Sandbox Code Playgroud)
小智 0
我还在将 wav 文件播放到音频元素,并且您的代码与我的代码具有相同的逻辑。我刚刚注意到您在返回字节数组之前正在刷新流,该数组似乎是空的。
此外,您可以使用 file 作为返回类型并将字节数组传递给其构造函数。内容类型与您的代码中的内容类型相同。我想提一下(也许这也有帮助),我使用了 2 个流:一个外部范围流和将保存数据的实际流。在填充实际流后,我使用将其内容复制到外部流,stream.CopyTo()并且该外部流的实例是我在 return 语句中使用的实例。这可以避免错误“无法访问关闭的流”(不是确切的错误语句)。