【问题标题】:.NET Text To Speech Volume.NET 文本转语音量
【发布时间】:2011-09-20 14:33:41
【问题描述】:

我正在使用 System.Speech.Synthesis 参考处理一个简单的 Text to Speech 应用程序。我想在应用程序中添加一个滑块控件并用它来控制语音的音量。为了设置我正在使用的音量:

speech.Volume = 100;

我是否需要使用某种事件处理程序来更新此值?顺便说一句,我正在使用 C# 将其创建为 WPF 应用程序(请不要使用 VB.NET 代码)。

【问题讨论】:

    标签: c# wpf event-handling slider text-to-speech


    【解决方案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;

    【讨论】:

    • 这基本上是我之前设置的。我现在知道为什么它不更新了。阅读文本时,无法更改音量。一旦语音停止,我就可以将音量设置为不同的值。然后我再次读取它并设置新的音量值。有人可以在阅读文本时想出一种方法来改变它吗?
    【解决方案2】:

    Slider 控件在其值更改时引发事件ValueChanged。如果您处理此事件,则可以通过检查 Value 属性从那里更新您的语音音量。

    【讨论】:

    • 我试过这样做,但它似乎没有更新。我试过了:
    • 对不起...我已经尝试过 Speech.Volume = slider1.Value;在阅读文本时,这似乎没有任何作用。
    • 这里是 MSDN 上一篇关于语音合成器的文章的链接:blogs.msdn.com/b/wpfsdk/archive/2006/05/19/…
    【解决方案3】:

    似乎没有内置的方法可以做到这一点。处理 SpeakProgress 事件将使您能够访问 CharacterPosition 属性。这使您在最后一个单词读取的开头处于提示中的位置。如果您在下一个空格字符上执行子字符串并将其作为新提示传递,则提示的其余部分将从这一点开始朗读。如果您愿意,您可以计算提示需要多长时间才能被读取,并使用 AudioPosition 属性来获取 TimeSpan 对象,以了解提示已经运行了多长时间。

    【讨论】:

      【解决方案4】:

      添加两个滑块,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);
                      }
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 2014-07-02
        • 2023-02-17
        • 1970-01-01
        • 1970-01-01
        • 2019-04-22
        • 2014-07-04
        相关资源
        最近更新 更多