2012-02-11 3 views
1

내 Windows 양식 응용 프로그램에서 음성으로 Google 텍스트를 사용하고 싶습니다. 레이블을 읽습니다. System.Speech 참조를 추가했습니다. 버튼 클릭 이벤트로 어떻게 라벨을 읽을 수 있습니까? http://translate.google.com/translate_tts?q=testing+google+speech 음성 API에 대한 Google 텍스트 또는 Microsoft의 기본 텍스트를 음성에 어떻게 사용할 수 있습니까?Windows 텍스트에서 Google 텍스트를 사용하여 음성 API를 사용할 수 있습니까?

+2

당신이 사용하려는 회사의 텍스트 음성 변환 API에 대해 염두에 두어야합니다. 귀하가 제공 한 링크가 죽었으므로 System.Speech.Synthesize.SpeechSynthezer 클래스를 사용하는 것이 좋습니다. 인터넷의 "더 좋을/다른 내일이 될 것"이 아닌 .NET 세계에서 가장 큰 강자를 위해 SpeakAsync() 메서드를 사용하십시오. –

+0

@HansPassant - 링크가 작동합니다. 나는 왜 그것이 당신을 위해 작동하지 않을 지 궁금해. –

+0

흠, 이유도 궁금합니다. * 0을 * 디버그하는 방법만으로도 충분합니다. –

답변

6

업데이트 Google의 TTS API는 더 이상 공개적으로 사용할 수 없습니다. Microsoft의 TTS에 관한 맨 아래의 노트는 여전히 관련이 있으며 동일한 기능을 제공합니다.


당신은 this question의 대답의 변형을 사용하여 응답을 재생하여의 WinForm 응용 프로그램에서 구글의 TTS API를 사용할 수

(그것은 나에게 동안을했다하지만 내가 진짜 솔루션을 이) :

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     this.FormClosing += (sender, e) => 
      { 
       if (waiting) 
        stop.Set(); 
      }; 
    } 

    private void ButtonClick(object sender, EventArgs e) 
    { 
     var clicked = sender as Button; 
     var relatedLabel = this.Controls.Find(clicked.Tag.ToString(), true).FirstOrDefault() as Label; 

     if (relatedLabel == null) 
      return; 

     var playThread = new Thread(() => PlayMp3FromUrl("http://translate.google.com/translate_tts?q=" + HttpUtility.UrlEncode(relatedLabel.Text))); 
     playThread.IsBackground = true; 
     playThread.Start(); 
    } 

    bool waiting = false; 
    AutoResetEvent stop = new AutoResetEvent(false); 
    public void PlayMp3FromUrl(string url) 
    { 
     using (Stream ms = new MemoryStream()) 
     { 
      using (Stream stream = WebRequest.Create(url) 
       .GetResponse().GetResponseStream()) 
      { 
       byte[] buffer = new byte[32768]; 
       int read; 
       while ((read = stream.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        ms.Write(buffer, 0, read); 
       } 
      } 

      ms.Position = 0; 
      using (WaveStream blockAlignedStream = 
       new BlockAlignReductionStream(
        WaveFormatConversionStream.CreatePcmStream(
         new Mp3FileReader(ms)))) 
      { 
       using (WaveOut waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback())) 
       { 
        waveOut.Init(blockAlignedStream); 
        waveOut.PlaybackStopped += (sender, e) => 
        { 
         waveOut.Stop(); 
        }; 

        waveOut.Play(); 
        waiting = true; 
        stop.WaitOne(10000); 
        waiting = false; 
       } 
      } 
     } 
    } 
} 

참고 : 위의 코드는 NAudio는 (무료/오픈 소스)와 System.Web, System.ThreadingNAudio.Wave에 대한 using 문을 작동해야합니다. 내 Form1

는 2 개 컨트롤이 있습니다 :

  1. label1라는 라벨 Taglabel1의와 button1라는 버튼

(라벨에있는 버튼을 바인딩하는 데 사용) 위의 코드는 각 버튼/라벨 조합에 대해 서로 다른 이벤트가있는 경우 (테스트되지 않음) 다음과 같이 약간 단순화 할 수 있습니다.

private void ButtonClick(object sender, EventArgs e) 
    { 
     var clicked = sender as Button; 

     var playThread = new Thread(() => PlayMp3FromUrl("http://translate.google.com/translate_tts?q=" + HttpUtility.UrlEncode(label1.Text))); 
     playThread.IsBackground = true; 
     playThread.Start(); 
    } 

그러나이 솔루션에는 문제가 있습니다 (이 목록은 아마도 완전하지 않을 수 있습니다. 나는 코멘트와 실제 사용법이 다른 사람들을 찾을 것이라 확신한다.) :

  1. 첫 번째 코드 단편에 stop.WaitOne(10000);이있다. 10000은 재생할 오디오의 최대 10 초를 나타내므로 레이블이 읽을 시간보다 오래 걸리면 조정해야합니다. 이것은 현재 버전의 NAudio (v1.5.4.0)에서 스트림 재생이 완료된 시점을 결정하는 데 문제가있는 것 같기 때문에 필요합니다. 나중 버전에서 수정되었거나 찾지 못하는 임시 해결책이있을 수 있습니다. 임시 해결 방법 중 하나는 스레드에 대한 매개 변수로 시간 초과를 사용하는 ParameterizedThreadStart을 사용하는 것입니다. 이렇게하면 가변적 인 시간 만 허용되지만 기술적으로 문제가 해결되지는 않습니다.
  2. 더 중요한 것은 Google TTS API가 비공식 (Google 이외의 응용 프로그램에서 사용되지 않는다는 의미)이며 언제든지 통지없이 변경 될 수 있음을 의미합니다. 상업적 환경에서 작동 할 수있는 무언가가 필요하다면 MS TTS 솔루션 (귀하의 질문에 제시된대로) 또는 많은 상업적 대안 중 하나를 제안 할 것입니다. 이 중 어느 것도 단순하지 않은 경향이 없습니다.

는 질문의 반대편에 대답하려면 :

System.Speech.Synthesis.SpeechSynthesizer 클래스입니다 많은 쉽게 사용하고 당신은 어디 구글 API로,이 수 (안정적으로 사용할 수있는 믿을 수있는 내일 떠났다.)

정말 a를 System.Speech 참조 참조 등을 포함하는 것만 큼 쉽습니다 :

public void SaySomething(string somethingToSay) 
{ 
    var synth = new System.Speech.Synthesis.SpeechSynthesizer(); 

    synth.SpeakAsync(somethingToSay); 
} 

작동합니다.

Google TTS API를 사용하는 것은 재미있는 실험 이었지만 프로덕션 용도로 제안하는 것이 좋았으며 상용 대안에 대한 비용을 지불하고 싶지 않은 경우 Microsoft의 솔루션은 그것은 얻는다.

+0

버튼 클릭 이벤트에서 어떻게 사용할 수 있습니까? –

+0

@ user1136403 -이 작업을 버튼 클릭 이벤트에 적용하는 방법은 내 업데이트를 참조하십시오. –

+0

@ user1136403 - 필자는 테스트를 기반으로 필요한 변경 사항을 반영하여 내 대답의 코드를 업데이트했습니다. –

관련 문제