C# - 使用Google TTS服务保存音频文件

时间:2011-03-10 11:23:11

标签: c# mp3 audio-streaming webresponse

我正在尝试构建一个发送非常短句(少于100个字符)google tts服务的示例,该服务返回音频流。我试图将这个流保存到一个文件中但是当打开它时,Buf在写下面的文件之后,我能够在真正的播放器中打开它但它只发出第一个字母(发送给谷歌的句子的第一个字母)。保存文件可能有问题,我从未处理过代码中的音频,所以请看一下并提出一些更好的代码。

WebRequest request = WebRequest.Create(string.Format("http://translate.google.com/translate_tts?q={0}", Uri.EscapeUriString(textBox1.Text.Trim())));
            request.Method = "GET";

            try
            {
                WebResponse response = request.GetResponse();

                if (response != null && response.ContentType.Contains("audio"))
                {
                    Stream stream = response.GetResponseStream();

                    byte[] buffer = new byte[response.ContentLength];

                    stream.Read(buffer, 0, (int)response.ContentLength);

                    FileStream localStream = new FileStream("audio.mp3", FileMode.OpenOrCreate);

                    localStream.Write(buffer, 0, (int)response.ContentLength);

                    stream.Close();
                    localStream.Close();
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

4 个答案:

答案 0 :(得分:2)

也许你需要在从响应流中读取时循环:

int read = 0;

while ( read < response.ContentLength )
{
    read += stream.Read(buffer, 0, ( response.ContentLength - read ) );
}

答案 1 :(得分:1)

尝试使用WebClient.DownloadFile - 这是一个单行方法调用,其中microsoft负责处理文件处理。如果这不起作用,那么你至少可以排除字节缓冲区处理......

答案 2 :(得分:1)

我会尝试不依赖于response.ContentLength,你可以改用StreamReader.ReadToEnd()。

答案 3 :(得分:0)

这对我有用:

WebClient wc = new WebClient();

//如果没有添加UserAgent标题,那么像ü这样的特殊字符发音为“未知字符” wc.Headers.Add(HttpRequestHeader.UserAgent,“Mozilla / 4.0(兼容; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)”);

byte [] mp3Bytes = wc.DownloadData(“http://translate.google.com/translate_tts?tl=de&q=Hallo Welt!”); string fileOut =“audio.mp3”; FileStream fs = new FileStream(fileOut,FileMode.Create); fs.Write(mp3Bytes,0,(int)mp3Bytes.Length); fs.Close();