1 '***************************************************************************
3 ' Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 ' Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 ' Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 ' Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 ' Copyright (C) 2007 Steve Bavin, Jens Arnold, Mesar Hameed
12 ' All files in this archive are subject to the GNU General Public License.
13 ' See the file COPYING in the source tree root for full license agreement.
15 ' This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 ' KIND, either express or implied.
18 '***************************************************************************
22 Const SSFMCreateForWrite
= 3
24 ' Audio formats for SAPI5 filestream object
25 Const SPSF_8kHz16BitMono
= 6
26 Const SPSF_11kHz16BitMono
= 10
27 Const SPSF_12kHz16BitMono
= 14
28 Const SPSF_16kHz16BitMono
= 18
29 Const SPSF_22kHz16BitMono
= 22
30 Const SPSF_24kHz16BitMono
= 26
31 Const SPSF_32kHz16BitMono
= 30
32 Const SPSF_44kHz16BitMono
= 34
33 Const SPSF_48kHz16BitMono
= 38
35 Dim oShell
, oArgs
, oEnv
37 Dim sLanguage
, sVoice
, sSpeed
39 Dim oSpVoice
, oSpFS
' SAPI5 voice and filestream
40 Dim oTTS
, nMode
' SAPI4 TTS object, mode selector
41 Dim nLangID
, sSelectString
43 Dim aLine
, aData
' used in command reading
48 Set oShell
= CreateObject("WScript.Shell")
49 Set oEnv
= oShell
.Environment("Process")
50 bVerbose
= (oEnv("V") <> "")
52 Set oArgs
= WScript
.Arguments
.Named
53 bSAPI4
= oArgs
.Exists("sapi4")
54 sLanguage
= oArgs
.Item("language")
55 sVoice
= oArgs
.Item("voice")
56 sSpeed
= oArgs
.Item("speed")
59 ' Create SAPI4 ActiveVoice object
60 Set oTTS
= WScript
.CreateObject("ActiveVoice.ActiveVoice", "TTS_")
61 If Err
.Number
<> 0 Then
63 Set oTTS
= WScript
.CreateObject("ActiveVoice.ActiveVoice.1", "TTS_")
64 If Err
.Number
<> 0 Then
65 WScript
.StdErr
.WriteLine
"Error - could not get ActiveVoice" _
66 & " object. SAPI 4 not installed?"
72 ' Select matching voice
73 For Each nLangID
in LangIDs(sLanguage
)
74 sSelectString
= "LanguageID=" & nLangID
76 sSelectString
= sSelectString
& ";Speaker=" & sVoice _
77 & ";ModeName=" & sVoice
79 nMode
= oTTS
.Find(sSelectString
)
80 If oTTS
.LanguageID(nMode
) = nLangID
And (sVoice
= "" Or _
81 oTTS
.Speaker(nMode
) = sVoice
Or oTTS
.ModeName(nMode
) = sVoice
) Then
82 If bVerbose
Then WScript
.StdErr
.WriteLine
"Using " & sSelectString
88 If sSelectString
= "" Then
89 WScript
.StdErr
.WriteLine
"Error - found no matching voice for " _
90 & sLanguage
& ", " & sVoice
96 If sSpeed
<> "" Then oSpVoice
.Speed
= sSpeed
99 Set oSpVoice
= CreateObject("SAPI.SpVoice")
100 If Err
.Number
<> 0 Then
101 WScript
.StdErr
.WriteLine
"Error - could not get SpVoice object." _
102 & " SAPI 5 not installed?"
106 ' Select matching voice
107 For Each nLangID
in LangIDs(sLanguage
)
108 sSelectString
= "Language=" & Hex(nLangID
)
110 sSelectString
= sSelectString
& ";Name=" & sVoice
112 Set oSpVoice
.Voice
= oSpVoice
.GetVoices(sSelectString
).Item(0)
113 If Err
.Number
= 0 Then
114 If bVerbose
Then WScript
.StdErr
.WriteLine
"Using " & sSelectString
121 If sSelectString
= "" Then
122 WScript
.StdErr
.WriteLine
"Error - found no matching voice for " _
123 & sLanguage
& ", " & sVoice
128 If sSpeed
<> "" Then oSpVoice
.Rate
= sSpeed
130 ' Filestream object for output
131 Set oSpFS
= CreateObject("SAPI.SpFileStream")
132 oSpFS
.Format
.Type = AudioFormat(oSpVoice
.Voice
.GetAttribute("Vendor"))
136 aLine
= Split(WScript
.StdIn
.ReadLine
, vbTab
, 2)
137 If Err
.Number
<> 0 Then
138 WScript
.StdErr
.WriteLine
"Error " & Err
.Number
& ": " & Err
.Description
141 Select Case aLine(0) ' command
146 WScript
.StdOut
.WriteLine oTTS
.MfgName(nMode
)
148 WScript
.StdOut
.WriteLine oSpVoice
.Voice
.GetAttribute("Vendor")
152 aData
= Split(aLine(1), vbTab
, 2)
153 aData(1) = UTF8decode(aData(1))
154 If bVerbose
Then WScript
.StdErr
.WriteLine
"Saying " & aData(1) _
157 oTTS
.FileName
= aData(0)
164 oSpFS
.Open
aData(0), SSFMCreateForWrite
, false
165 Set oSpVoice
.AudioOutputStream
= oSpFS
166 oSpVoice
.Speak
aData(1)
170 If bVerbose
Then WScript
.StdErr
.WriteLine
"> " & aLine(1)
171 oShell
.Run
aLine(1), 0, true
172 If Err
.Number
<> 0 Then
174 WScript
.StdErr
.Write
"> " & aLine(1) & ": "
176 If Err
.Number
= &H80070002
Then ' Actually file not found
177 WScript
.StdErr
.WriteLine
"command not found"
179 WScript
.StdErr
.WriteLine
"error " & Err
.Number
& ":" _
185 If bVerbose
Then WScript
.StdErr
.WriteLine
"Syncing"
186 WScript
.StdOut
.WriteLine
aLine(1) ' Just echo what was passed
188 If bVerbose
Then WScript
.StdErr
.WriteLine
"Quitting"
196 ' Decode an UTF-8 string into a standard windows unicode string (UTF-16)
197 Function UTF8decode(ByRef sText
)
198 Dim i
, c
, nCode
, nTail
, nTextLen
202 nTextLen
= Len(sText
)
205 c
= Asc(Mid(sText
, i
, 1))
207 If c
<= &h7F
Or c
>= &hC2
Then ' Start of new character
208 If c
< &h80
Then ' U-00000000 - U-0000007F, 1 byte
210 ElseIf c
< &hE0
Then ' U-00000080 - U-000007FF, 2 bytes
213 ElseIf c
< &hF0
Then ' U-00000800 - U-0000FFFF, 3 bytes
216 ElseIf c
< &hF5
Then ' U-00010000 - U-001FFFFF, 4 bytes
223 While nTail
> 0 And i
<= nTextLen
225 c
= Asc(Mid(sText
, i
, 1))
227 If (c
And &hC0
) = &h80
Then ' Valid continuation char
228 nCode
= nCode
* &h40
+ (c
And &h3F
)
229 Else ' Invalid continuation char
239 If nCode
>= &h10000
Then ' Character outside BMP - use surrogate pair
240 nCode
= nCode
- &h10000
241 c
= &hD800
+ ((nCode \
&h400
) And &h3FF
) ' high surrogate
242 UTF8decode
= UTF8decode
& ChrW(c
)
243 nCode
= &hDC00
+ (nCode
And &h3FF
) ' low surrogate
245 UTF8decode
= UTF8decode
& ChrW(nCode
)
249 ' SAPI5 output format selection based on engine
250 Function AudioFormat(ByRef sVendor
)
253 AudioFormat
= SPSF_22kHz16BitMono
255 AudioFormat
= SPSF_32kHz16BitMono
257 AudioFormat
= SPSF_16kHz16BitMono
259 AudioFormat
= SPSF_22kHz16BitMono
261 AudioFormat
= SPSF_16kHz16BitMono
263 AudioFormat
= SPSF_22kHz16BitMono
264 WScript
.StdErr
.WriteLine
"Warning - unknown vendor """ & sVendor _
265 & """ - using default wave format"
269 ' Language mapping rockbox->windows
270 Function LangIDs(ByRef sLanguage
)
273 Select Case sLanguage
275 LangIDs
= Array(&h436
)
277 LangIDs
= Array(&h402
)
279 LangIDs
= Array(&h403
)
281 LangIDs
= Array(&h804
) ' PRC
283 LangIDs
= Array(&h404
) ' Taiwan. Perhaps also Hong Kong, Singapore, Macau?
285 LangIDs
= Array(&h405
)
287 LangIDs
= Array(&h406
)
289 LangIDs
= Array(&h407
, &hc07
, &h1007
, &h1407
)
290 ' Standard, Austrian, Luxembourg, Liechtenstein (Swiss -> wallisertitsch)
292 LangIDs
= Array(&h425
)
294 LangIDs
= Array( &h809
, &h409
, &hc09
, &h1009
, &h1409
, &h1809
, _
295 &h1c09
, &h2009
, &h2409
, &h2809
, &h2c09
, &h3009
, _
297 ' Britsh, American, Australian, Canadian, New Zealand, Ireland,
298 ' South Africa, Jamaika, Caribbean, Belize, Trinidad, Zimbabwe,
301 LangIDs
= Array( &h40a
, &hc0a
, &h80a
, &h100a
, &h140a
, &h180a
, _
302 &h1c0a
, &h200a
, &h240a
, &h280a
, &h2c0a
, &h300a
, _
303 &h340a
, &h380a
, &h3c0a
, &h400a
, &h440a
, &h480a
, _
305 ' trad. sort., mordern sort., Mexican, Guatemala, Costa Rica,
306 ' Panama, Dominican Republic, Venezuela, Colombia, Peru, Argentina,
307 ' Ecuador, Chile, Uruguay, Paraguay, Bolivia, El Salvador,
308 ' Honduras, Nicaragua, Puerto Rico
310 WScript
.StdErr
.WriteLine
"Error: no esperanto support in Windows"
313 LangIDs
= Array(&h40b
)
315 LangIDs
= Array(&h40c
, &h80c
, &hc0c
, &h100c
, &h140c
, &h180c
)
316 ' Standard, Belgian, Canadian, Swiss, Luxembourg, Monaco
318 LangIDs
= Array(&h456
)
320 LangIDs
= Array(&h408
)
322 LangIDs
= Array(&h40d
)
324 LangIDs
= Array(&h40f
)
326 LangIDs
= Array(&h410
, &h810
) ' Standard, Swiss
328 LangIDs
= Array(&h411
)
330 LangIDs
= Array(&h412
)
332 LangIDs
= Array(&h40e
)
334 LangIDs
= Array(&h413
, &h813
) ' Standard, Belgian
336 LangIDs
= Array(&h414
) ' Bokmal
338 LangIDs
= Array(&h814
)
340 LangIDs
= Array(&h415
)
342 LangIDs
= Array(&h816
)
343 Case "portugues-brasileiro"
344 LangIDs
= Array(&h416
)
346 LangIDs
= Array(&h418
)
348 LangIDs
= Array(&h419
)
350 LangIDs
= Array(&h424
)
352 LangIDs
= Array(&h41d
, &h81d
) ' Standard, Finland
354 LangIDs
= Array(&h41f
)
355 Case "wallisertitsch"
356 LangIDs
= Array(&h807
) ' Swiss German