2011-06-22 33 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のイベントを作成し、スライダコントロールがValueChangedたびにその値が変更イベントを発生させSpeech.volume = (int)sliderID.value;

+0

これは基本的にどのように設定したのですか。私は今なぜそれが更新されていないか知っています。テキストが読み取られている間は、音量を変更することはできません。音声が止まると、音量を別の値に設定できます。私は再びそれを読んで、新しい音量値を設定します。テキストの読み込み中に誰かがこれを変更する方法を考えることができますか? – Dylan

0

セット。このイベントを処理する場合は、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の2つのスライダを追加します。その後、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); 
       } 
      } 
関連する問題