···37373838Dim oShell, oArgs, oEnv
3939Dim oFSO, oStdIn, oStdOut
4040-Dim bVerbose, bSAPI4, bList
4040+Dim bVerbose, bList
4141Dim bMSSP
4242Dim sLanguage, sVoice, sSpeed, sName, sVendor
43434444Dim oSpVoice, oSpFS ' SAPI5 voice and filestream
4545-Dim oTTS, nMode ' SAPI4 TTS object, mode selector
4645Dim oVoice ' for traversing the list of voices
4746Dim nLangID, sSelectString
4847···5958bVerbose = (oEnv("V") <> "")
60596160Set oArgs = WScript.Arguments.Named
6262-bSAPI4 = oArgs.Exists("sapi4")
6361bMSSP = oArgs.Exists("mssp")
6462bList = oArgs.Exists("listvoices")
6563sLanguage = oArgs.Item("language")
6664sVoice = oArgs.Item("voice")
6765sSpeed = oArgs.Item("speed")
68666767+' Create SAPI5 object
6868+If bMSSP Then
6969+ Set oSpVoice = CreateObject("speech.SpVoice")
7070+Else
7171+ Set oSpVoice = CreateObject("SAPI.SpVoice")
7272+End If
7373+If Err.Number <> 0 Then
7474+ WScript.StdErr.WriteLine "Error " & Err.Number _
7575+ & " - could not get SpVoice object." _
7676+ & " SAPI 5 not installed?"
7777+ WScript.Quit 1
7878+End If
69797070-If bSAPI4 Then
7171- ' Create SAPI4 ActiveVoice object
7272- Set oTTS = WScript.CreateObject("ActiveVoice.ActiveVoice", "TTS_")
7373- If Err.Number <> 0 Then
7474- Err.Clear
7575- Set oTTS = WScript.CreateObject("ActiveVoice.ActiveVoice.1", "TTS_")
7676- If Err.Number <> 0 Then
7777- WScript.StdErr.WriteLine "Error - could not get ActiveVoice" _
7878- & " object. SAPI 4 not installed?"
7979- WScript.Quit 1
8080- End If
8181- End If
8282- oTTS.Initialized = 1
8383-8484- If bList Then
8585- ' Just list available voices for the selected language
8686- For Each nLangID in LangIDs(sLanguage)
8787- For nMode = 1 To oTTS.CountEngines
8888- If oTTS.LanguageID(nMode) = nLangID Then
8989- WScript.StdErr.Write oTTS.ModeName(nMode) & ","
9090- End If
9191- Next
8080+If bList Then
8181+ ' Just list available voices for the selected language
8282+ For Each nLangID in LangIDs(sLanguage)
8383+ sSelectString = "Language=" & Hex(nLangID)
8484+ For Each oVoice in oSpVoice.GetVoices(sSelectString)
8585+ WScript.StdErr.Write oVoice.GetAttribute("Name") & ";"
9286 Next
9393- WScript.StdErr.WriteLine
9494- WScript.Quit 0
9595- End If
9696-9797- ' Select matching voice
9898- For Each nLangID in LangIDs(sLanguage)
9999- sSelectString = "LanguageID=" & nLangID
100100- If sVoice <> "" Then
101101- sSelectString = sSelectString & ";Speaker=" & sVoice _
102102- & ";ModeName=" & sVoice
103103- End If
104104- nMode = oTTS.Find(sSelectString)
105105- If oTTS.LanguageID(nMode) = nLangID And (sVoice = "" Or _
106106- oTTS.Speaker(nMode) = sVoice Or oTTS.ModeName(nMode) = sVoice) Then
107107- sName = oTTS.ModeName(nMode)
108108- If bVerbose Then
109109- WScript.StdErr.WriteLine "Using " & sName & " for " & sSelectString
110110- End If
111111- Exit For
112112- Else
113113- sSelectString = ""
114114- End If
11587 Next
116116- If sSelectString = "" Then
117117- WScript.StdErr.WriteLine "Error - found no matching voice for " _
118118- & sLanguage & ", " & sVoice
119119- WScript.Quit 1
120120- End If
121121- oTTS.Select nMode
122122-123123- ' Speed selection
124124- If sSpeed <> "" Then oTTS.Speed = sSpeed
125125-126126- ' Get vendor information
127127- sVendor = oTTS.MfgName(nMode)
128128-129129-Else ' SAPI5
130130- ' Create SAPI5 object
131131- If bMSSP Then
132132- Set oSpVoice = CreateObject("speech.SpVoice")
133133- Else
134134- Set oSpVoice = CreateObject("SAPI.SpVoice")
135135- End If
136136- If Err.Number <> 0 Then
137137- WScript.StdErr.WriteLine "Error " & Err.Number _
138138- & " - could not get SpVoice object." _
139139- & " SAPI 5 not installed?"
140140- WScript.Quit 1
141141- End If
8888+ WScript.StdErr.WriteLine
8989+ WScript.Quit 0
9090+End If
14291143143- If bList Then
144144- ' Just list available voices for the selected language
145145- For Each nLangID in LangIDs(sLanguage)
146146- sSelectString = "Language=" & Hex(nLangID)
147147- For Each oVoice in oSpVoice.GetVoices(sSelectString)
148148- WScript.StdErr.Write oVoice.GetAttribute("Name") & ";"
149149- Next
150150- Next
151151- WScript.StdErr.WriteLine
152152- WScript.Quit 0
9292+' Select matching voice
9393+For Each nLangID in LangIDs(sLanguage)
9494+ sSelectString = "Language=" & Hex(nLangID)
9595+ If sVoice <> "" Then
9696+ sSelectString = sSelectString & ";Name=" & sVoice
15397 End If
154154-155155- ' Select matching voice
156156- For Each nLangID in LangIDs(sLanguage)
157157- sSelectString = "Language=" & Hex(nLangID)
158158- If sVoice <> "" Then
159159- sSelectString = sSelectString & ";Name=" & sVoice
9898+ Set oSpVoice.Voice = oSpVoice.GetVoices(sSelectString).Item(0)
9999+ If Err.Number = 0 Then
100100+ sName = oSpVoice.Voice.GetAttribute("Name")
101101+ If bVerbose Then
102102+ WScript.StdErr.WriteLine "Using " & sName & " for " & sSelectString
160103 End If
161161- Set oSpVoice.Voice = oSpVoice.GetVoices(sSelectString).Item(0)
162162- If Err.Number = 0 Then
163163- sName = oSpVoice.Voice.GetAttribute("Name")
164164- If bVerbose Then
165165- WScript.StdErr.WriteLine "Using " & sName & " for " & sSelectString
166166- End If
167167- Exit For
168168- Else
169169- sSelectString = ""
170170- Err.Clear
171171- End If
172172- Next
173173- If sSelectString = "" Then
174174- WScript.StdErr.WriteLine "Error - found no matching voice for " _
175175- & sLanguage & ", " & sVoice
176176- WScript.Quit 1
104104+ Exit For
105105+ Else
106106+ sSelectString = ""
107107+ Err.Clear
177108 End If
178178-179179- ' Speed selection
180180- If sSpeed <> "" Then oSpVoice.Rate = sSpeed
109109+Next
110110+If sSelectString = "" Then
111111+ WScript.StdErr.WriteLine "Error - found no matching voice for " _
112112+ & sLanguage & ", " & sVoice
113113+ WScript.Quit 1
114114+End If
181115182182- ' Get vendor information, protect from missing attribute
183183- sVendor = oSpVoice.Voice.GetAttribute("Vendor")
184184- If Err.Number <> 0 Then
185185- Err.Clear
186186- sVendor = "(unknown)"
187187- ' Some L&H engines don't set the vendor attribute - check the name
188188- If Len(sName) > 3 And Left(sName, 3) = "LH " Then
189189- sVendor = "L&H"
190190- End If
116116+' Speed selection
117117+If sSpeed <> "" Then oSpVoice.Rate = sSpeed
118118+' Get vendor information, protect from missing attribute
119119+sVendor = oSpVoice.Voice.GetAttribute("Vendor")
120120+If Err.Number <> 0 Then
121121+ Err.Clear
122122+ sVendor = "(unknown)"
123123+ ' Some L&H engines don't set the vendor attribute - check the name
124124+ If Len(sName) > 3 And Left(sName, 3) = "LH " Then
125125+ sVendor = "L&H"
191126 End If
192192-193193- ' Filestream object for output
194194- Set oSpFS = CreateObject("SAPI.SpFileStream")
195195- oSpFS.Format.Type = AudioFormat(sVendor)
196127End If
128128+129129+' Filestream object for output
130130+Set oSpFS = CreateObject("SAPI.SpFileStream")
131131+oSpFS.Format.Type = AudioFormat(sVendor)
197132198133Do
199134 aLine = Split(oStdIn.ReadLine, vbTab, 2)
···211146 aData = Split(aLine(1), vbTab, 2)
212147 If bVerbose Then WScript.StdErr.WriteLine "Saying " & aData(1) _
213148 & " in " & aData(0)
214214- If bSAPI4 Then
215215- oTTS.FileName = aData(0)
216216- oTTS.Speak aData(1)
217217- While oTTS.Speaking
218218- WScript.Sleep 1
219219- Wend
220220- oTTS.FileName = ""
221221- Else
222222- oSpFS.Open aData(0), SSFMCreateForWrite, false
223223- Set oSpVoice.AudioOutputStream = oSpFS
224224- oSpVoice.Speak aData(1)
225225- oSpFS.Close
226226- End If
149149+ oSpFS.Open aData(0), SSFMCreateForWrite, false
150150+ Set oSpVoice.AudioOutputStream = oSpFS
151151+ oSpVoice.Speak aData(1)
152152+ oSpFS.Close
227153 Case "EXEC"
228154 If bVerbose Then WScript.StdErr.WriteLine "> " & aLine(1)
229155 oShell.Run aLine(1), 0, true