Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Speech / Src / Synthesis / SpeechSynthesizer.cs / 1 / SpeechSynthesizer.cs
//------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Runtime.CompilerServices;
using System.Speech.AudioFormat;
using System.Speech.Internal;
using System.Speech.Internal.ObjectTokens;
using System.Speech.Internal.Synthesis;
using System.Speech.Synthesis.TtsEngine;
using System.Threading;
using RegistryDataKey = System.Speech.Internal.ObjectTokens.RegistryDataKey;
using RegistryEntry = System.Collections.Generic.KeyValuePair;
namespace System.Speech.Synthesis
{
///
/// TODOC
///
public sealed class SpeechSynthesizer : IDisposable
#if SPEECHSERVER || PROMPT_ENGINE
, ISesSynthesizer
#endif
{
//*******************************************************************
//
// Constructors
//
//*******************************************************************
#region Constructors
///
/// TODOC
///
public SpeechSynthesizer ()
{
}
#if SPEECHSERVER
///
/// TODOC
///
internal SpeechSynthesizer (bool outputAsText) : this ()
{
VoiceSynthesizer._outputAsText = outputAsText;
}
#endif
///
///
///
~SpeechSynthesizer ()
{
Dispose (false);
}
///
/// TODOC
///
public void Dispose ()
{
Dispose (true);
GC.SuppressFinalize (this);
}
#endregion
//********************************************************************
//
// Public Methods
//
//*******************************************************************
#region public Methods
///
/// TODOC
///
///
public void SelectVoice (string name)
{
Helpers.ThrowIfEmptyOrNull (name, "name");
TTSVoice ttsVoice = VoiceSynthesizer.GetEngine (name, CultureInfo.CurrentUICulture, VoiceGender.NotSet, VoiceAge.NotSet, 1, true);
if (ttsVoice == null || name != ttsVoice.VoiceInfo.Name)
{
// No match - throw
throw new ArgumentException (SR.Get (SRID.SynthesizerSetVoiceNoMatch));
}
VoiceSynthesizer.Voice = ttsVoice;
}
///
/// TODOC
///
///
public void SelectVoiceByHints (VoiceGender gender)
{
SelectVoiceByHints (gender, VoiceAge.NotSet, 1, CultureInfo.CurrentUICulture);
}
///
/// TODOC
///
///
///
public void SelectVoiceByHints (VoiceGender gender, VoiceAge age)
{
SelectVoiceByHints (gender, age, 1, CultureInfo.CurrentUICulture);
}
///
/// TODOC
///
///
///
///
public void SelectVoiceByHints (VoiceGender gender, VoiceAge age, int voiceAlternate)
{
SelectVoiceByHints (gender, age, voiceAlternate, CultureInfo.CurrentUICulture);
}
///
/// TODOC
///
///
///
///
///
public void SelectVoiceByHints (VoiceGender gender, VoiceAge age, int voiceAlternate, CultureInfo culture)
{
Helpers.ThrowIfNull (culture, "culture");
if (voiceAlternate < 0)
{
throw new ArgumentOutOfRangeException ("voiceAlternate", SR.Get (SRID.PromptBuilderInvalidVariant));
}
if (!VoiceInfo.ValidateGender (gender))
{
throw new ArgumentException (SR.Get (SRID.EnumInvalid, "VoiceGender"), "gender");
}
if (!VoiceInfo.ValidateAge (age))
{
throw new ArgumentException (SR.Get (SRID.EnumInvalid, "VoiceAge"), "age");
}
TTSVoice ttsVoice = VoiceSynthesizer.GetEngine (null, culture, gender, age, voiceAlternate, true);
if (ttsVoice == null)
{
// No match - throw
throw new InvalidOperationException (SR.Get (SRID.SynthesizerSetVoiceNoMatch));
}
VoiceSynthesizer.Voice = ttsVoice;
}
///
/// TODOC
///
///
///
public Prompt SpeakAsync (string textToSpeak)
{
Helpers.ThrowIfNull (textToSpeak, "textToSpeak");
Prompt prompt = new Prompt (textToSpeak, SynthesisTextFormat.Text);
SpeakAsync (prompt);
return prompt;
}
///
/// TODOC
///
///
///
public void SpeakAsync (Prompt prompt)
{
Helpers.ThrowIfNull (prompt, "prompt");
prompt.Synthesizer = this;
VoiceSynthesizer.SpeakAsync (prompt);
}
///
/// TODOC
///
///
///
public Prompt SpeakSsmlAsync (string textToSpeak)
{
Helpers.ThrowIfNull (textToSpeak, "textToSpeak");
Prompt prompt = new Prompt (textToSpeak, SynthesisTextFormat.Ssml);
SpeakAsync (prompt);
return prompt;
}
///
/// TODOC
///
///
///
public Prompt SpeakAsync (PromptBuilder promptBuilder)
{
Helpers.ThrowIfNull (promptBuilder, "promptBuilder");
Prompt prompt = new Prompt (promptBuilder);
SpeakAsync (prompt);
return prompt;
}
///
/// TODOC
///
///
///
public void Speak (string textToSpeak)
{
Speak (new Prompt (textToSpeak, SynthesisTextFormat.Text));
}
///
/// TODOC
///
///
///
public void Speak (Prompt prompt)
{
Helpers.ThrowIfNull (prompt, "prompt");
// Avoid a dead lock if the synthesizer is Paused
if (State == SynthesizerState.Paused)
{
throw new InvalidOperationException (SR.Get (SRID.SynthesizerSyncSpeakWhilePaused));
}
prompt.Synthesizer = this;
prompt._syncSpeak = true;
VoiceSynthesizer.Speak (prompt);
}
///
/// TODOC
///
///
///
public void Speak (PromptBuilder promptBuilder)
{
Speak (new Prompt (promptBuilder));
}
///
/// TODOC
///
///
///
public void SpeakSsml (string textToSpeak)
{
Speak (new Prompt (textToSpeak, SynthesisTextFormat.Ssml));
}
///
/// Pause the playback of all speech in this synthesizer.
///
public void Pause ()
{
// Increment the Paused count
if (!paused)
{
VoiceSynthesizer.Pause ();
paused = true;
}
}
///
/// Resume the playback of all speech in this synthesizer.
///
public void Resume ()
{
if (paused)
{
VoiceSynthesizer.Resume ();
paused = false;
}
}
///
/// Cancel playback of all Prompts currently in the queue.
///
///
public void SpeakAsyncCancel (Prompt prompt)
{
Helpers.ThrowIfNull (prompt, "prompt");
VoiceSynthesizer.Abort (prompt);
}
///
/// Cancel playback of all Prompts currently in the queue.
///
public void SpeakAsyncCancelAll ()
{
VoiceSynthesizer.Abort ();
}
///
/// TODOC
///
///
// The stream is disposed when the speech synthesizer is disposed
public void SetOutputToWaveFile (string path)
{
Helpers.ThrowIfEmptyOrNull (path, "path");
SetOutputToNull ();
SetOutputStream (new FileStream (path, FileMode.Create, FileAccess.Write), null, true, true);
}
#if !SPEECHSERVER
///
/// TODOC
///
///
///
// The stream is disposed when the speech synthesizer is disposed
public void SetOutputToWaveFile (string path, SpeechAudioFormatInfo formatInfo)
{
Helpers.ThrowIfEmptyOrNull (path, "path");
Helpers.ThrowIfNull (formatInfo, "formatInfo");
SetOutputToNull ();
SetOutputStream (new FileStream (path, FileMode.Create, FileAccess.Write), formatInfo, true, true);
}
#endif
///
/// TODOC
///
///
public void SetOutputToWaveStream (Stream audioDestination)
{
Helpers.ThrowIfNull (audioDestination, "audioDestination");
SetOutputStream (audioDestination, null, true, false);
}
///
/// TODOC
///
///
///
#if !SPEECHSERVER
public void SetOutputToAudioStream (Stream audioDestination, SpeechAudioFormatInfo formatInfo)
#else
internal void SetOutputToAudioStream (Stream audioDestination, SpeechAudioFormatInfo formatInfo)
#endif
{
Helpers.ThrowIfNull (audioDestination, "audioDestination");
Helpers.ThrowIfNull (formatInfo, "formatInfo");
SetOutputStream (audioDestination, formatInfo, false, false);
}
///
/// TODOC
///
public void SetOutputToDefaultAudioDevice ()
{
SetOutputStream (null, null, true, false);
}
///
/// TODOC
///
// The stream is disposed when the speech synthesizer is disposed
public void SetOutputToNull ()
{
// Close the existing stream
if (_outputStream != Stream.Null)
{
VoiceSynthesizer.SetOutput (Stream.Null, null, true);
}
if (_outputStream != null)
{
if (_closeStreamOnExit)
{
_outputStream.Close ();
}
}
_outputStream = Stream.Null;
}
///
/// TODOC
///
///
// Dynamic content, use a method instead of a property to denote that fact
public Prompt GetCurrentlySpokenPrompt ()
{
return VoiceSynthesizer.Prompt;
}
///
/// TODOC
///
///
public ReadOnlyCollection GetInstalledVoices ()
{
return VoiceSynthesizer.GetInstalledVoices (null);
}
///
/// TODOC
///
///
///
public ReadOnlyCollection GetInstalledVoices (CultureInfo culture)
{
Helpers.ThrowIfNull (culture, "culture");
if (culture.Equals (CultureInfo.InvariantCulture))
{
throw new ArgumentException (SR.Get (SRID.InvariantCultureInfo), "culture");
}
return VoiceSynthesizer.GetInstalledVoices (culture);
}
///
/// TODOC
///
///
///
public void AddLexicon (Uri uri, string mediaType)
{
Helpers.ThrowIfNull (uri, "uri");
VoiceSynthesizer.AddLexicon (uri, mediaType);
}
///
/// TODOC
///
///
public void RemoveLexicon (Uri uri)
{
Helpers.ThrowIfNull (uri, "uri");
VoiceSynthesizer.RemoveLexicon (uri);
}
#if SPEECHSERVER || PROMPT_ENGINE
///
/// TODOC
///
///
///
void ISesSynthesizer.LoadDatabase (string localName, string alias)
{
VoiceSynthesizer.LoadDatabase (localName, alias);
}
///
/// TODOC
///
///
void ISesSynthesizer.UnloadDatabase (string alias)
{
VoiceSynthesizer.UnloadDatabase (alias);
}
///
/// TODOC
///
///
void ISesSynthesizer.SetResourceLoader (ISpeechResourceLoader resourceLoader)
{
VoiceSynthesizer.SetResourceLoader (resourceLoader);
}
#endif
//********************************************************************
//
// Public Events
//
//********************************************************************
#region public Events
///
/// TODOC
///
public event EventHandler SpeakStarted
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._speakStarted += value;
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._speakStarted -= value;
}
}
///
/// TODOC
///
public event EventHandler SpeakCompleted
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._speakCompleted += value;
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._speakCompleted -= value;
}
}
///
/// TODOC
///
public event EventHandler SpeakProgress
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.WordBoundary, ref VoiceSynthesizer._speakProgress, value);
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.WordBoundary, ref VoiceSynthesizer._speakProgress, value);
}
}
///
/// TODOC
///
public event EventHandler BookmarkReached
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.Bookmark, ref VoiceSynthesizer._bookmarkReached, value);
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.Bookmark, ref VoiceSynthesizer._bookmarkReached, value);
}
}
///
/// TODOC
///
public event EventHandler VoiceChange
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.VoiceChange, ref VoiceSynthesizer._voiceChange, value);
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.VoiceChange, ref VoiceSynthesizer._voiceChange, value);
}
}
#if !SPEECHSERVER
#region WinFx
///
/// TODOC
///
public event EventHandler PhonemeReached
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.Phoneme, ref VoiceSynthesizer._phonemeReached, value);
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.Phoneme, ref VoiceSynthesizer._phonemeReached, value);
}
}
///
/// TODOC
///
public event EventHandler VisemeReached
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.Viseme, ref VoiceSynthesizer._visemeReached, value);
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.Viseme, ref VoiceSynthesizer._visemeReached, value);
}
}
#endregion
#else
///
/// TODOC
///
public event EventHandler ProprietaryEngineEvent
{
[MethodImplAttribute(MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.Private, ref VoiceSynthesizer._proprietaryEngineEvent, value);
}
[MethodImplAttribute(MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.Private, ref VoiceSynthesizer._proprietaryEngineEvent, value);
}
}
#endif
///
/// TODOC
///
///
public event EventHandler StateChanged
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._stateChanged += value;
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._stateChanged -= value;
}
}
#endregion
#endregion Events
//*******************************************************************
//
// Public Properties
//
//********************************************************************
#region public Properties
///
/// TODOC
///
///
public SynthesizerState State
{
get
{
return VoiceSynthesizer.State;
}
}
///
/// TODOC
///
public int Rate
{
set
{
if (value < -10 || value > 10)
{
throw new ArgumentOutOfRangeException ("value", SR.Get (SRID.RateOutOfRange));
}
VoiceSynthesizer.Rate = value;
}
get
{
return VoiceSynthesizer.Rate;
}
}
///
/// TODOC
///
public int Volume
{
set
{
if (value < 0 || value > 100)
{
throw new ArgumentOutOfRangeException ("value", SR.Get (SRID.ResourceUsageOutOfRange));
}
VoiceSynthesizer.Volume = value;
}
get
{
return VoiceSynthesizer.Volume;
}
}
///
/// TODOC
///
///
public VoiceInfo Voice
{
get
{
// Get the sapi voice
return VoiceSynthesizer.CurrentVoice (true).VoiceInfo;
}
}
//*******************************************************************
//
// Internal Properties
//
//*******************************************************************
#region Internal Properties
#if SPEECHSERVER || PROMPT_ENGINE
static internal string PromptVoices
{
set
{
_promptVoices = value;
}
get
{
return _promptVoices;
}
}
#endif
#endregion
#endregion
//*******************************************************************
//
// Private Methods
//
//********************************************************************
#region Private Methods
///
/// TODOC
///
///
///
///
///
private void SetOutputStream (Stream stream, SpeechAudioFormatInfo formatInfo, bool headerInfo, bool closeStreamOnExit)
{
SetOutputToNull ();
_outputStream = stream;
_closeStreamOnExit = closeStreamOnExit;
// Need to serialize into a proper wav file before closing the stream
VoiceSynthesizer.SetOutput (stream, formatInfo, headerInfo);
}
///
/// TODOC
///
///
private void Dispose (bool disposing)
{
if (!_isDisposed && disposing)
{
if (_voiceSynthesis != null)
{
// flag it first so asynchronous operation has more time to finish
_isDisposed = true;
SpeakAsyncCancelAll ();
// Flush the Output stream
if (_outputStream != null)
{
if (_closeStreamOnExit)
{
_outputStream.Close ();
}
else
{
_outputStream.Flush ();
}
_outputStream = null;
}
}
}
if (_voiceSynthesis != null)
{
// Terminate the background synthesis object the thread.
_voiceSynthesis.Dispose ();
_voiceSynthesis = null;
}
_isDisposed = true;
}
#endregion
//*******************************************************************
//
// Private Properties
//
//********************************************************************
#region Private Properties
private VoiceSynthesis VoiceSynthesizer
{
get
{
if (_voiceSynthesis == null && _isDisposed)
{
throw new ObjectDisposedException ("SpeechSynthesizer");
}
if (_voiceSynthesis == null)
{
WeakReference wr = new WeakReference (this);
_voiceSynthesis = new VoiceSynthesis (wr);
}
return _voiceSynthesis;
}
}
#endregion
//********************************************************************
//
// Private Fields
//
//*******************************************************************
#region Private Fields
// SpVoice for this synthesizer
private VoiceSynthesis _voiceSynthesis;
// Is the object disposed?
private bool _isDisposed;
// Count of number of consecutive calls to Paused
private bool paused;
// .Net Stream - keep a reference to it to avoid it to be GC
private Stream _outputStream;
// If stream were created in SpeechFx then close it, otherwise it should remain open.
private bool _closeStreamOnExit;
#if SPEECHSERVER || PROMPT_ENGINE
private static string _promptVoices = SAPICategories.PromptVoices;
#endif
#endregion Fields
}
//********************************************************************
//
// Public Enums
//
//*******************************************************************
#region Public Enums
///
/// TODOC
///
public enum SynthesizerState
{
///
/// TODOC
///
Ready,
///
/// TODOC
///
Speaking,
///
/// TODOC
///
Paused
}
#if !SPEECHSERVER
///
/// TODOC
///
[Flags]
public enum SynthesizerEmphasis
{
///
/// TODOC
///
Stressed = 1,
///
/// TODOC
///
Emphasized = 2
}
#endif
#endregion
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Runtime.CompilerServices;
using System.Speech.AudioFormat;
using System.Speech.Internal;
using System.Speech.Internal.ObjectTokens;
using System.Speech.Internal.Synthesis;
using System.Speech.Synthesis.TtsEngine;
using System.Threading;
using RegistryDataKey = System.Speech.Internal.ObjectTokens.RegistryDataKey;
using RegistryEntry = System.Collections.Generic.KeyValuePair;
namespace System.Speech.Synthesis
{
///
/// TODOC
///
public sealed class SpeechSynthesizer : IDisposable
#if SPEECHSERVER || PROMPT_ENGINE
, ISesSynthesizer
#endif
{
//*******************************************************************
//
// Constructors
//
//*******************************************************************
#region Constructors
///
/// TODOC
///
public SpeechSynthesizer ()
{
}
#if SPEECHSERVER
///
/// TODOC
///
internal SpeechSynthesizer (bool outputAsText) : this ()
{
VoiceSynthesizer._outputAsText = outputAsText;
}
#endif
///
///
///
~SpeechSynthesizer ()
{
Dispose (false);
}
///
/// TODOC
///
public void Dispose ()
{
Dispose (true);
GC.SuppressFinalize (this);
}
#endregion
//********************************************************************
//
// Public Methods
//
//*******************************************************************
#region public Methods
///
/// TODOC
///
///
public void SelectVoice (string name)
{
Helpers.ThrowIfEmptyOrNull (name, "name");
TTSVoice ttsVoice = VoiceSynthesizer.GetEngine (name, CultureInfo.CurrentUICulture, VoiceGender.NotSet, VoiceAge.NotSet, 1, true);
if (ttsVoice == null || name != ttsVoice.VoiceInfo.Name)
{
// No match - throw
throw new ArgumentException (SR.Get (SRID.SynthesizerSetVoiceNoMatch));
}
VoiceSynthesizer.Voice = ttsVoice;
}
///
/// TODOC
///
///
public void SelectVoiceByHints (VoiceGender gender)
{
SelectVoiceByHints (gender, VoiceAge.NotSet, 1, CultureInfo.CurrentUICulture);
}
///
/// TODOC
///
///
///
public void SelectVoiceByHints (VoiceGender gender, VoiceAge age)
{
SelectVoiceByHints (gender, age, 1, CultureInfo.CurrentUICulture);
}
///
/// TODOC
///
///
///
///
public void SelectVoiceByHints (VoiceGender gender, VoiceAge age, int voiceAlternate)
{
SelectVoiceByHints (gender, age, voiceAlternate, CultureInfo.CurrentUICulture);
}
///
/// TODOC
///
///
///
///
///
public void SelectVoiceByHints (VoiceGender gender, VoiceAge age, int voiceAlternate, CultureInfo culture)
{
Helpers.ThrowIfNull (culture, "culture");
if (voiceAlternate < 0)
{
throw new ArgumentOutOfRangeException ("voiceAlternate", SR.Get (SRID.PromptBuilderInvalidVariant));
}
if (!VoiceInfo.ValidateGender (gender))
{
throw new ArgumentException (SR.Get (SRID.EnumInvalid, "VoiceGender"), "gender");
}
if (!VoiceInfo.ValidateAge (age))
{
throw new ArgumentException (SR.Get (SRID.EnumInvalid, "VoiceAge"), "age");
}
TTSVoice ttsVoice = VoiceSynthesizer.GetEngine (null, culture, gender, age, voiceAlternate, true);
if (ttsVoice == null)
{
// No match - throw
throw new InvalidOperationException (SR.Get (SRID.SynthesizerSetVoiceNoMatch));
}
VoiceSynthesizer.Voice = ttsVoice;
}
///
/// TODOC
///
///
///
public Prompt SpeakAsync (string textToSpeak)
{
Helpers.ThrowIfNull (textToSpeak, "textToSpeak");
Prompt prompt = new Prompt (textToSpeak, SynthesisTextFormat.Text);
SpeakAsync (prompt);
return prompt;
}
///
/// TODOC
///
///
///
public void SpeakAsync (Prompt prompt)
{
Helpers.ThrowIfNull (prompt, "prompt");
prompt.Synthesizer = this;
VoiceSynthesizer.SpeakAsync (prompt);
}
///
/// TODOC
///
///
///
public Prompt SpeakSsmlAsync (string textToSpeak)
{
Helpers.ThrowIfNull (textToSpeak, "textToSpeak");
Prompt prompt = new Prompt (textToSpeak, SynthesisTextFormat.Ssml);
SpeakAsync (prompt);
return prompt;
}
///
/// TODOC
///
///
///
public Prompt SpeakAsync (PromptBuilder promptBuilder)
{
Helpers.ThrowIfNull (promptBuilder, "promptBuilder");
Prompt prompt = new Prompt (promptBuilder);
SpeakAsync (prompt);
return prompt;
}
///
/// TODOC
///
///
///
public void Speak (string textToSpeak)
{
Speak (new Prompt (textToSpeak, SynthesisTextFormat.Text));
}
///
/// TODOC
///
///
///
public void Speak (Prompt prompt)
{
Helpers.ThrowIfNull (prompt, "prompt");
// Avoid a dead lock if the synthesizer is Paused
if (State == SynthesizerState.Paused)
{
throw new InvalidOperationException (SR.Get (SRID.SynthesizerSyncSpeakWhilePaused));
}
prompt.Synthesizer = this;
prompt._syncSpeak = true;
VoiceSynthesizer.Speak (prompt);
}
///
/// TODOC
///
///
///
public void Speak (PromptBuilder promptBuilder)
{
Speak (new Prompt (promptBuilder));
}
///
/// TODOC
///
///
///
public void SpeakSsml (string textToSpeak)
{
Speak (new Prompt (textToSpeak, SynthesisTextFormat.Ssml));
}
///
/// Pause the playback of all speech in this synthesizer.
///
public void Pause ()
{
// Increment the Paused count
if (!paused)
{
VoiceSynthesizer.Pause ();
paused = true;
}
}
///
/// Resume the playback of all speech in this synthesizer.
///
public void Resume ()
{
if (paused)
{
VoiceSynthesizer.Resume ();
paused = false;
}
}
///
/// Cancel playback of all Prompts currently in the queue.
///
///
public void SpeakAsyncCancel (Prompt prompt)
{
Helpers.ThrowIfNull (prompt, "prompt");
VoiceSynthesizer.Abort (prompt);
}
///
/// Cancel playback of all Prompts currently in the queue.
///
public void SpeakAsyncCancelAll ()
{
VoiceSynthesizer.Abort ();
}
///
/// TODOC
///
///
// The stream is disposed when the speech synthesizer is disposed
public void SetOutputToWaveFile (string path)
{
Helpers.ThrowIfEmptyOrNull (path, "path");
SetOutputToNull ();
SetOutputStream (new FileStream (path, FileMode.Create, FileAccess.Write), null, true, true);
}
#if !SPEECHSERVER
///
/// TODOC
///
///
///
// The stream is disposed when the speech synthesizer is disposed
public void SetOutputToWaveFile (string path, SpeechAudioFormatInfo formatInfo)
{
Helpers.ThrowIfEmptyOrNull (path, "path");
Helpers.ThrowIfNull (formatInfo, "formatInfo");
SetOutputToNull ();
SetOutputStream (new FileStream (path, FileMode.Create, FileAccess.Write), formatInfo, true, true);
}
#endif
///
/// TODOC
///
///
public void SetOutputToWaveStream (Stream audioDestination)
{
Helpers.ThrowIfNull (audioDestination, "audioDestination");
SetOutputStream (audioDestination, null, true, false);
}
///
/// TODOC
///
///
///
#if !SPEECHSERVER
public void SetOutputToAudioStream (Stream audioDestination, SpeechAudioFormatInfo formatInfo)
#else
internal void SetOutputToAudioStream (Stream audioDestination, SpeechAudioFormatInfo formatInfo)
#endif
{
Helpers.ThrowIfNull (audioDestination, "audioDestination");
Helpers.ThrowIfNull (formatInfo, "formatInfo");
SetOutputStream (audioDestination, formatInfo, false, false);
}
///
/// TODOC
///
public void SetOutputToDefaultAudioDevice ()
{
SetOutputStream (null, null, true, false);
}
///
/// TODOC
///
// The stream is disposed when the speech synthesizer is disposed
public void SetOutputToNull ()
{
// Close the existing stream
if (_outputStream != Stream.Null)
{
VoiceSynthesizer.SetOutput (Stream.Null, null, true);
}
if (_outputStream != null)
{
if (_closeStreamOnExit)
{
_outputStream.Close ();
}
}
_outputStream = Stream.Null;
}
///
/// TODOC
///
///
// Dynamic content, use a method instead of a property to denote that fact
public Prompt GetCurrentlySpokenPrompt ()
{
return VoiceSynthesizer.Prompt;
}
///
/// TODOC
///
///
public ReadOnlyCollection GetInstalledVoices ()
{
return VoiceSynthesizer.GetInstalledVoices (null);
}
///
/// TODOC
///
///
///
public ReadOnlyCollection GetInstalledVoices (CultureInfo culture)
{
Helpers.ThrowIfNull (culture, "culture");
if (culture.Equals (CultureInfo.InvariantCulture))
{
throw new ArgumentException (SR.Get (SRID.InvariantCultureInfo), "culture");
}
return VoiceSynthesizer.GetInstalledVoices (culture);
}
///
/// TODOC
///
///
///
public void AddLexicon (Uri uri, string mediaType)
{
Helpers.ThrowIfNull (uri, "uri");
VoiceSynthesizer.AddLexicon (uri, mediaType);
}
///
/// TODOC
///
///
public void RemoveLexicon (Uri uri)
{
Helpers.ThrowIfNull (uri, "uri");
VoiceSynthesizer.RemoveLexicon (uri);
}
#if SPEECHSERVER || PROMPT_ENGINE
///
/// TODOC
///
///
///
void ISesSynthesizer.LoadDatabase (string localName, string alias)
{
VoiceSynthesizer.LoadDatabase (localName, alias);
}
///
/// TODOC
///
///
void ISesSynthesizer.UnloadDatabase (string alias)
{
VoiceSynthesizer.UnloadDatabase (alias);
}
///
/// TODOC
///
///
void ISesSynthesizer.SetResourceLoader (ISpeechResourceLoader resourceLoader)
{
VoiceSynthesizer.SetResourceLoader (resourceLoader);
}
#endif
//********************************************************************
//
// Public Events
//
//********************************************************************
#region public Events
///
/// TODOC
///
public event EventHandler SpeakStarted
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._speakStarted += value;
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._speakStarted -= value;
}
}
///
/// TODOC
///
public event EventHandler SpeakCompleted
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._speakCompleted += value;
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._speakCompleted -= value;
}
}
///
/// TODOC
///
public event EventHandler SpeakProgress
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.WordBoundary, ref VoiceSynthesizer._speakProgress, value);
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.WordBoundary, ref VoiceSynthesizer._speakProgress, value);
}
}
///
/// TODOC
///
public event EventHandler BookmarkReached
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.Bookmark, ref VoiceSynthesizer._bookmarkReached, value);
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.Bookmark, ref VoiceSynthesizer._bookmarkReached, value);
}
}
///
/// TODOC
///
public event EventHandler VoiceChange
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.VoiceChange, ref VoiceSynthesizer._voiceChange, value);
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.VoiceChange, ref VoiceSynthesizer._voiceChange, value);
}
}
#if !SPEECHSERVER
#region WinFx
///
/// TODOC
///
public event EventHandler PhonemeReached
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.Phoneme, ref VoiceSynthesizer._phonemeReached, value);
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.Phoneme, ref VoiceSynthesizer._phonemeReached, value);
}
}
///
/// TODOC
///
public event EventHandler VisemeReached
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.Viseme, ref VoiceSynthesizer._visemeReached, value);
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.Viseme, ref VoiceSynthesizer._visemeReached, value);
}
}
#endregion
#else
///
/// TODOC
///
public event EventHandler ProprietaryEngineEvent
{
[MethodImplAttribute(MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.AddEvent (TtsEventId.Private, ref VoiceSynthesizer._proprietaryEngineEvent, value);
}
[MethodImplAttribute(MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer.RemoveEvent (TtsEventId.Private, ref VoiceSynthesizer._proprietaryEngineEvent, value);
}
}
#endif
///
/// TODOC
///
///
public event EventHandler StateChanged
{
[MethodImplAttribute (MethodImplOptions.Synchronized)]
add
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._stateChanged += value;
}
[MethodImplAttribute (MethodImplOptions.Synchronized)]
remove
{
Helpers.ThrowIfNull (value, "value");
VoiceSynthesizer._stateChanged -= value;
}
}
#endregion
#endregion Events
//*******************************************************************
//
// Public Properties
//
//********************************************************************
#region public Properties
///
/// TODOC
///
///
public SynthesizerState State
{
get
{
return VoiceSynthesizer.State;
}
}
///
/// TODOC
///
public int Rate
{
set
{
if (value < -10 || value > 10)
{
throw new ArgumentOutOfRangeException ("value", SR.Get (SRID.RateOutOfRange));
}
VoiceSynthesizer.Rate = value;
}
get
{
return VoiceSynthesizer.Rate;
}
}
///
/// TODOC
///
public int Volume
{
set
{
if (value < 0 || value > 100)
{
throw new ArgumentOutOfRangeException ("value", SR.Get (SRID.ResourceUsageOutOfRange));
}
VoiceSynthesizer.Volume = value;
}
get
{
return VoiceSynthesizer.Volume;
}
}
///
/// TODOC
///
///
public VoiceInfo Voice
{
get
{
// Get the sapi voice
return VoiceSynthesizer.CurrentVoice (true).VoiceInfo;
}
}
//*******************************************************************
//
// Internal Properties
//
//*******************************************************************
#region Internal Properties
#if SPEECHSERVER || PROMPT_ENGINE
static internal string PromptVoices
{
set
{
_promptVoices = value;
}
get
{
return _promptVoices;
}
}
#endif
#endregion
#endregion
//*******************************************************************
//
// Private Methods
//
//********************************************************************
#region Private Methods
///
/// TODOC
///
///
///
///
///
private void SetOutputStream (Stream stream, SpeechAudioFormatInfo formatInfo, bool headerInfo, bool closeStreamOnExit)
{
SetOutputToNull ();
_outputStream = stream;
_closeStreamOnExit = closeStreamOnExit;
// Need to serialize into a proper wav file before closing the stream
VoiceSynthesizer.SetOutput (stream, formatInfo, headerInfo);
}
///
/// TODOC
///
///
private void Dispose (bool disposing)
{
if (!_isDisposed && disposing)
{
if (_voiceSynthesis != null)
{
// flag it first so asynchronous operation has more time to finish
_isDisposed = true;
SpeakAsyncCancelAll ();
// Flush the Output stream
if (_outputStream != null)
{
if (_closeStreamOnExit)
{
_outputStream.Close ();
}
else
{
_outputStream.Flush ();
}
_outputStream = null;
}
}
}
if (_voiceSynthesis != null)
{
// Terminate the background synthesis object the thread.
_voiceSynthesis.Dispose ();
_voiceSynthesis = null;
}
_isDisposed = true;
}
#endregion
//*******************************************************************
//
// Private Properties
//
//********************************************************************
#region Private Properties
private VoiceSynthesis VoiceSynthesizer
{
get
{
if (_voiceSynthesis == null && _isDisposed)
{
throw new ObjectDisposedException ("SpeechSynthesizer");
}
if (_voiceSynthesis == null)
{
WeakReference wr = new WeakReference (this);
_voiceSynthesis = new VoiceSynthesis (wr);
}
return _voiceSynthesis;
}
}
#endregion
//********************************************************************
//
// Private Fields
//
//*******************************************************************
#region Private Fields
// SpVoice for this synthesizer
private VoiceSynthesis _voiceSynthesis;
// Is the object disposed?
private bool _isDisposed;
// Count of number of consecutive calls to Paused
private bool paused;
// .Net Stream - keep a reference to it to avoid it to be GC
private Stream _outputStream;
// If stream were created in SpeechFx then close it, otherwise it should remain open.
private bool _closeStreamOnExit;
#if SPEECHSERVER || PROMPT_ENGINE
private static string _promptVoices = SAPICategories.PromptVoices;
#endif
#endregion Fields
}
//********************************************************************
//
// Public Enums
//
//*******************************************************************
#region Public Enums
///
/// TODOC
///
public enum SynthesizerState
{
///
/// TODOC
///
Ready,
///
/// TODOC
///
Speaking,
///
/// TODOC
///
Paused
}
#if !SPEECHSERVER
///
/// TODOC
///
[Flags]
public enum SynthesizerEmphasis
{
///
/// TODOC
///
Stressed = 1,
///
/// TODOC
///
Emphasized = 2
}
#endif
#endregion
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- odbcmetadatacolumnnames.cs
- FeedUtils.cs
- GraphicsPathIterator.cs
- WebPartAddingEventArgs.cs
- SingleAnimationUsingKeyFrames.cs
- SerializationAttributes.cs
- PolicyManager.cs
- StaticExtension.cs
- PropertyReference.cs
- SequenceFullException.cs
- Int32.cs
- ImageKeyConverter.cs
- PropertiesTab.cs
- ImageButton.cs
- AdRotator.cs
- TemplateContent.cs
- MailMessageEventArgs.cs
- TemplateBindingExpression.cs
- COM2ExtendedBrowsingHandler.cs
- ResourceDictionary.cs
- MenuItem.cs
- CompiledIdentityConstraint.cs
- ObjectCacheHost.cs
- Int16KeyFrameCollection.cs
- SelectionItemProviderWrapper.cs
- PreviewPageInfo.cs
- Int16Animation.cs
- SqlBuilder.cs
- DisplayMemberTemplateSelector.cs
- SliderAutomationPeer.cs
- MetadataUtilsSmi.cs
- ResXFileRef.cs
- MediaPlayerState.cs
- WebPartConnectVerb.cs
- ServicesUtilities.cs
- CapabilitiesSection.cs
- RequestTimeoutManager.cs
- DataGridViewCellConverter.cs
- SqlConnectionPoolProviderInfo.cs
- Quaternion.cs
- LexicalChunk.cs
- LoggedException.cs
- SeparatorAutomationPeer.cs
- SizeKeyFrameCollection.cs
- ObjectQueryExecutionPlan.cs
- SqlInternalConnectionTds.cs
- TreePrinter.cs
- QuaternionRotation3D.cs
- IntSecurity.cs
- QilReplaceVisitor.cs
- RandomNumberGenerator.cs
- SystemKeyConverter.cs
- Tracking.cs
- LoginViewDesigner.cs
- NotifyInputEventArgs.cs
- HtmlFormAdapter.cs
- Condition.cs
- RegexRunnerFactory.cs
- WindowsListViewItem.cs
- SqlMetaData.cs
- XmlDataSourceNodeDescriptor.cs
- DataGridViewHitTestInfo.cs
- PrimitiveXmlSerializers.cs
- BaseValidatorDesigner.cs
- SQLUtility.cs
- MemberAssignment.cs
- _LocalDataStore.cs
- SchemaElementDecl.cs
- TextComposition.cs
- VectorConverter.cs
- StructuralCache.cs
- RawAppCommandInputReport.cs
- CompoundFileStreamReference.cs
- DataGridViewAdvancedBorderStyle.cs
- SecuritySessionClientSettings.cs
- CqlWriter.cs
- UnsafeNativeMethods.cs
- TableItemStyle.cs
- DbConnectionInternal.cs
- LowerCaseStringConverter.cs
- SchemaCollectionPreprocessor.cs
- SmtpNtlmAuthenticationModule.cs
- ProfileGroupSettings.cs
- ActivityDesignerResources.cs
- PreProcessInputEventArgs.cs
- PaperSize.cs
- XamlToRtfWriter.cs
- DataGridViewTopRowAccessibleObject.cs
- MenuItem.cs
- DesignerHost.cs
- WCFBuildProvider.cs
- ViewUtilities.cs
- StateItem.cs
- TTSEvent.cs
- ErrorHandlerFaultInfo.cs
- ExtensionWindow.cs
- SplineKeyFrames.cs
- MSAANativeProvider.cs
- ByteAnimationBase.cs
- figurelength.cs