2011-03-10 4 views
0

오디오 스트림을 반환하는 매우 짧은 문장 (100 자 미만) google tts 서비스를 보내는 샘플을 작성하려고합니다. 이 스트림을 파일에 저장하려하지만 다음 파일을 작성한 후 Buf를 열면 실제 플레이어에서 열 수 있지만 첫 번째 문자 (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); 
      } 

답변

2

은 아마 당신은 응답 스트림에서 읽는 동안 루프를 필요

int read = 0; 

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

내 잘못이 질문을 게시 한 후 실현, 어쨌든 대답은 감사하겠습니다. –

1

대신 WebClient.DownloadFile를 사용해보십시오 - 그것은 마이크로 소프트가 당신을 위해 처리 파일 알아서 한 라인 메서드 호출입니다. 그게 작동하지 않으면, 적어도 당신의 바이트 버퍼 처리를 배제 할 수 있습니다 ...

1

나는 Response.ContentLength에 의존하지 않으려 고합니다. 대신 StreamReader.ReadToEnd()를 사용할 수 있습니다.

0

나를 위해 :

WebClient wc = new WebClient();

// 해당 UserAgent 헤더가 추가되지 않은 경우, "알 수없는 문자" wc.Headers.Add (HttpRequestHeader.UserAgent, "모질라/4.0 (호환로 발음 ü GET과 같은 특수 문자; MSIE 7.0; 윈도우 NT 5.1 .NET CLR 2.0.50727) ");

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

관련 문제