5

我正在尝试输出一个文本到语音的 wav 文件并使用 HTML5<audio>标签播放它。text-to-speech 方法正在输出字节,但 html5 控件没有播放它。

如果不是直接将字节流式传输到控件,而是先将其保存为文件,然后使用 filestream 将文件转换为字节并输出它们,它开始播放,但我不想每次都保存文件. 我正在使用 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>
4

1 回答 1

0

我也在将 wav 文件播放到音频元素,您的代码与我的代码具有相同的逻辑。我刚刚注意到您在返回字节数组之前正在刷新流,这似乎是空的。

此外,您可以使用文件作为返回类型并将字节数组传递给它的构造函数。内容类型与您的代码中的相同。我想提一下(也许它也可以提供帮助)我使用了 2 个流:一个外部范围流和将保存数据的实际流。在我填充了实际流之后,我将其内容复制到了外部流中stream.CopyTo(),并且该外部流的实例是我在 return 语句中使用的实例。这避免了错误“无法访问关闭的流”(不是确切的错误语句)。

于 2017-08-08T16:49:17.150 回答