Files
2025-05-21 21:20:08 +03:00

1163 lines
38 KiB
Plaintext

VERSION 5.00
Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "mscomctl.ocx"
Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx"
Object = "{86CF1D34-0C5F-11D2-A9FC-0000F8754DA1}#2.0#0"; "mscomct2.ocx"
Begin VB.Form TTSAppMain
BorderStyle = 1 'Fixed Single
Caption = "SAPI5 TTSAPP"
ClientHeight = 6600
ClientLeft = 3345
ClientTop = 3645
ClientWidth = 8085
Icon = "TTSAppMain.frx":0000
LinkTopic = "Form1"
MaxButton = 0 'False
NegotiateMenus = 0 'False
ScaleHeight = 6600
ScaleWidth = 8085
Begin VB.PictureBox VisemePicture
Height = 2175
Left = 120
ScaleHeight = 2115
ScaleWidth = 1635
TabIndex = 27
TabStop = 0 'False
Top = 60
Width = 1700
End
Begin VB.CheckBox chkShowEvents
Caption = "Show Events"
Height = 195
Left = 4560
TabIndex = 25
Top = 4200
Width = 1335
End
Begin VB.CommandButton StopBtn
Caption = "Stop"
Enabled = 0 'False
BeginProperty Font
Name = "MS Sans Serif"
Size = 8.25
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 350
Left = 6840
TabIndex = 2
Top = 500
Width = 1125
End
Begin VB.CheckBox chkSpFlagNLPSpeakPunc
Caption = "NLPSpeakPunc"
Height = 255
Left = 6120
TabIndex = 24
Top = 3480
Width = 1575
End
Begin VB.CheckBox chkSpFlagPurgeBeforeSpeak
Caption = "PurgeBeforeSpeak"
Height = 255
Left = 6120
TabIndex = 22
Top = 3120
Width = 1695
End
Begin VB.CheckBox chkSpFlagAync
Caption = "FlagsAsync"
Height = 255
Left = 6120
TabIndex = 20
Top = 2760
Width = 1575
End
Begin VB.CheckBox chkSpFlagIsFilename
Caption = "IsFilename"
Height = 255
Left = 4560
TabIndex = 23
Top = 3480
Width = 1215
End
Begin VB.CheckBox chkSpFlagPersistXML
Caption = "PersistXML"
Height = 255
Left = 4560
TabIndex = 21
Top = 3120
Width = 1215
End
Begin VB.Frame Frame1
Caption = "Speak Flags"
Height = 1575
Left = 4320
TabIndex = 18
Top = 2400
Width = 3615
Begin VB.CheckBox chkSpFlagIsXML
Caption = "IsXML"
Height = 255
Left = 240
TabIndex = 19
Top = 360
Width = 855
End
End
Begin VB.ComboBox AudioOutputCB
Height = 315
ItemData = "TTSAppMain.frx":030A
Left = 840
List = "TTSAppMain.frx":030C
Style = 2 'Dropdown List
TabIndex = 17
Top = 4125
Width = 3300
End
Begin VB.TextBox MainTxtBox
Height = 2175
HideSelection = 0 'False
Left = 1900
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 0
Text = "TTSAppMain.frx":030E
Top = 60
Width = 4575
End
Begin VB.CommandButton ResetBtn
Caption = "Reset"
Height = 350
Left = 6840
TabIndex = 7
Top = 1820
Width = 1125
End
Begin MSComctlLib.ImageList MouthImgList
Left = 6840
Top = 3960
_ExtentX = 1005
_ExtentY = 1005
BackColor = -2147483643
MaskColor = 12632256
_Version = 393216
End
Begin VB.TextBox DebugTxtBox
BackColor = &H80000000&
Height = 1920
Left = 120
Locked = -1 'True
MultiLine = -1 'True
ScrollBars = 3 'Both
TabIndex = 26
Top = 4600
Width = 7815
End
Begin VB.CommandButton SkipBtn
Caption = "Skip"
Height = 350
Left = 6840
TabIndex = 4
Top = 1380
Width = 500
End
Begin MSComCtl2.UpDown UpDown1
Height = 350
Left = 7725
TabIndex = 6
Top = 1380
Width = 240
_ExtentX = 423
_ExtentY = 609
_Version = 393216
AutoBuddy = -1 'True
BuddyControl = "SkipTxtBox"
BuddyDispid = 196624
OrigLeft = 7560
OrigTop = 1800
OrigRight = 7800
OrigBottom = 2145
Max = 50
Min = -50
SyncBuddy = -1 'True
BuddyProperty = 0
Enabled = -1 'True
End
Begin VB.TextBox SkipTxtBox
Height = 350
Left = 7320
TabIndex = 5
Text = "0"
Top = 1380
Width = 400
End
Begin MSComDlg.CommonDialog ComDlg
Left = 7560
Top = 4080
_ExtentX = 847
_ExtentY = 847
_Version = 393216
End
Begin VB.ComboBox FormatCB
Height = 315
Left = 840
Style = 2 'Dropdown List
TabIndex = 15
Top = 3705
Width = 3300
End
Begin MSComctlLib.Slider RateSldr
Height = 315
Left = 840
TabIndex = 11
ToolTipText = "Changes voice playback rate"
Top = 2895
Width = 3300
_ExtentX = 5821
_ExtentY = 556
_Version = 393216
LargeChange = 1
Min = -10
TickStyle = 3
End
Begin VB.ComboBox VoiceCB
Height = 315
Left = 840
Style = 2 'Dropdown List
TabIndex = 9
Top = 2475
Width = 3300
End
Begin VB.CommandButton PauseBtn
Caption = "Pause"
Enabled = 0 'False
Height = 350
Left = 6840
MaskColor = &H00808080&
TabIndex = 3
Top = 940
Width = 1125
End
Begin VB.CommandButton SpeakBtn
Caption = "Speak"
BeginProperty Font
Name = "MS Sans Serif"
Size = 8.25
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 350
Left = 6840
TabIndex = 1
Top = 60
Width = 1125
End
Begin MSComctlLib.Slider VolumeSldr
Height = 315
Left = 840
TabIndex = 13
ToolTipText = "Changes voice playback volume"
Top = 3300
Width = 3300
_ExtentX = 5821
_ExtentY = 556
_Version = 393216
Max = 100
SelStart = 100
TickStyle = 3
Value = 100
End
Begin VB.Label Label1
Caption = "Audio Output"
BeginProperty Font
Name = "MS Sans Serif"
Size = 8.25
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 375
Left = 120
TabIndex = 16
Top = 4095
Width = 615
End
Begin VB.Label Label5
Caption = "Format"
BeginProperty Font
Name = "MS Sans Serif"
Size = 8.25
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Left = 120
TabIndex = 14
Top = 3735
Width = 615
End
Begin VB.Label Label4
Caption = "Volume"
BeginProperty Font
Name = "MS Sans Serif"
Size = 8.25
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Left = 120
TabIndex = 12
Top = 3330
Width = 735
End
Begin VB.Label Label3
Caption = "Rate"
BeginProperty Font
Name = "MS Sans Serif"
Size = 8.25
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Left = 120
TabIndex = 10
Top = 2925
Width = 735
End
Begin VB.Label Label2
Caption = "Voice"
BeginProperty Font
Name = "MS Sans Serif"
Size = 8.25
Charset = 0
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 255
Left = 120
TabIndex = 8
Top = 2505
Width = 495
End
Begin VB.Menu menuFile
Caption = "File"
Begin VB.Menu menuFileOpenText
Caption = "Open Text File"
Shortcut = ^O
End
Begin VB.Menu menuFileSpeakWave
Caption = "Speak Wave File"
Shortcut = ^W
End
Begin VB.Menu menuFileSaveToWave
Caption = "Save To Wave File"
Shortcut = ^S
End
Begin VB.Menu menuSep
Caption = "-"
End
Begin VB.Menu menuFileExit
Caption = "Quit"
Shortcut = ^Q
End
End
Begin VB.Menu menuHelp
Caption = "Help"
Begin VB.Menu menuAbout
Caption = "About"
End
End
End
Attribute VB_Name = "TTSAppMain"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'=============================================================================
'
' This VB TTS App sample demonstrates most of the TTS functionalities
' supported in SAPI 5.1. The main object used here is SpVoice.
'
' Copyright @ 2001 Microsoft Corporation All Rights Reserved.
'=============================================================================
Option Explicit
' First, declare the main SAPI object we are using in this sample. It is
' created inside Form_Load and released inside Form_Unload.
Dim WithEvents Voice As SpVoice
Attribute Voice.VB_VarHelpID = -1
' Speak flags is a combination of bit flags. These individual bits correspond
' to check boxes on the UI. So m_speakFlags should always be kept in sync
' with the state of those check boxes.
Dim m_speakFlags As SpeechVoiceSpeakFlags
' This is the default format we will use.
Const DefaultFmt = "SAFT22kHz16BitMono"
' We will disable the output combo box and show this if there's no audio output.
Const NoAudioOutput = "No audio ouput object available"
' We will enable/disable menu items and buttons based on current state
' m_speaking indicates whether a speak task is in progress
' m_paused indicates whether Voice.Pause is called
Private m_bSpeaking As Boolean
Private m_bPaused As Boolean
Private Sub Form_Load()
On Error GoTo ErrHandler
' Creates the voice object first
Set Voice = New SpVoice
' Load the voices combo box
Dim Token As ISpeechObjectToken
For Each Token In Voice.GetVoices
VoiceCB.AddItem (Token.GetDescription())
Next
VoiceCB.ListIndex = 0
'load the format combo box
AddItemToFmtCB
' set rate and volume to the same as the Voice
RateSldr.Value = Voice.Rate
VolumeSldr.Value = Voice.Volume
'set the default format
FormatCB.Text = DefaultFmt
' Load the audio output combo box
If Voice.GetAudioOutputs.Count > 0 Then
For Each Token In Voice.GetAudioOutputs
AudioOutputCB.AddItem (Token.GetDescription)
Next
Else
AudioOutputCB.AddItem NoAudioOutput
AudioOutputCB.Enabled = False
End If
AudioOutputCB.ListIndex = 0
'load image list
LoadMouthImages
MouthImgList.MaskColor = vbMagenta
MouthImgList.BackColor = GetSysColor(COLOR_3DFACE)
Set VisemePicture.Picture = MouthImgList.Overlay("MICFULL", "MICFULL")
' init speak flags and sync flag check boxes
m_speakFlags = SVSFlagsAsync Or SVSFPurgeBeforeSpeak Or SVSFIsXML
chkSpFlagAync.Value = Checked
chkSpFlagPurgeBeforeSpeak.Value = Checked
chkSpFlagIsXML.Value = Checked
SetSpeakingState False, False
Exit Sub
ErrHandler:
MsgBox "Error in initialization: " & vbCrLf & vbCrLf & Err.Description & _
vbCrLf & vbCrLf & "Shutting down.", vbOKOnly, "TTSApp"
Set Voice = Nothing
End
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set Voice = Nothing
End Sub
Private Sub AudioOutputCB_Click()
On Error GoTo ErrHandler
' change the output to the selected one
Set Voice.AudioOutput = Voice.GetAudioOutputs().Item(AudioOutputCB.ListIndex)
' changing output may have also changed the format, so call function
' FormatCB_Click to make sure we are using the format as selected
FormatCB_Click
Exit Sub
ErrHandler:
AddDebugInfo "Set audio output error: ", Err.Description
End Sub
Private Sub FormatCB_Click()
On Error GoTo ErrHandler
' Note: AllowAudioOutputFormatChangesOnNextSet is a hidden property, VB
' object browser doesn't show it by default. To see it, you can go to
' VB object viewer, right click and turn on the "show hidden members".
Voice.AllowAudioOutputFormatChangesOnNextSet = False
' The format Type is associated with the selected list item as a long.
Voice.AudioOutputStream.Format.Type = FormatCB.ItemData(FormatCB.ListIndex)
' Currently you have to call this so that SAPI picks up the new format.
Set Voice.AudioOutputStream = Voice.AudioOutputStream
Exit Sub
ErrHandler:
AddDebugInfo "Set format error: ", Err.Description
End Sub
Private Sub menuAbout_Click()
MsgBox "TTSApp" & vbCrLf & vbCrLf & "Copyright (c) 2001 Microsoft Corporation. All rights reserved.", _
vbOKOnly Or vbInformation, "About TTSApp"
End Sub
Private Sub menuFileExit_Click()
Unload TTSAppMain
End
End Sub
Private Sub menuFileOpenText_Click()
Dim sLocation As String
' Set CancelError is True
ComDlg.CancelError = True
On Error GoTo ErrHandler
' Set flags
ComDlg.Flags = cdlOFNFileMustExist Or cdlOFNPathMustExist
' Set Dialog title
ComDlg.DialogTitle = "Open a Text File"
' Set open directory
sLocation = GetDirectory()
If Len(sLocation) <> 0 Then
ComDlg.InitDir = sLocation
End If
' Set filters
ComDlg.Filter = "All Files (*.*)|*.*|Text, XML Files " & "(*.txt;*.xml)|*.txt;*.xml"
' Specify default filter
ComDlg.FilterIndex = 2
' Display the Open dialog box
ComDlg.ShowOpen
' Now open the text file and open it in the text box.
' We only support text files encoded with the system code page as the
' binary to unicode conversion in VB is using system code page.
Open ComDlg.FileName For Binary Access Read As 1
MainTxtBox.Text = StrConv(InputB$(LOF(1), 1), vbUnicode)
Close #1
Exit Sub
ErrHandler:
'User pressed the Cancel button, do not show error
If Not (Err.Number = 32755) Then
AddDebugInfo "Open file: ", Err.Description
End If
End Sub
Private Sub menuFileSaveToWave_Click()
' Set CancelError is True
ComDlg.CancelError = True
On Error GoTo ErrHandler
' Set flags
ComDlg.Flags = cdlOFNOverwritePrompt Or cdlOFNPathMustExist Or cdlOFNNoReadOnlyReturn
' Set Dialog title
ComDlg.DialogTitle = "Save to a Wave File"
' Set filters
ComDlg.Filter = "All Files (*.*)|*.*|Wave Files " & "(*.wav)|*.wav"
' Specify default filter
ComDlg.FilterIndex = 2
' Display the Open dialog box
ComDlg.ShowSave
' create a wave stream
Dim cpFileStream As New SpFileStream
' Set output format to selected format
cpFileStream.Format.Type = FormatCB.ItemData(FormatCB.ListIndex)
' Open the file for write
cpFileStream.Open ComDlg.FileName, SSFMCreateForWrite, False
' Set output stream to the file stream
Voice.AllowAudioOutputFormatChangesOnNextSet = False
Set Voice.AudioOutputStream = cpFileStream
' show action
AddDebugInfo "Save to .wav file"
' speak the given text with given flags
Voice.Speak MainTxtBox.Text, m_speakFlags
' wait until it's done speaking with a really really long timeout.
' the tiemout value is in unit of millisecond. -1 means forever.
Voice.WaitUntilDone -1
' Since the output stream was set to the file stream, we need to
' set back to the selected audio output by calling AudioOutputCB_Click
' as if user just changed it through UI
AudioOutputCB_Click
' close the file stream
cpFileStream.Close
Set cpFileStream = Nothing
MsgBox "WAV file successfully written!", vbOKOnly, "File Saved"
Exit Sub
ErrHandler:
'User pressed the Cancel button, do not show error
If Not (Err.Number = 32755) Then
AddDebugInfo "Save to Wave file Error: ", Err.Description
End If
If Not cpFileStream Is Nothing Then
Set cpFileStream = Nothing
End If
End Sub
Private Sub menuFileSpeakWave_Click()
' Set CancelError is True
ComDlg.CancelError = True
On Error GoTo ErrHandler
' Set flags
ComDlg.Flags = cdlOFNFileMustExist Or cdlOFNPathMustExist
' Set Dialog title
ComDlg.DialogTitle = "Speak a Wave File"
' Set filters
ComDlg.Filter = "All Files (*.*)|*.*|Wave Files " & "(*.wav)|*.wav"
' Specify default filter
ComDlg.FilterIndex = 2
' Display the Open dialog box
ComDlg.ShowOpen
AddDebugInfo "Speak .wav file"
' Speak the contents of the wavefile. Notice here we are passing in the
' file name so the filename flag is set.
MainTxtBox.Text = ComDlg.FileName
chkSpFlagIsFilename.Value = Checked
SpeakBtn_Click
Exit Sub
ErrHandler:
'User pressed the Cancel button, do not show error
If Not (Err.Number = 32755) Then
AddDebugInfo "Speak Wave Error: ", Err.Description
End If
SetSpeakingState False, m_bPaused
Exit Sub
End Sub
Private Sub PauseBtn_Click()
Select Case PauseBtn.Caption
Case "Pause"
AddDebugInfo "Pause"
Voice.Pause
SetSpeakingState m_bSpeaking, True
Case "Resume"
AddDebugInfo "Resume"
Voice.Resume
SetSpeakingState m_bSpeaking, False
End Select
End Sub
Private Sub RateSldr_Scroll()
Voice.Rate = RateSldr.Value
End Sub
Private Sub ResetBtn_Click()
'set output to default
AudioOutputCB.ListIndex = 0
Set Voice.AudioOutput = Nothing
'use default voice
VoiceCB.ListIndex = 0
'Format to default
FormatCB.Text = DefaultFmt
'reset main text field
MainTxtBox.Text = "Enter text you wish spoken here."
'reset volume and rate
VolumeSldr.Value = 100
VolumeSldr_Scroll
RateSldr.Value = 0
RateSldr_Scroll
' reset speak flags
m_speakFlags = SVSFlagsAsync Or SVSFPurgeBeforeSpeak Or SVSFIsXML
chkSpFlagAync.Value = Checked
chkSpFlagPurgeBeforeSpeak.Value = Checked
chkSpFlagIsXML.Value = Checked
chkSpFlagIsFilename.Value = Unchecked
chkSpFlagNLPSpeakPunc.Value = Unchecked
chkSpFlagPersistXML.Value = Unchecked
'reset DebugTxtbox text
DebugTxtBox.Text = Empty
'reset skip text box
SkipTxtBox.Text = "0"
Set VisemePicture.Picture = MouthImgList.Overlay("MICFULL", "MICFULL")
' if it's paused, call Resume to reset state
If m_bPaused Then Voice.Resume
SetSpeakingState False, False
End Sub
Private Sub SkipBtn_Click()
On Error GoTo ErrHandler
Dim SkipType As String
Dim SkipNum As Integer
AddDebugInfo "Skip"
' skip by the number specified
SkipNum = SkipTxtBox.Text
SkipType = "Sentence"
Voice.Skip SkipType, SkipNum
Exit Sub
ErrHandler:
'MsgBox Err.Description & ":" & Err.Number, vbOKOnly, "Skip Error"
AddDebugInfo "Skip Error: ", Err.Description
Exit Sub
End Sub
Private Sub SpeakBtn_Click()
On Error GoTo ErrHandler
AddDebugInfo ("Speak")
' exit if there's nothing to speak
If MainTxtBox.Text = "" Then
Exit Sub
End If
' If it's paused and some text still remains to be spoken, Speak button
' acts the same as Resume button. However a programmer can choose to
' speak from the beginning again or any other behavior.
' In other cases, we speak the text with given flags.
If Not (m_bPaused And m_bSpeaking) Then
' just speak the text with the given flags
Voice.Speak MainTxtBox.Text, m_speakFlags
End If
' Resume if Voice is paused
If m_bPaused Then Voice.Resume
' set the state of menu items and buttons
SetSpeakingState True, False
Exit Sub
ErrHandler:
AddDebugInfo "Speak Error: ", Err.Description
SetSpeakingState False, m_bPaused
End Sub
Private Sub StopBtn_Click()
On Error GoTo ErrHandler
AddDebugInfo ("Stop")
' when string to speak is NULL and dwFlags is set to SPF_PURGEBEFORESPEAK
' it indicates to SAPI that any remaining data to be synthesized should
' be discarded.
Voice.Speak vbNullString, SVSFPurgeBeforeSpeak
If m_bPaused Then Voice.Resume
SetSpeakingState False, False
Exit Sub
ErrHandler:
AddDebugInfo "Speak Error: ", Err.Description
End Sub
Private Sub Voice_AudioLevel(ByVal StreamNumber As Long, _
ByVal StreamPosition As Variant, _
ByVal AudioLevel As Long)
ShowEvent "AudioLevel", "StreamNumber=" & StreamNumber, _
"StreamPosition=" & StreamPosition, "AudioLevel=" & AudioLevel
End Sub
Private Sub Voice_Bookmark(ByVal StreamNumber As Long, _
ByVal StreamPosition As Variant, _
ByVal Bookmark As String, _
ByVal BookmarkId As Long)
ShowEvent "BookMark", "StreamNumber=" & StreamNumber, _
"StreamPosition=" & StreamPosition, "Bookmark=" & Bookmark, _
"BookmarkId=" & BookmarkId
End Sub
Private Sub Voice_EndStream(ByVal StreamNum As Long, ByVal StreamPos As Variant)
ShowEvent "EndStream", "StreamNum=" & StreamNum, "StreamPos=" & StreamPos
' select all text to indicate that we are done
HighLightSpokenWords 0, Len(MainTxtBox.Text)
' reset the mouth
Set VisemePicture.Picture = MouthImgList.Overlay("MICFULL", "MICFULL")
' reset the state of buttons, checkboxes and menu items
SetSpeakingState False, m_bPaused
End Sub
Private Sub Voice_EnginePrivate(ByVal StreamNumber As Long, _
ByVal StreamPosition As Long, _
ByVal lParam As Variant)
ShowEvent "EnginePrivate", "StreamNumber=" & StreamNumber, _
"StreamPosition=" & StreamPosition, "lParam=" & lParam
End Sub
Private Sub Voice_Phoneme(ByVal StreamNumber As Long, _
ByVal StreamPosition As Variant, _
ByVal Duration As Long, _
ByVal NextPhoneId As Integer, _
ByVal Feature As SpeechLib.SpeechVisemeFeature, _
ByVal CurrentPhoneId As Integer)
ShowEvent "Phoneme", "StreamNumber=" & StreamNumber, _
"StreamPosition=" & StreamPosition, "NextPhoneId=" & NextPhoneId, _
"Feature=" & Feature, "CurrentPhoneId=" & CurrentPhoneId
End Sub
Private Sub Voice_Sentence(ByVal StreamNum As Long, _
ByVal StreamPos As Variant, _
ByVal Pos As Long, _
ByVal Length As Long)
ShowEvent "Sentence", "StreamNum=" & StreamNum, "StreamPos=" & StreamPos, _
"Pos=" & Pos, "Length=" & Length
End Sub
Private Sub Voice_StartStream(ByVal StreamNum As Long, ByVal StreamPos As Variant)
ShowEvent "StartStream", "StreamNum=" & StreamNum, "StreamPos=" & StreamPos
' reset the state of buttons, checkboxes and menu items
SetSpeakingState True, m_bPaused
End Sub
Private Sub Voice_Viseme(ByVal StreamNum As Long, _
ByVal StreamPos As Variant, _
ByVal Duration As Long, _
ByVal VisemeType As SpeechVisemeType, _
ByVal Feature As SpeechVisemeFeature, _
ByVal VisemeId As Long)
ShowEvent "Viseme", "StreamNum=" & StreamNum, "StreamPos=" & StreamPos, _
"Duration=" & Duration, "VisemeType=" & VisemeType, _
"Feature=" & Feature, "VisemeId=" & VisemeId
' Here we are going to show different mouth positions according to the viseme.
' The picture we show doesn't necessarily match the real mouth position.
' Just trying to make it more interesting.
If VisemeId = 0 Then
VisemeId = VisemeId + 1
End If
Set VisemePicture.Picture = MouthImgList.Overlay("MICFULL", VisemeId)
If (VisemeId Mod 6 = 2) Then
Set VisemePicture.Picture = MouthImgList.Overlay("MICFULL", "MICEYECLOSED")
Else
If (VisemeId Mod 6 = 5) Then
Set VisemePicture.Picture = MouthImgList.Overlay("MICFULL", "MICEYENARROW")
End If
End If
End Sub
Private Sub Voice_VoiceChange(ByVal StreamNum As Long, _
ByVal StreamPos As Variant, _
ByVal Token As SpeechLib.ISpeechObjectToken)
ShowEvent "VoiceChange", "StreamNum=" & StreamNum, "StreamPos=" & StreamPos, _
"Token=" & Token.GetDescription
' Let's sync up the combo box with the new value
Dim i As Long
For i = 0 To VoiceCB.ListCount - 1
If VoiceCB.List(i) = Token.GetDescription() Then
VoiceCB.ListIndex = i
Exit For
End If
Next
End Sub
Private Sub Voice_Word(ByVal StreamNum As Long, _
ByVal StreamPos As Variant, _
ByVal Pos As Long, _
ByVal Length As Long)
ShowEvent "Word", "StreamNum=" & StreamNum, "StreamPos=" & StreamPos, _
"Pos=" & Pos, "Length=" & Length
Debug.Print Pos, Length, MainTxtBox.SelStart, MainTxtBox.SelLength
' Select the word that's currently being spoken.
HighLightSpokenWords Pos, Length
End Sub
Private Sub VoiceCB_Click()
' change the voice to the selected one
Set Voice.Voice = Voice.GetVoices().Item(VoiceCB.ListIndex)
End Sub
Private Sub VolumeSldr_Scroll()
Voice.Volume = VolumeSldr.Value
End Sub
' The following functions are simply to sync up the speak flags.
' When the check box is checked, the corresponding bit is set in the flags.
Private Sub chkSpFlagAync_Click()
m_speakFlags = SetOrClearFlag(chkSpFlagAync.Value, m_speakFlags, SVSFlagsAsync)
End Sub
Private Sub chkSpFlagIsFilename_Click()
m_speakFlags = SetOrClearFlag(chkSpFlagIsFilename.Value, m_speakFlags, SVSFIsFilename)
End Sub
Private Sub chkSpFlagIsXML_Click()
' Note: special case here. There are two flags,SVSFIsXML and SVSFIsNotXML.
' When neither is set, SAPI will guess by peeking at beginning characters.
' In this sample, we explicitly set one of them.
If chkSpFlagIsXML.Value = 0 Then
' clear SVSFIsXML bit and set SVSFIsNotXML bit
m_speakFlags = m_speakFlags And Not SVSFIsXML
m_speakFlags = m_speakFlags Or SVSFIsNotXML
Else
' clear SVSFIsNotXML bit and set SVSFIsXML bit
m_speakFlags = m_speakFlags And Not SVSFIsNotXML
m_speakFlags = m_speakFlags Or SVSFIsXML
End If
End Sub
Private Sub chkSpFlagNLPSpeakPunc_Click()
m_speakFlags = SetOrClearFlag(chkSpFlagNLPSpeakPunc.Value, m_speakFlags, SVSFNLPSpeakPunc)
End Sub
Private Sub chkSpFlagPersistXML_Click()
m_speakFlags = SetOrClearFlag(chkSpFlagPersistXML.Value, m_speakFlags, SVSFPersistXML)
End Sub
Private Sub chkSpFlagPurgeBeforeSpeak_Click()
m_speakFlags = SetOrClearFlag(chkSpFlagPurgeBeforeSpeak.Value, m_speakFlags, SVSFPurgeBeforeSpeak)
End Sub
Private Sub AddFmts(ByRef name As String, ByVal fmt As SpeechAudioFormatType)
Dim index As String
' get the count of existing list so that we are adding to the bottom of the list
index = FormatCB.ListCount
' add the name to the list box and associate the format type with the item
FormatCB.AddItem name, index
FormatCB.ItemData(index) = fmt
End Sub
Private Sub AddItemToFmtCB()
AddFmts "SAFT8kHz8BitMono", SAFT8kHz16BitMono
AddFmts "SAFT8kHz8BitStereo", SAFT8kHz8BitStereo
AddFmts "SAFT8kHz16BitMono", SAFT8kHz16BitMono
AddFmts "SAFT8kHz16BitStereo", SAFT8kHz16BitStereo
AddFmts "SAFT11kHz8BitMono", SAFT11kHz8BitMono
AddFmts "SAFT11kHz8BitStereo", SAFT11kHz8BitStereo
AddFmts "SAFT11kHz16BitMono", SAFT11kHz16BitMono
AddFmts "SAFT11kHz16BitStereo", SAFT11kHz16BitStereo
AddFmts "SAFT12kHz8BitMono", SAFT12kHz8BitMono
AddFmts "SAFT12kHz8BitStereo", SAFT12kHz8BitStereo
AddFmts "SAFT12kHz16BitMono", SAFT12kHz16BitMono
AddFmts "SAFT12kHz16BitStereo", SAFT12kHz16BitStereo
AddFmts "SAFT16kHz8BitMono", SAFT16kHz8BitMono
AddFmts "SAFT16kHz8BitStereo", SAFT16kHz8BitStereo
AddFmts "SAFT16kHz16BitMono", SAFT16kHz16BitMono
AddFmts "SAFT16kHz16BitStereo", SAFT16kHz16BitStereo
AddFmts "SAFT22kHz8BitMono", SAFT22kHz8BitMono
AddFmts "SAFT22kHz8BitStereo", SAFT22kHz8BitStereo
AddFmts "SAFT22kHz16BitMono", SAFT22kHz16BitMono
AddFmts "SAFT22kHz16BitStereo", SAFT22kHz16BitStereo
AddFmts "SAFT24kHz8BitMono", SAFT24kHz8BitMono
AddFmts "SAFT24kHz8BitStereo", SAFT24kHz8BitStereo
AddFmts "SAFT24kHz16BitMono", SAFT24kHz16BitMono
AddFmts "SAFT24kHz16BitStereo", SAFT24kHz16BitStereo
AddFmts "SAFT32kHz8BitMono", SAFT32kHz8BitMono
AddFmts "SAFT32kHz8BitStereo", SAFT32kHz8BitStereo
AddFmts "SAFT32kHz16BitMono", SAFT32kHz16BitMono
AddFmts "SAFT32kHz16BitStereo", SAFT32kHz16BitStereo
AddFmts "SAFT44kHz8BitMono", SAFT44kHz8BitMono
AddFmts "SAFT44kHz8BitStereo", SAFT44kHz8BitStereo
AddFmts "SAFT44kHz16BitMono", SAFT44kHz16BitMono
AddFmts "SAFT44kHz16BitStereo", SAFT44kHz16BitStereo
AddFmts "SAFT48kHz8BitMono", SAFT48kHz8BitMono
AddFmts "SAFT48kHz8BitStereo", SAFT48kHz8BitStereo
AddFmts "SAFT48kHz16BitMono", SAFT48kHz16BitMono
AddFmts "SAFT48kHz16BitStereo", SAFT48kHz16BitStereo
End Sub
Private Sub LoadMouthImages()
On Error GoTo ErrHandler
MouthImgList.ListImages.Add 1, "MICFULL", LoadResPicture("MICFULL", vbResBitmap)
MouthImgList.ListImages.Add 2, , LoadResPicture("MIC11", vbResBitmap)
MouthImgList.ListImages.Add 3, , LoadResPicture("MIC11", vbResBitmap)
MouthImgList.ListImages.Add 4, , LoadResPicture("MIC11", vbResBitmap)
MouthImgList.ListImages.Add 5, , LoadResPicture("MIC10", vbResBitmap)
MouthImgList.ListImages.Add 6, , LoadResPicture("MIC11", vbResBitmap)
MouthImgList.ListImages.Add 7, , LoadResPicture("MIC9", vbResBitmap)
MouthImgList.ListImages.Add 8, , LoadResPicture("MIC2", vbResBitmap)
MouthImgList.ListImages.Add 9, , LoadResPicture("MIC13", vbResBitmap)
MouthImgList.ListImages.Add 10, , LoadResPicture("MIC9", vbResBitmap)
MouthImgList.ListImages.Add 11, , LoadResPicture("MIC12", vbResBitmap)
MouthImgList.ListImages.Add 12, , LoadResPicture("MIC11", vbResBitmap)
MouthImgList.ListImages.Add 13, , LoadResPicture("MIC9", vbResBitmap)
MouthImgList.ListImages.Add 14, , LoadResPicture("MIC3", vbResBitmap)
MouthImgList.ListImages.Add 15, , LoadResPicture("MIC6", vbResBitmap)
MouthImgList.ListImages.Add 16, , LoadResPicture("MIC7", vbResBitmap)
MouthImgList.ListImages.Add 17, , LoadResPicture("MIC8", vbResBitmap)
MouthImgList.ListImages.Add 18, , LoadResPicture("MIC5", vbResBitmap)
MouthImgList.ListImages.Add 19, , LoadResPicture("MIC4", vbResBitmap)
MouthImgList.ListImages.Add 20, , LoadResPicture("MIC7", vbResBitmap)
MouthImgList.ListImages.Add 21, , LoadResPicture("MIC9", vbResBitmap)
MouthImgList.ListImages.Add 22, , LoadResPicture("MIC11", vbResBitmap)
MouthImgList.ListImages.Add 23, "MICEYECLOSED", LoadResPicture("MICEYECLOSED", vbResBitmap)
MouthImgList.ListImages.Add 24, "MICEYENARROW", LoadResPicture("MICEYENARROW", vbResBitmap)
Exit Sub
ErrHandler:
MsgBox Err.Description & ":" & Err.Number, vbOKOnly, "Load Images Error"
End Sub
Private Sub AddDebugInfo(DebugStr As String, Optional Error As String = Empty)
' This function adds debug string to the info window.
' First of all, let's delete a few charaters if the text box is about to
' overflow. In this sample we are using the default limit of charaters.
If Len(DebugTxtBox.Text) > 64000 Then
Debug.Print "Too much stuff in the debug window. Remove first 10K chars"
DebugTxtBox.SelStart = 0
DebugTxtBox.SelLength = 10240
DebugTxtBox.SelText = ""
End If
' append the string to the DebugTxtBox text box and add a newline
DebugTxtBox.SelStart = Len(DebugTxtBox.Text)
DebugTxtBox.SelText = DebugStr & Error & vbCrLf
End Sub
Private Sub ShowEvent(ParamArray strArray())
' we will only show the events if the ShowEvents box is checked
If chkShowEvents.Value = Checked Then
Dim strText As String
strText = Join(strArray, ", ")
AddDebugInfo " Event: " & strText
End If
End Sub
Private Sub HighLightSpokenWords(ByVal Pos As Long, ByVal Length As Long)
On Error GoTo ErrHandler
' Only high light when the MainTxtBox is actually showing the spoken text,
' instead of file name
If chkSpFlagIsFilename.Value = Unchecked Then
MainTxtBox.SelStart = Pos
MainTxtBox.SelLength = Length
End If
Exit Sub
ErrHandler:
AddDebugInfo "Failed to high light words. This may be caused by too many charaters in the main text box."
End Sub
' This following helper function will set or clear a bit (flag) in the given
' integer (base) according to the condition (cond). If cond is 0, the bit
' is cleared. Otherwise, the bit is set. The resulting integer is returned.
Private Function SetOrClearFlag(ByVal cond As Long, _
ByVal base As Long, _
ByVal flag As Long) As Long
If cond = 0 Then
' the condition is false, clear the flag
SetOrClearFlag = base And Not flag
Else
' the condition is false, set the flag
SetOrClearFlag = base Or flag
End If
End Function
Private Sub SetSpeakingState(ByVal bSpeaking As Boolean, ByVal bPaused As Boolean)
' change state of menu items and buttons accordingly
menuFileOpenText.Enabled = Not bSpeaking
menuFileSpeakWave.Enabled = Not bSpeaking
menuFileSaveToWave.Enabled = Not bSpeaking
SpeakBtn.Enabled = True
StopBtn.Enabled = bSpeaking
SkipBtn.Enabled = (bSpeaking And Not bPaused)
PauseBtn.Enabled = bSpeaking
If bPaused Then
PauseBtn.Caption = "Resume"
Else
PauseBtn.Caption = "Pause"
End If
m_bSpeaking = bSpeaking
m_bPaused = bPaused
End Sub
Public Function GetDirectory() As String
Err.Clear
On Error GoTo ErrHandler
Dim DataKey As ISpeechDataKey
Dim Category As New SpObjectTokenCategory
'Get the sdk installation location from the registry
'The value is under "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Speech". The string name is SDKPath"
Category.SetId SpeechRegistryLocalMachineRoot
Set DataKey = Category.GetDataKey
GetDirectory = DataKey.GetStringValue("SDKPath")
GetDirectory = GetDirectory + "samples\common"
ErrHandler:
If Err.Number <> 0 Then
GetDirectory = ""
End If
End Function