C # - Сохранение аудио файла с помощью сервиса Google TTS - PullRequest
0 голосов
/ 10 марта 2011

Я пытаюсь создать пример, который отправляет очень короткое предложение (менее 100 символов) в службу Google TTS, которая возвращает аудиопоток. Я пытаюсь сохранить этот поток в файл, но, открыв его, Buf после написания следующего файла, я могу открыть его в реальном плеере, но он только произносит первую букву (первую букву предложения, отправленного в 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 ]

2 голосов
/ 10 марта 2011

Возможно, вам нужно выполнить цикл во время чтения из потока ответов:

int read = 0;

while ( read < response.ContentLength )
{
    read += stream.Read(buffer, 0, ( response.ContentLength - read ) );
}
1 голос
/ 10 марта 2011

Я бы не стал полагаться на response.ContentLength, вместо этого вы могли бы использовать StreamReader.ReadToEnd ().

1 голос
/ 10 марта 2011

Попробуйте вместо этого использовать WebClient.DownloadFile - это однострочный вызов метода, в котором Майкрософт позаботится об обработке файлов.Если это не сработает, вы можете по крайней мере исключить обработку вашего байтового буфера ...

0 голосов
/ 22 марта 2011

Это работает для меня:

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 ();

...