我正在尝试构建一个发送非常短句(少于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);
}
答案 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();