SpVoice SynchronousSpeakTimeout property (SAPI 5.3)

Microsoft Speech API 5.3

Object: SpVoice

SynchronousSpeakTimeout Property

The SynchronousSpeakTimeout property gets and sets the interval, in milliseconds, after which the voice's synchronous Speak and SpeakStream calls will time out when its output device is unavailable.

When a voice enqueues a text stream, the audio output device represented by its AudioOutput property may be in use. When the text stream is enqueued synchronously, the voice will wait for the amount of time specified in its SynchronousSpeakTimeout property. If the output device does not become available to the voice before the time has elapsed, the voice will time out, the synchronous speech request is cancelled, and the application receives an SPERR_DEVICE_BUSY error. This and other SAPI errors are detailed in Error Codes

There is no equivalent timeout for asynchronous speech. Because synchronous speech prevents applications from receiving events from mouse movements and keyboard input, unexpected voice streams from other applications could freeze an application attempting synchronous speech. The SynchronousSpeakTimeout is designed so that applications can recover from such situations.

Syntax

Set: SpVoice.SynchronousSpeakTimeout = Long
Get: Long = SpVoice.SynchronousSpeakTimeout

Parts

  • SpVoice
    The owning object.
  • Long
    Set: A Long variable that sets the property value.
    Get: A Long variable that gets the property value.

Example

The following Visual Basic form code demonstrates the use of the SynchronousSpeakTimeout property. To run this code, create a form with the following controls:

  • A list box control called List1
  • A command button called Command1

Paste this code into the Declarations section of the form.

The Form_Load procedure creates three voices. The Command1_Click procedure starts the first voice speaking, which makes the audio output device unavailable to the other voices. The SynchronousSpeakTimeout property of the second voice is set to one millisecond, ensuring that it will time out before the first voice finishes speaking. The third voice simply waits for the first voice to finish, and then speaks.

The voices use a subroutine to speak; this subroutine adds each speech request to the list box and tests for the error that occurs when a voice times out.

  Option Explicit

Const SPERR_DEVICE_BUSY = &H80045006;

Dim v1 As SpeechLib.SpVoice
Dim v2 As SpeechLib.SpVoice
Dim v3 As SpeechLib.SpVoice

Private Sub Command1_Click()

    List1.Clear

    'Voice 1 takes control of the audio
    Call SafeSpeak(v1, "This is voice number 1", SVSFlagsAsync)
    Call SafeSpeak(v1, "Voice 2 and voice 3 will wait for me", SVSFlagsAsync)
    v1.WaitUntilDone 100    'ensure that the voice 1 starts first

    'Voice 2 starts waiting until voice 1 is done,
    'but its timeout is very short -- 1 millisecond.
    'So it times out before voice 1 is done.
    v2.SynchronousSpeakTimeout = 1
    Call SafeSpeak(v2, "This is voice 2", SVSFDefault)
    Call SafeSpeak(v2, "This is voice 2 again", SVSFDefault)

    'Voice 3 simply waits until voice 1 is done.
    Call SafeSpeak(v3, "This is voice 3 now", SVSFDefault)

End Sub

Private Sub Form_Load()
    Set v1 = New SpVoice
    Set v2 = New SpVoice
    Set v3 = New SpVoice
End Sub

Private Sub SafeSpeak(who As SpVoice, ByVal txt, ByVal flags)
    On Error GoTo SafeSpeakExit
    DoEvents
    who.Speak txt, flags

SafeSpeakExit:
    Select Case Err.Number
    Case 0:                     List1.AddItem "queued:  " & txt
    Case SPERR_DEVICE_BUSY:     List1.AddItem "timeout: " & txt
    End Select
    Err.Clear
End Sub