2014-01-27 9 views
2

그래서 C#에서 System.Speech.Synthesis 라이브러리의 음성을 변경하려고합니다. 그것은 콘솔 모드에서 코드를 시도 할 때 나를 위해 작동합니다. 그러나 Windows 응용 프로그램에서 작업 할 때 아무런 오류도주지 않고 음성을 변경하지 않습니다. 다음은 음성 변경을 지원하는 Windows 응용 프로그램의 코드입니다.C# SelectVoice가 Windows 응용 프로그램에서는 변경되지 않지만 콘솔에서는 수행됩니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Windows.Forms; 
using System.Speech.Synthesis; 
using System.Speech.Recognition; 

namespace JarvisRev1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      this.button1.Click += new EventHandler(button1_Click); 
      this.button2.Click += new EventHandler(button2_Click); 
      this.button3.Click += new EventHandler(button3_Click); 

      foreach (InstalledVoice voice in sSynth.GetInstalledVoices()) 
      { 
       cbVoice.Items.Add(voice.VoiceInfo.Name); 
      } 
     } 

     SpeechSynthesizer sSynth = new SpeechSynthesizer(); 
     PromptBuilder pBuilder = new PromptBuilder(); 
     SpeechRecognitionEngine sRecognize = new SpeechRecognitionEngine(); 


     private void button1_Click(object sender, EventArgs e) 
     { 
      pBuilder.ClearContent(); 
      pBuilder.AppendText(textBox1.Text); 
      sSynth.SelectVoice("IVONA 2 Brian"); 
      sSynth.SpeakAsync(pBuilder); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      button2.Enabled = false; 
      button3.Enabled = true; 
      Choices sList = new Choices(); 
      sList.Add(new string[] { "hello", "test", "it works", "how", "are", "you", "today", "i", "am", "fine", "exit", "close", "quit", "so", "hello how are you" }); 
      Grammar gr = new Grammar(new GrammarBuilder(sList)); 
      try 
      { 
       sRecognize.RequestRecognizerUpdate(); 
       sRecognize.LoadGrammar(gr); 
       sRecognize.SpeechRecognized += sRecognize_SpeechRecognized; 
       sRecognize.SetInputToDefaultAudioDevice(); 
       sRecognize.RecognizeAsync(RecognizeMode.Multiple); 
       sRecognize.Recognize(); 
      } 

      catch 
      { 
       return; 
      } 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      sRecognize.RecognizeAsyncStop(); 
      button2.Enabled = true; 
      button3.Enabled = false; 
     } 

     private void sRecognize_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) 
     { 


      if (e.Result.Text == "exit") 
      { 
       Application.Exit(); 
      } 
      else 
      { 
       textBox1.Text = textBox1.Text + " " + e.Result.Text.ToString(); 
      } 

     } 

    } 
} 

이것은 나를 위해 작동하는 콘솔 모드의 코드입니다.

using System; 
using System.Speech.Synthesis; // Add reference to System.Speech 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var synth = new SpeechSynthesizer(); 
     synth.SelectVoice("IVONA 2 Brian"); 
     synth.SpeakAsync("For you Sir, Always."); 
     foreach (var voice in synth.GetInstalledVoices()) 
     { 
      Console.WriteLine(voice.VoiceInfo.Name); 
     } 
     Console.ReadLine(); 
    } 
} 
+0

는 { 'cbVoice'.Items.Add (voice.VoiceInfo.Name) (sSynth.GetInstalledVoices()에 InstalledVoice 음성) foreach는 작동되지 않는다; } –

답변

4

시스템에서 Microsoft Irina Desktop 음성을 사용할 수있을 때와 동일한 문제가 있습니다. 해결 방법 프롬프트, 예컨대에 명시 적으로 음성을 설정합니다 :

using System.Speech.Synthesis; 

var synth=new SpeechSynthesizer(); 
var builder=new PromptBuilder(); 
builder.StartVoice("Microsoft David Desktop"); 
builder.AppendText("Hello, World!"); 
builder.EndVoice(); 
synth.SpeakAsync(new Prompt(builder)); 

이미 PromptBuilder을 활용로서, StartVoice 및 텍스트 주위 EndVoice 호출을 추가하려고합니다. 이 코드 cbVoice에서

+0

문제가 어디 있는지 알 수 있습니까? – sarin