2011-06-22 40 views
2

我正在使用System.Speech.Synthesis参考使用简单的文本到语音应用程序。我想向应用程序添加一个滑块控件,并用它控制语音的音量。为了设置我正在使用的音量:.NET文本到语音音量

speech.Volume = 100; 

我是否需要使用某种事件处理程序才能更新此值?顺便说一句,我创建这个作为一个WPF应用程序与C#(请不要VB.NET代码)。

回答

1
<Slider Ticks="1, 2, 3, 4, 5, 6, 7, 8, 9, 10" 
      Value="1" 
      Delay="100" 
      Interval="5" 
      TickPlacement="BottomRight" 
      Minimum="1" 
      Maximum="10" 
      Width="100" 
      AutoToolTipPlacement="BottomRight" 
      ValueChanged="slider_ValueChanged" 
      Grid.Row="1" 
      Grid.Column="0"> 
    Slider> 

创建的slider_ValueChanged事件并设置Speech.volume = (int)sliderID.value;

+0

这基本上是我以前设置的。我现在知道它为什么不更新。文本正在读取时,音量无法更改。一旦讲话停止,我可以将音量设置为不同的值。然后我再次读取并设置新的音量值。任何人都可以想到一种方法来改变这个文本正在阅读? – Dylan

0

Slider控件引发事件ValueChanged每当它的值的变化。如果您处理此事件,您可以通过检查Value属性更新您的语音音量。

+0

我试过这样做,但似乎没有更新。我试过了: – Dylan

+0

对不起...我试过 speech.Volume = slider1.Value; 当文本正在被读取时,这似乎没有做任何事情。 – Dylan

+0

以下是MSDN关于语音合成器的文章的链接:http://blogs.msdn.com/b/wpfsdk/archive/2006/05/19/using-speech-synthesis-in-a-wpf-application的.aspx – novacara

0

似乎没有这样做的内置方式。处理SpeakProgress事件将使您可以访问CharacterPosition属性。这使您在最后一个单词读取开始时的提示位置。如果你在下一个空白字符上做了一个子字符串,并把它作为新的提示传递,那么提示的其余部分将从这一点开始讲。如果您愿意,可以计算提示需要读取的时间长度,并使用AudioPosition属性获取TimeSpan对象的提示符运行时间。

1

添加两个滑块,sliderVolume用于音量控制,sliderRate用于速率控制。然后在SpeakProgress事件中,将新卷和速率分配到speech,并使用characterPosition创建原始阅读内容的子字符串。然后重新启动使用这个新的子字符串。请参阅以下代码。

string selectedSpeakData = "Sample Text Sample Text Sample Text Sample Text Sample Text"; 
    private SpeechSynthesizer speech; 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
      { 
       speech= new SpeechSynthesizer(); 
       speech.SpeakProgress += new EventHandler<System.Speech.Synthesis.SpeakProgressEventArgs>(speech_SpeakProgress); 
       speech.SpeakAsync(selectedSpeakData); 
      } 

    void speech_SpeakProgress(object sender, System.Speech.Synthesis.SpeakProgressEventArgs e) 
      { 
       if (speech.Volume != Convert.ToInt32(sliderVolume.Value) || speech.Rate != Convert.ToInt32(sliderRate.Value)) 
       { 
        speech.Volume = Convert.ToInt32(sliderVolume.Value); 
        speech.Rate = Convert.ToInt32(sliderRate.Value); 
        selectedSpeakData = selectedSpeakData.Remove(0, e.CharacterPosition); 
        speech.SpeakAsyncCancelAll(); 
        speech.SpeakAsync(selectedSpeakData); 
       } 
      }