SpVoice VoiceChange event (SAPI 5.3)

Microsoft Speech API 5.3

Object: SpVoice (Events)

VoiceChange Event

The VoiceChange event occurs when the text-to-speech (TTS) engine detects a change of voice while speaking a stream for the SpVoice object.

     StreamNumber As Long,
     StreamPosition As Variant,
     VoiceObjectToken As SpObjectToken)


  • StreamNumber
    The stream number which generated the event. When a voice enqueues more than one stream by speaking asynchronously, the stream number is necessary to associate an event with the appropriate stream.
  • StreamPosition
    The character position in the output stream at which the change of voice occurs.
  • VoiceObjectToken
    The ObjectToken of the new voice.


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

  • A command button called Command1
  • A text box called Text1

Paste this code into the Declarations section of the form.

The Form_Load code creates an SpVoice object. The Command1_Click procedure sets the object's Voice property to three different voices, and enqueues a short sentence in each voice. Each time the TTS engine speaks with a new Voice property, a VoiceChange event is raised. The VoiceChange event code displays the name of the new voice in Text1.

  Option Explicit

Public WithEvents vox As SpeechLib.SpVoice
Const cstrText = "my voice just changed."

Private Sub Command1_Click()

    Set vox.voice = vox.GetVoices("name = microsoft mary").Item(0)
    vox.Speak cstrText, SVSFlagsAsync

    Set vox.voice = vox.GetVoices("name = microsoft mike").Item(0)
    vox.Speak cstrText, SVSFlagsAsync

    Set vox.voice = vox.GetVoices("name = microsoft sam").Item(0)
    vox.Speak cstrText, SVSFlagsAsync

End Sub

Private Sub Form_Load()

    Set vox = New SpVoice

End Sub

Private Sub vox_VoiceChange(ByVal StreamNumber As Long, ByVal StreamPosition As Variant, _
                            ByVal VoiceObjectToken As SpeechLib.ISpeechObjectToken)

    Text1.Text = VoiceObjectToken.GetDescription

End Sub