Text-to-Speech Overview
ISpVoice Introduction
The central SAPI API for text-to-speech (TTS) is ISpVoice. Using this interface, applications can add TTS support such as speaking text, modifying speech characteristics, changing voices, as well as responding to real-time events while speaking. In fact, most applications should need only this single interface to accomplish everything that is needed for basic TTS support.
Applications obtain access to ISpVoice interface methods by creating a COM object. As the name implies, an ISpVoice object is simply a single instance of a specific TTS voice. Every ISpVoice object is an individual voice. Even if two different ISpVoice objects select the same base voice (for example "Mike"), each of the two voices can be changed and modified independently of the other.
Speaking
When an application first creates an ISpVoice object, the object initializes to the default voice (set in Speech properties of Control Panel). This means that the new object is immediately ready to speak text, no special initialization is needed. At this point, applications can use Speak or SpeakStream to speak any Unicode text data.
Synchronous vs. Asynchronous Speaking
The two speaking functions can generate speech either synchronously (function does not return until text has completely spoken) or asynchronously (function returns immediately but continues speaking as a background process). Asynchronous operation is chosen if the application needs to do something else (highlight text, paint animation, monitor controls, etc.) while speaking. Otherwise, the simplest case is to speak synchronously.
Getting Status Information
During asynchronous speech, applications can get current status information (text position, speech done state, bookmarks, etc.) in one of two ways. The simplest way is to periodically poll the ISpVoice object using the GetStatus method. The other way is to initialize the ISpVoice object so that it sends real-time events to the application as they happen.
Flow Control
As a convenience, most TTS applications allow users to temporarily suspend speech output. The Pause and Resume methods are typically called in response to a user initiated action.
Modifying Voice Attributes
Often with TTS, voice output needs to be modified from its default setting. There are two ways to do this is; either by calling certain ISpVoice API methods, or by embedding special Extended Markup Language (XML) tags within the spoken text. Typically, the API functions are used as global settings that affect the speech independent of current selected voice or document that is spoken. While the XML tags are usually used in much narrower scope, affecting only the spoken style in a single document.
Audio Output
Although usually the default for desktop applications, audio output for TTS is not restricted to hardware sound card destinations. SAPI TTS supports, either directly or indirectly, just about any audio configuration an application may require. Whether the destination is a PC sound card, buffer in memory, or a special telephony hardware, ISpVoice has several audio control methods to change the audio path from its default configuration.
ISpVoice Methods
Speaking Text
Speak | Speaks a text string or file. |
SpeakStream | Speaks a text stream or plays an audio (WAV) stream. |
Real-time Status
GetStatus | Returns current speech and event status information. |
WaitUntilDone | Delays until either the voice has completed speaking or the specified time interval has elapsed. |
SpeakCompleteEvent | Returns an event handle that will be signaled when speech is done. |
Flow Control
Pause | Pauses the output speech at the nearest alert boundary. |
Resume | Resumes speaking. |
Skip | Skips ahead or backward to a new input text position while speaking. |
Changing Voice Attributes
SetRate | Sets the speaking rate in real time. |
GetRate | Returns the current speaking rate. |
SetVolume | Sets the speech volume level in real time. |
GetVolume | Returns the current speech volume level. |
SetVoice | Sets the identity of the voice used for synthesis. |
GetVoice | Retrieves the object token that identifies the current voice. |
Real-time Event Management (inherited from ISpEventSource)
SetInterest | Sets the type of events to queue. |
GetEvents | Returns the queued events. |
GetInfo | Returns information about the event queue. |
SetNotifySink | Sets up the instance to make free-threaded calls through ISpNotifySink::Notify. |
SetNotifyWindowMessage | Sets a window handle to receive notifications as window messages. |
SetNotifyCallbackFunction | Sets a callback function to receive notifications. |
SetNotifyCallbackInterface | Sets an object to receive notifications. |
SetNotifyWin32Event | Sets up a Win32 event object to be used by this instance for notifications. |
WaitForNotifyEvent | A blocking call which waits for a notification. |
GetNotifyEventHandle | Retrieves Win32 event handle associated with this notify source. |
Audio Output Control
SetOutput | Sets the current output object. A value of NULL may be used to select the default audio device. |
GetOutputStream | Retrieves a pointer to the current output stream. |
GetOutputObjectToken | Retrieves the object token for the current output object. |
Miscellaneous
SetPriority | Sets the priority for the voice. |
GetPriority | Retrieves the current voice priority level. |
SetAlertBoundary | Specifies which event should be used as the insertion point for alerts. |
GetAlertBoundary | Retrieves the event that is currently being used as the insertion point for alerts. |
IsUISupported | Determines if the specified type of UI is supported. |
DisplayUI | Displays the requested UI. |
SetSyncSpeakTimeout | Sets the timeout interval in milliseconds after which, synchronous Speak and SpeakStream calls to this instance of the voice will timeout. |
GetSyncSpeakTimeout | Retrieves the timeout interval for synchronous speech operations for this ISpVoice instance. |