2012-05-14 116 views
4

我正在嘗試輸出文本到語音的wav文件,並使用HTML5 <audio>標記進行播放。文本到語音方法正在輸出字節,但html5控件不會播放它。使用HTML5播放wav

如果不是直接將字節流式傳輸到控件,我首先將它保存爲文件,然後將文件轉換爲帶有文件流的字節並輸出,然後開始播放,但我不想保存該文件每次。我正在使用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語句中使用的實例。這避免了「無法訪問封閉流」錯誤(不是確切的錯誤語句)。