0

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

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

4 回答 4

2

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

int read = 0;

while ( read < response.ContentLength )
{
    read += stream.Read(buffer, 0, ( response.ContentLength - read ) );
}
于 2011-03-10T11:36:25.007 回答
1

尝试改用WebClient.DownloadFile - 这是一种单行方法调用,微软为您处理文件处理。如果这不起作用,那么你至少可以排除你的字节缓冲区处理......

于 2011-03-10T11:39:59.993 回答
1

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

于 2011-03-10T11:49:36.097 回答
0

这对我有用:

WebClient wc = new WebClient();

//如果没有添加 UserAgent 标头,则像 ü 这样的特殊字符将发音为“未知字符” wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/4.0 (compatible; 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=你好世界!"); 字符串文件输出 = "audio.mp3"; FileStream fs = new FileStream(fileOut, FileMode.Create); fs.Write(mp3Bytes, 0, (int)mp3Bytes.Length); fs.Close();

于 2011-03-22T17:44:32.330 回答