2011-06-22 41 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); 
       } 
      }