Table of Contents
```html
<html>
<head>
<title>Text-to-Speech Writer</title>
<HTA:APPLICATION
APPLICATIONNAME="Text-to-Speech Writer"
ID="TextToSpeech"
VERSION="1.0"
BORDER="dialog"
BORDERSTYLE="static"
INNERBORDER="no"
CAPTION="yes"
SYSMENU="no"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="no"
SCROLL="no"
SCROLLFLAT="yes"
SINGLEINSTANCE="yes"
CONTEXTMENU="no"
SELECTION="no"/>
</head>
<script language="VBScript">
Option Explicit
Dim blnCancelBubble
' ----------------------------------------
'
' OnLoad event handler for the application.
'
' ----------------------------------------
Sub Window_OnLoad
blnCancelBubble = False
' Set up the UI dimensions.
Const intDialogWidth = 550
Const intDialogHeight = 125
' Specify the window position and size.
Self.resizeTo intDialogWidth,intDialogHeight
Self.moveTo (Screen.AvailWidth - intDialogWidth) / 2,_
(Screen.AvailHeight - intDialogHeight) / 2
' Load the list of text-to-speech voices into the drop-down menu.
' See the notes in WriteFile() for more information.
Dim objSAPI, objVoice, objSelect, objOption
Set objSAPI = CreateObject("SAPI.SpVoice")
For Each objVoice In objSAPI.GetVoices("","")
Set objSelect = Document.getElementById("optVoices")
Set objOption = Document.createElement("option")
objOption.text = objVoice.GetDescription()
objSelect.Add objOption
Next
End Sub
' ----------------------------------------
'
' Click handler for the Write button.
'
' ----------------------------------------
Sub btnWrite_OnClick()
' Test for a file name.
If Len(txtFile.Value) > 0 Then
' Test if we need to cancel bubbling of events.
If blnCancelBubble = False Then
' Write the input file.
Call WriteFile(txtFile.Value)
End If
End If
' Specify whether to bubble events.
blnCancelBubble = IIf(blnCancelBubble=True,False,True)
End Sub
' ----------------------------------------
'
' Change handler for the input box.
'
' ----------------------------------------
Sub txtFile_OnChange()
' Enable the Write button.
btnWrite.Disabled = False
' Enable event bubbling.
blnCancelBubble = False
End Sub
' ----------------------------------------
'
' Click handler for the Close button.
'
' ----------------------------------------
Sub btnClose_OnClick()
' Test if we need to cancel bubbling of events.
If blnCancelBubble = False Then
' Prompt the user to exit.
If MsgBox("Are you sure you wish to exit?", _
vbYesNo+vbDefaultButton2+vbQuestion+vbSystemModal, _
TextToSpeech.applicationName)=vbYes Then
' Enable event bubbling.
blnCancelBubble = True
' Close the application.
Window.close
End If
End If
' Specify whether to bubble events.
blnCancelBubble = IIf(blnCancelBubble=True,False,True)
End Sub
' ----------------------------------------
'
' This is an ultra-lame workaround for the lack
' of a DoEvents() feature in HTA applications.
'
' ----------------------------------------
Sub DoEvents()
On Error Resume Next
' Create a shell object.
Dim objShell : Set objShell = CreateObject("Wscript.Shell")
' Call out to the shell and essentially do nothing.
objShell.Run "ver", 0, True
End Sub
' ----------------------------------------
'
' This is an ultra-lame workaround for the lack
' of an IIf() function in vbscript applications.
'
' ----------------------------------------
Function IIf(tx,ty,tz)
If (tx) Then IIf = ty Else IIf = tz
End Function
' ----------------------------------------
'
' Main text-to-speech function
'
' ----------------------------------------
Sub WriteFile(strInputFileName)
On Error Resume Next
Dim objFSO
Dim objFile
Dim objSAPI
Dim objFileStream
Dim strOldTitle
Dim strOutputFilename
Const strProcessing = "Creating WAV file... "
' Define the audio format as 44.1kHz / 16-bit audio.
' See http://msdn.microsoft.com/en-us/library/ms720595.aspx
Const SAFT44kHz16BitStereo = 35
' Allow text to be read as well as written.
' See http://msdn.microsoft.com/en-us/library/ms720858.aspx
Const SSFMCreateForWrite = 3
' Define the output WAV filename.
strOutputFilename = strInputFileName & ".wav"
' Create a file system object and open the input file.
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strInputFileName, 1)
' Disable the form fields.
optVoices.Disabled = True
optRate.Disabled = True
optVolume.Disabled = True
txtFile.Disabled = True
btnWrite.Disabled = True
btnClose.Value = "Cancel"
' Test for an error.
If Err.Number <> 0 Then
MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
Else
' Store the original dialog title.
strOldTitle = Document.title
' Display a status message.
Document.title = strProcessing & Time()
' Pause briefly to let the screen refresh and capture events.
Call DoEvents()
' Create a text-to-speech object.
' See http://msdn.microsoft.com/en-us/library/ms720149.aspx
Set objSAPI = CreateObject("SAPI.SpVoice")
' Create a SAPI file stream object.
' See http://msdn.microsoft.com/en-us/library/ms722561.aspx
Set objFileStream = CreateObject("SAPI.SpFileStream")
' Specify the stream format.
' See http://msdn.microsoft.com/en-us/library/ms720998.aspx
objFileStream.Format.Type = SAFT44kHz16BitStereo
' Open the output file stream.
objFileStream.Open strOutputFilename, SSFMCreateForWrite
' Specify the output file stream.
' See http://msdn.microsoft.com/en-us/library/ms723597.aspx
Set objSAPI.AudioOutputStream = objFileStream
' Specify the speaking rate.
' See http://msdn.microsoft.com/en-us/library/ms723606.aspx
objSAPI.Rate = optRate.Options(optRate.SelectedIndex).Value
' Specify the speaking volume.
' See http://msdn.microsoft.com/en-us/library/ms723615.aspx
objSAPI.Volume = optVolume.Options(optVolume.SelectedIndex).Value
' Specify the voice to use.
' See http://msdn.microsoft.com/en-us/library/ms723601.aspx
' See http://msdn.microsoft.com/en-us/library/ms723614.aspx
Set objSAPI.Voice = objSAPI.GetVoices("","").Item(optVoices.SelectedIndex)
' Loop through the lines in the input file.
Do While Not objFile.AtEndOfStream
' Test if we need to cancel bubbling of events.
If blnCancelBubble = True Then
Exit Do
Else
' Display a status message.
Document.title = strProcessing & Time()
' Pause briefly to let the screen refresh and capture events.
Call DoEvents()
' Speak one line from the input file.
' See http://msdn.microsoft.com/en-us/library/ms723609.aspx
objSAPI.Speak objFile.ReadLine
End If
Loop
' Close the output file stream.
objFileStream.Close
End If
' Close the input file.
objFile.Close
' Destroy all objects.
Set objFileStream = Nothing
Set objSAPI = Nothing
Set objFile = Nothing
Set objFSO = Nothing
' Reset the original dialog title.
Document.title = strOldTitle
' Notify the user that the file has been written.
MsgBox "Finished!", vbInformation, strOldTitle
' Re-enable the form fields.
btnClose.Value = "Close"
optVoices.Disabled = False
optRate.Disabled = False
optVolume.Disabled = False
txtFile.Disabled = False
btnWrite.Disabled = False
End Sub
</script>
<body bgcolor="white" id="HtmlBody">
<div id="FormControls">
<table>
<tr>
<td align="left">
<input type="file"
style="width:250px;height:22px"
name="txtFile"
id="txtFile"
onchange="txtFile_OnChange">
</td>
<td align="left">
<input type="button"
style="width:125px;height:22px"
name="btnWrite"
id="btnWrite"
value="Write File"
disabled
onclick="btnWrite_OnClick">
</td>
<td align="right">
<input type="button"
style="width:125px;height:22px"
name="btnClose"
id="btnClose"
value="Close"
onclick="btnClose_OnClick">
</td>
</tr>
<tr>
<td align="left">
<select name="optVoices"
style="width:250px;height:22px">
</select>
</td>
<td align="left">
<select name="optRate"
style="width:125px;height:22px">
<option value="-2">Slowest</option>
<option value="-1">Slower</option>
<option value="0" selected>Normal Speed</option>
<option value="1">Faster</option>
<option value="2">Fastest</option>
</select>
</td>
<td align="right">
<select name="optVolume"
style="width:125px;height:22px">
<option value="25">25% Volume</option>
<option value="50">50% Volume</option>
<option value="75">75% Volume</option>
<option value="100" selected>Full Volume</option>
</select>
</td>
</tr>
</table>
</div>
</body>
</html>