View the manual
VoiceAttack Quick Start Guide (v1.6+)
A few things that you'll need for VoiceAttack to work:
1) Microsoft Windows 7, 8, Vista or XP. Windows Vista and up come with the Windows
Speech Recognition Engine built in. Windows XP, by default, does not. If your copy of
Windows XP does not have these components, you will need to download them from
the VoiceAttack site:
http://www.voiceattack.com/download_for_xp.aspx
You will know right away when you launch VoiceAttack if you do not have the Windows
Speech Recognition Engine :) (Note: a link will appear with the same address listed
above.)
Not even sure if it will work with NT or 2000 or whatever... If you feel adventurous, let
us know if it works out for you & we'll make sure to update this document.
2) The .Net Framework v4. This is a requirement. The installer will show you where to
get it if you don't already have it.
3) A microphone... Although not technically REQUIRED for the program to run, you're not
going to get very far without one. A USB headset is recommended, since you are
probably going to use VoiceAttack to play games.
4) A voice (see #3). :)
5) Your Windows Speech Recognition Engine needs to be trained up. Again, not an
absolute requirement, however, the difference between a trained and untrained system
is like night and day.
Hint: Start in Control Panel... I ran the trainer three times in a row & now recognition
works great!
Getting things going...
Once you've got VoiceAttack installed and you have found out that you meet all the
requirements outlined above, you can just jump right in. To keep things simple, we're going to
assume that you are working with the trial version of VoiceAttack, and this is your first time
running VoiceAttack on this computer. If your microphone is on and the input volume of your
microphone is properly set, you should see VoiceAttack's Level bar moving when you speak.
If the Level bar is not moving, VoiceAttack can't hear you. See the 'Troubleshooting Guide' at
the end of this document.
Notice that VoiceAttack is pretty much not recognizing anything you say. This is good,
because we have not added any commands to the profile. Click the 'Edit' button to view the
commands for this profile.
What is a command? A command is simply a word or phrase you are going to say to
VoiceAttack. When VoiceAttack recognizes the command that you say, it will perform a series
of actions (which can be keyboard key presses, pauses, mouse clicks, application launches,
sound effects, etc.).
Notice that VoiceAttack has a set of commands already set up for demonstration purposes.
You can edit and/or remove all of these items. Let's try one out! Hit the, 'Cancel' button to go
back to the Main screen. Now, you must speak into your microphone. Say the word,
'Calculator'. If everything is lined up right (microphone is on, you have adequate volume and
your speech recognition engine is trained up), you should see the Windows calculator on your
screen. Now say, 'Close Calculator'. The calculator should now be closed. If you are not
seeing the Windows calculator, please refer to the Troubleshooting Guide at the end of this
document.
Note that this help file is kind of basic and doesn't explain some things in super deep
detail. Swing by the VoiceAttack user forum for more detailed
explanations/conversations about pretty much everything.
Thank you for trying VoiceAttack!
PS - This help document is also available online, so please save a tree by not printing this
huge document that changes a lot (pretty please).
http://www.voiceattack.com/help
VoiceAttack Screen Guide
This document will make an attempt to explain the main features of VoiceAttack.
VoiceAttack's Main Screen
This is the main hub for all VoiceAttack activity. There's a lot going on here, so, I've
numbered the main areas of the screen and describe each part below.
1 - Audio indicator
This icon indicates the status of your commands (recognized, unrecognized, error), as
well as a way to tell if your mic is muted.
2 - Options button
Opens the options screen where you will find various settings for VoiceAttack (See
'Options Screen'). Additionally, the registration screens for VoiceAttack are available
through this button (See 'Registration Screen').
3 - Profile management buttons
These two buttons will allow you to edit, delete, export and duplicate your currentlyselected profile or create or import a new profile. Note: Creating, importing, deleting
and duplicating profiles is only available in the registered version of VoiceAttack.
4 - Profile selector
Drop down the list to select one of your created profiles. Each profile contains a set
of commands that you specify.
5 - 'Send commands to' selector
When VoiceAttack recognizes a command, it needs a place to send input. You can
either send input to the Active Window (almost always the most likely case), or, you
can choose to send the input to an application with a specified window title, or even a
named process. Note that this can be overridden at both the profile and even at the
command level (see, 'Profile' and 'Command' screens for more details).
To choose the Active Window, simply choose, 'Active Window' from the list (its the first
item in the list, and, it is the default selection).
To select a window title or named process, just drop down the list. Choosing a window
from the list will indicate to the commands that you issue that you want to send input to
that window. To refresh this list, just drop the list down and select, 'Refresh this list'.
This will display the current set of open windows on your system.
Note that this is a free input text box and you can modify your selection (as detailed
below). Just select the option labeled, ‘Add your own target’ or select the blank option
and start typing.
The value you type into the drop down box can contain wildcards indicated by asterisks
(*). This is handy when the title of the window changes (or even if you just don’t feel
like typing the entire title). To indicate that the window title contains the value you type
in the box, put an asterisk on each end. For instance, if you want to target any
window that contains, 'Notepad' in the title, put, '*Notepad*' (without quotes) in the box.
To indicate that the window title starts with the value in the box, put an asterisk at the
end: 'Notepad*'. To indicate that the window title ends with the value in the box, put
an asterisk at the beginning: '*Notepad'. The values are not case-sensitive. The first
window found to match the criteria indicated will be selected.
Advanced: Note that you can also use process names as they appear in the Windows
Task Manager. You can use wildcards the same as you do with the window titles.
Window titles are checked first, and then the process names. Don’t worry, this
happens very fast.
More advanced: If a window cannot be found by title or process name, the window
class names will then be checked. Wildcards apply if you need them. Note that this
will be the class name of the window itself and not the class name of a child control.
Again, this is an advanced feature that you may never ever use.
See, ‘Application Focus (Process Target) Guide’ near the end of this document for
more help on this topic.
6 - Listening button
This is a toggle button that enables/disables VoiceAttack's 'listening'. That is,
VoiceAttack will stop performing actions on commands that it recognizes. The only
commands VoiceAttack will process are the commands that tell VoiceAttack to start
listening again (if you specified one or more... see 'Command Screen' for more info).
The hotkey for this button can be configured through the VoiceAttack Options screen
Keyboard shortcuts toggle
This toggle button enables/disables VoiceAttack's keyboard shortcuts.
Mouse shortcuts toggle
This toggle button enables/disables VoiceAttack's mouse button shortcuts.
Joystick button toggle
This toggle button enables/disables VoiceAttack's joystick button detection.
Stop Commands button
This will halt all macros that are in progress. Useful if your macros happen to be long.
7 - Recognition log
This log shows what VoiceAttack is 'hearing' and the actions that VoiceAttack is
invoking. This list is quite useful when determining if you need to speak more clearly
or rethink the names of your commands. It's also a lot of fun to say weird phrases and
see what the speech recognition engine *thinks* you said. Fun for the whole family
(maybe). Right-clicking on this log will allow you to copy and clear the text, as well as
allow you to specify some options. For instance, you can indicate if new log entries
appear at the top or at the bottom of the log, as well as specify how many entries the
log will hold. You can also filter out unrecognized commands or just show the latest log
entry only.
Note: Right-clicking (or double-clicking) a 'Recognized' log entry will take you to the
'Edit Command' screen for the selected command in the current profile. If the log entry
is 'Unrecognized', you will be taken to the 'Add Command' screen. This is to aid in
testing new commands and has probably saved me a few pulled hairs. Your mileage
may vary :)
8 - Level Bar
A graphical indicator of the microphone input for VoiceAttack. My guess is that the
first thing you will do when you are launching VoiceAttack is to look at this bar... and
then say, 'helloooooooooooo' into your microphone to see if all is working. Maybe
that's just me.
9 - Compact Mode
Click this button to toggle between VoiceAttack's full-size and compact modes.
The context menu that is accessible from the icon in the top-left corner contains the option to
set VoiceAttack as, ‘Always on top’, as well as quick access to the VoiceAttack help
document.
Profile and Profile Options Screens
This is where you will update each of your profiles. A profile is basically a set of commands
that you define.
1 - Profile Name
Type a unique name here for your profile. Make something descriptive!
2 - Profile Options
This is where you can set up some additional attributes of your profile, as well as
override some of the global items found in the Options screen (such as the various
ways of turning on and off VoiceAttack's listening).
Click this button to go to the profile options/global override screen shown below:
Profile Options General Tab
Profile Options Hotkey Tab
Select each item that you want to override by checking the appropriate box. Where a,
'…' button is indicated, you can click it and be presented with a configuration screen
(the base configuration is outlined in the Options screen). For example, if the
Recognition Global Hotkey is, 'Ctrl + F5' on the Options screen, we have it overridden
here as, 'Alt + F1'. That means that for every other profile, you would press, 'Ctrl + F5'
to toggle VoiceAttack's listening, but, when you are in this profile, you would use, 'Alt +
F1'. This same principle is carried over into the, 'Mouse Click Recognition', 'Stop
Command Hotkey' and the, 'Joystick Recognition Button’ (See the Options page for
more on what these features do).
The, 'Override listening if my spoken command begins with...' option was added
as a fun way to interact with VoiceAttack (even if VoiceAttack is not listening). If you
say what is in the input box before your command, VoiceAttack will listen to that
command and go back to not listening. For instance, let's say you have a spoken
command called, 'Attack', and VoiceAttack's listening is off. Let's also say that your
listening override is, 'computer' (as shown). While listening is off, you can say, 'Attack'
all day, and nothing will happen. If this option is on, you can say, 'Computer, Attack'
and VoiceAttack will execute the, 'Attack' command (and then resume not listening).
'Override global minimum confidence level' allows you to set the minimum
confidence level of recognized phrases. This overrides the value set globally on the,
'Options' screen. Note that you can override this value on individual commands as
well. See, 'Options' screen for more information about confidence levels.
'Execute a command each time a phrase is unrecognized' allows you to pick a
command to run any time a phrase is not recognized. The selected command could
be something as simple as playing a sound to calling a plugin function. Note that the
'{CMD}' token takes on the unrecognized value so you can use it for processing (see
the section on tokens near the end of this document).
'Execute a command each time this profile is loaded' allows you to pick a
command to execute when you switch to this profile (or when VoiceAttack is started
and this profile is already selected). Again, your command can do simple stuff or it
could initialize values for use later. If you need to disable this feature temporarily due
to a problem (for example, loading another profile when your current profile loads... not
a good idea), you can hold down CTRL and Shift when you launch VoiceAttack and
choose the option, 'Disable profile initialization commands (this session only)' and click,
'OK'.
'Execute a command each time a dictation phrase is recognized' allows you to
choose a command that is run any time an entry is made into the dictation buffer. This
could be useful for playing a sound, reading back what was last said or for plugin use.
'Include commands from other profiles' will allow you to reference, or, ‘include’ the
commands from any or all of your other profiles. This way, you can create common
profiles filled with commands that can be shared among several other profiles. The
profiles that you include can be arranged in priority, from highest to lowest. When
duplicate-named commands are encountered, the command in the profile with the
higher priority will be retained. For instance, let’s say you have two profiles that you
want to include: Profile A and Profile B. Profile A has been given a higher priority than
Profile B (it’s higher up on the list). Both profiles have a command called, ‘Fire
Weapons’. When you issue the command, ‘Fire Weapons’, the command from Profile
A will be used, since Profile A has a higher priority.
Note: The current, active profile always has the highest priority.
To edit the list of included profiles, click on the, ‘…’ button to the right. This will bring
up the, ‘Include Profile Commands’ screen. Use the controls on the right side of the
screen to add, arrange and delete included profiles. Click, ‘OK’ when you are finished.
'Enable profile switching for the following windows' - Checking this option will turn
on automatic profile switching for this profile (this option works in conjunction with the
option, ‘Enable Auto Profile Switching’ which is located on the Options screen. What
automatic profile switching does is it allows you to specify one or more running
applications to look out for. If a specified application is detected as the foreground
window, VoiceAttack will automatically switch to this profile. To keep things as simple
as possible, there is a text box that allows you to input the name of the window of the
application that you want to look for. The input for this box is semicolon-delimited so
you can associate your profile with more than one application. Since window titles vary
depending on what you are doing, you can also add asterisks (*) as kind of a basic
wildcard. If you put the asterisk at the end of the title, the search becomes, 'starts with'
(for example, 'Notepad*'). If you put the asterisk at the beginning ('*Notepad'), the
search becomes, 'ends with'. If you put an asterisk on both ends ('*Notepad*'), the
search becomes, 'contains'. No asterisks (‘Notepad’) means a direct comparison
(equals), and a single asterisk (‘*’) indicates that the profile is to be switched to if no
other matches have been made (If VoiceAttack is the active window, the profile will not
automatically switch (for obvious reasons)).
So, let’s say you want your profile to automatically change when you switch over to
either your desktop or Notepad. The desktop window name (oddly enough) is,
'Program Manager' (I know that's weird... there's some help about this down below).
Notepad's window title will change depending on the document you are editing. Your
input would look like this: 'Program Manager;*Notepad*' (without the quotes). That
means VoiceAttack will look for a window titled, 'Program Manager' as well as any
window that has a title that contains, 'Notepad'.
To help with finding out window titles, a new option has been added to the VoiceAttack
Load Options screen. To get to this screen, simply start VoiceAttack while holding
down CTRL + Shift. Select the option titled, 'Show window titles (requires 'Enable
Automatic Profile Switching’ to be checked in the Options screen).' This will show the
window titles in the log so you can see what VoiceAttack sees. Check out the Load
Options screen for more details.
'Send commands to' - Enabling this option will make this profile's commands target
either the active window or another window/process that you specify to receive input.
This will override the target indicated on the main screen (global level). Lots of detail
about process targets can be found in this document in the section titled, 'Application
Focus (Process Target) Guide'. Note that this can be overridden at the command
level (see the 'Command Screen' for details).
To send input to the active window, choose, 'Active Window'. Choosing the active
window at this level is handy when the global settings are directed to a specific
application. Whatever window that is currently active will receive input from
the commands in this profile.
To send input to a specific window or process, choose the option next to the drop down
box. To see what windows are available, drop down the list. Choosing a window from
the list will indicate to the commands in this profile that you want to send input to it.
Note that this is a free input text box and you can modify your selection (as detailed
below).
The value in the drop down box can contain wildcards indicated by asterisks (*). This
is handy when the title of the window changes. To indicate that the window title
contains the value in the box, put an asterisk on each end. For instance, if you want
to target any window that contains, 'Notepad' in the title, put, '*Notepad*' (without
quotes) in the box. To indicate that the window title starts with the value in the box,
put an asterisk at the end: 'Notepad*'. To indicate that the window title ends with the
value in the box, put an asterisk at the beginning: '*Notepad'. The values are not casesensitive. The first window found to match the criteria indicated will be selected.
Advanced: Note that you can also use process names as they appear in the Windows
Task Manager. You can use wildcards the same as you do with the window titles.
Window titles are checked first, and then the process names.
More advanced: If a window cannot be found by title or process name, the window
class names will then be checked. Wildcards apply if you need them. Note that this
will be the class name of the window itself and not the class name of a child control.
Again, this is an advanced feature that you may never ever use.
Now, back to the profile screen...
3 - New Command button
Click this button to add a new command to your profile (See 'Command Screen').
Edit Command button
Click to edit the currently selected command (same as pressing the Enter button on
your keyboard or double-clicking a command in the command list) (See 'Command
Screen').
Delete Command button
Click to delete the currently selected command (same as pressing the Delete button on
your keyboard).
4 - Command list
This list shows all the commands that have been added by you for the currently
selected profile. The first column shows the command name (the words that you will
say into your microphone). In screenshot, the second column shows the category
of your command (depending on your command list, you may also see the description
and shortcut columns), and, the third column shows the actions that will be performed
when VoiceAttack recognizes the command. For example, on the first line, the
command, 'bags' is indicated. If you say the word, 'bags' into your microphone,
VoiceAttack will press the, 'Left Shift' key, plus the, 'B' key. You can double-click a
command in this list to edit the command. Right-clicking on this list will allow you to
add, edit and delete commands. You can also copy and paste commands as well
as copy commands to completely different profiles.
5 - Import Commands button
Click this button to selectively import commands from previously-saved profiles (See,
'Importing Commands').
6 - List filter buttons
Expand/collapse multipart commands - This button toggles the view to show
multipart commands (commands that have names separated by a semicolon) as one
row or multiple rows.
Toggle Category Grouping - Use this button to group by category. Grouping by
category will let you show/hide groups of commands that have the same category.
Note that when the list is grouped by category, you can click on the group headers to
expand or collapse that group. You can expand/collapse all groups If you hold down
the CTRL key while expanding or collapsing a group. Renaming categories for
multiple commands can be done by right-clicking on the group header and
selecting, 'Rename Category'.
In this area, you will also see an indicator that shows how many commands are in your
profile. If you have filters applied, you will see how many commands are available,
plus how many are displayed. The tool tip you see when you hover over this
information will display the number of derived commands that are created by things like
dynamic commands or composite (prefix/suffix) commands.
List Filter Input Box - Start typing in this box and the command list will be filtered
down to display any field that contains the text that is typed. Clear this box to remove
the filter (this does not affect the underlying data).
List Filter Toggle Buttons – There are six buttons to quickly filter the list based on
command state. You can toggle each filter by simply clicking the buttons (this does not
affect the underlying data). The six filters are:
- Hide/show commands that have 'When I say' disabled. (S)
- Hide/show commands that have 'When I press keys' disabled. (K)
- Hide/show commands that have 'When I press button' disabled. (J)
- Hide/show commands that are prefixes. (P)
- Hide/show commands that are suffixes. (X)
- Hide/show commands that are full commands. (F)
Done button
No commands will be saved unless you hit the Done button. NOTE: New and edited
commands ARE NOT AVAILABLE to the speech recognition engine until you press
'Done'. There have been a lot of times when I have entered a new command on the
Profile screen and was puzzled by why it wasn't working when I would speak. It's
because I never clicked the, 'Done' button. Seriously... I am that dense :)
Cancel button
All changes to commands for this profile can be canceled by hitting the Cancel button.
Command Screen
A VoiceAttack command is basically a macro that performs a series of actions. A command
can be executed with a spoken word or phrase, with the press of a keyboard shortcut or the
press of joystick buttons. Simple commands can be run one at a time, while lengthy
commands can be configured to run in the background (asynchronously).
The Command Screen is where you will add and edit commands and their actions that
execute when VoiceAttack recognizes your spoken phrase or detects your keyboard shortcut /
joystick button press. For instance, you can add a command called, 'Help' and then actions
that press and release the 'F1' key in your application.
In the above example, this command can be executed in three different ways. The
first way is to speak the phrase, 'open map' into the microphone. The second is to
press Ctrl + M on the keyboard. The third way is by pressing button 2 on joystick 1.
VoiceAttack will react by sending the 'F3' key to your application, pausing briefly, and
then send the 'Enter' key (your keen eye may have noticed that this command will run
in the background (option 5). More about that below). There is a lot going on here,
but, we've numbered all the items, and, we'll go through them one at a time.
1 - Command Input
Checking the box labeled, 'When I say...' indicates to VoiceAttack that you want this
command to be executed by speaking a word or phrase. In the example, we want to
say the phrase, 'open map' into the microphone to get VoiceAttack to react.
Note that you *must* fill out the input box if this option is checked, and, what you put in
the input box must be unique for the selected profile (in this case, you can only have
one command with, 'open map' as the spoken phrase).
NOTE - VoiceAttack supports multiple phrases in the input box by separating the
phrases with a semicolon ; For example, if you have three commands that do the
same thing : Fire, Open Fire and Fire Weapons, instead of adding three separate
commands, you can add one command like this : Fire;Open Fire;Fire Weapons and
VoiceAttack will execute the commands all the same way.
Dynamic command sections
Dynamic sections allow you to specify a part of your command that may vary.
Sometimes you may want to say, 'Hello computer' and sometimes you may want to
say, 'Greetings computer' and execute the same command. To indicate that you want
to use a dynamic section, enclose the section in square brackets: [ ], with each
element separated by a semicolon. Your command may look something like this:
[Hello;Greetings]computer
In this case, you can say, 'Hello computer' and 'Greetings computer' and the command
will be executed.
Note that multipart commands are also still separated with a semicolon (as
demonstrated by adding, 'Hi' to the end):
[Greetings;Hello]computer;Hi
With this example, to execute the command, you can say:
Greetings computer
Hello computer
Hi
The dynamic sections don't have to just be at the beginning. They can be anywhere in
the command. Also, as a side-effect, if you put a semicolon on at the end of the
selections, it makes the section optional:
[Greetings;Hello]computer[how are you;]
You can say the following to execute the command:
Greetings computer how are you
Hello computer how are you
Greetings computer
Hello computer
Note that there is a semicolon after 'how are you' to indicate that the entire section is
optional.
Something to consider when using this feature is that you can create a lot of
permutations from very few words. Use with care :)
Dynamic command sections can also contain numeric ranges. This is kind of an
advanced feature that is not very useful on its own, but when used in conjunction with
other features (such as the {TXTNUM} token (see, 'Tokens' section) and Quick Input), it
can be used to consolidate large numbers of commands into just a few.
To indicate a numeric range in a dynamic section, just include the minimum and
maximum values separated by an ellipsis (..). For example, let’s say you have 100
racers in a race game. Instead of creating 100 separate commands to eject racers,
you can have a single command, 'eject car [1..100]'. With this example, you can say,
'eject car 1', 'eject car 2', 'eject car 99', etc.
An additional option for numeric ranges for dynamic command sections is a multiplier.
This will allow you to, ‘step’ the numbers in your range by a specified value. To
indicate a multiplier, just include the value with your range like this: [1..5,10]. Just like
above, that’s the minimum value and maximum value separated by an ellipsis, then a
comma, then the multiplier value. [1..5,10] will yield 10, 20, 30, 40, 50. [5..10,20] will
yield 100, 120, 140, 160, 180, 200.
Advanced: If you would like to retrieve the individual portions of a command that
contains dynamic command sections, see the, ‘{CMDSEGMENT:}’ token later in this
document.
Wildcards
There is a somewhat unsupported* feature in VoiceAttack's 'When I say' feature.
You can use, 'wildcards' around the phrases to indicate, 'contains', 'starts with' and
'ends with'.
So, let's say you have a spoken phrase 'attack'. Let's also say that you want to
execute your command if the word, 'attack' is included in any spoken phrase. To
indicate to VoiceAttack that you want the 'attack' command to execute any time it is
contained in a phrase, you simply put asterisks around the phrase, like so: *attack*.
If you want to indicate that you want the 'attack' command to execute if the spoken
phrase starts with the word, 'attack', just put an asterisk at the end, like so: attack*.
This way, you can say, 'attack the enemy' and VoiceAttack will execute the 'attack'
command. If you say, 'I would like to attack the enemy', the 'attack' command will
not be executed, since the word, 'attack' is not at the start of the phrase.
On a similar note, if you only want, 'attack' to be executed if the word, 'attack' is at the
end of the phrase, put the asterisk at the beginning, like so: *attack.
VoiceAttack will execute all of the commands in which the wildcards apply. So, if you
have '*rocket*' and '*ship*' and '*attack*' as commands, and you happen to say, 'I
would like to attack the ship with my rockets', VoiceAttack will attempt to execute
'attack', then, 'ship' and then 'rocket' in that order (the order in which they are spoken,
but due to the asynchronous nature of this type of situation, the order cannot be
guaranteed (use with caution).
Commands will not repeat with wildcards. If you have commands, '*rocket*' and,
'*ship*' and, '*rocket ship*' and you say, 'I want to take a ride in my rocket ship',
VoiceAttack will execute the command, 'rocket ship' and not 'rocket' and 'ship'. Also,
if you say, 'rocket rocket rocket rocket rocket rocket rocket rocket rocket', the 'rocket'
command will only be executed once.
* The reason it is 'somewhat unsupported' is basically because it is not a terribly
reliable feature and was added as an attempt to give a little bit more flexibility,
especially in the areas of immersion. Your mileage may vary. Good luck, captain!
Checking the box labeled, 'When I press keys' indicates to VoiceAttack that you want
to execute this command when pressing a keyboard shortcut. In this example, the
keyboard shortcut is Left Ctrl + M. You can assign the keyboard shortcut by clicking
on the '…' button to the right. You will be presented with the screen below:
This is the, 'Command Shortcut' screen. It allows you to choose the key / key combo
to assign to your macro.
The, 'Do not allow key to be passed through' option prevents the main key (nonmodifier) from being passed through to the application. For example, if your hotkey is
F1 and this option is selected, VoiceAttack will respond to the F1 key press and then
prevent any other application from receiving this key press (for this example, if F1 is
being handled by VoiceAttack, you will not be able to use the F1 key in other
applications while VoiceAttack is running. If you rely on F1 to bring up, 'Help', then,
you'll have to pick another key).
The, 'Shortcut is invoked only when all keys are released' option allows you to
indicate that the macro will only execute once all keys in the combo are up. This
allows you a greater level of flexibility and control (such as having a macro that
executes on key down and a separate macro that occurs only on key up). Also, this is
the way that VoiceAttack can keep hotkey shortcuts from stepping on each other when
some of the keys are involved in different commands. For instance, if there is a
command that is executed by pressing, ‘ALT + X', and another command that
executes by pressing, 'X', setting both shortcuts to work on key release will keep both
from executing at the same time.
The ‘Repeat command while keys are held down’ option will allow the invoked
command to repeat for as long as the selected keyboard keys are held down.
Checking the box labeled, 'When I press button' indicates to VoiceAttack that you
want to execute this command when pressing a joystick button, or a button
combination. Note: Setting up joystick support is presented in more detail in the
Options screen under the heading, 'Joystick Options'.) In this example, the selected
button is the second button on joystick 1. Note that you can use up to two buttons to
create a button combo (the buttons can even be on different sticks if you want). You
can assign the joystick button for this command by clicking on the '…' button to the
right. You will be presented with the screen below:
This is the 'Select Joystick Buttons' screen. If your joysticks (up to two joysticks are
supported) are plugged in and set up, you can press a button and it will be detected
here. To clear anything that you've done on this screen, click the, 'reset' button in the
top-right. The option, 'Shortcut is invoked only when all buttons are released' will
make the command only execute when all the buttons involved are let go. Note that
any superseded shortcuts will not be executed when using this option. That means if
you have a shortcut that works when the, 'A' button is released as well as a shortcut
that works when, 'A + B' are released, only the shortcut for 'A + B' will be executed.
The option, 'Shortcut is invoked when no other buttons are down' will prevent the
command from executing if the buttons indicated are not exclusively involved. For
example, if you have a command that is executed when button 'A' is pressed and this
option is selected, if any other button is down when, 'A' is pressed, the command will
not be executed.
The ‘Repeat command while buttons are held down’ option will allow the invoked
command to repeat for as long as the selected joystick buttons are held down.
Checking the box labeled, 'When I press mouse' indicates to VoiceAttack that you
want to execute this command when pressing a mouse button (or button combination)
or scrolling with the mouse scroll wheel. In this example, the, 'Back' button is selected.
Note that you can use any combination of the five standard mouse buttons, and any
single scroll wheel event. You can assign the mouse button for this command by
clicking on the '…' button to the right. You will be presented with the screen below:
This is the 'Mouse Shortcut' screen. To clear anything that you've done on this screen,
click the, 'clear' link. The option, 'Shortcut is invoked only when all buttons are
released' will make the command only execute when all the buttons involved are let
go. Note that any superseded shortcuts will not be executed when using this option.
That means if you have a shortcut that works when the, 'Back' button is released as
well as a shortcut that works when, 'Back + Forward' are released, only the shortcut for
'Back + Forward' will be executed. The, 'Do not allow button down to be passed
through' option prevents the button down event for the indicated buttons from being
passed through to the application. For example, if your selected button is, 'Back' and
this option is selected, VoiceAttack will respond to 'Back' button press and then
prevent any other application from receiving this button press (for this example, if
'Back' is being handled by VoiceAttack, you will not be able to use the, 'Back' button in
other applications while VoiceAttack is running. If you rely on, 'Back' to go back in your
browser, then, you will have to pick another button).
The ‘Repeat command while buttons are held down’ option will allow the invoked
command to repeat for as long as the selected mouse buttons are held down.
Note: This option is only available when the, ‘Do not allow button events to be passed
through’ option is NOT checked.
Note: ‘Shortcut is invoked only when all the buttons are released’ is not applicable to
the scroll wheel events as they do not have a, ‘down’ or ‘up’ state.
Note: Scroll wheel events are triggered for each, ‘click’, so, when scrolling forward or
back, the command will be triggered each time the mouse wheel, ‘clicks’ in either
direction. For left and right, holding the mouse down in either direction will cause the
command to repeat as long as the wheel is held.
2 - Command Macro
This is a list of all of the actions that will be performed, in order. In the example, we are
sending a series of keyboard key presses with a pause in between. The items in the
list can be key presses, mouse clicks, pauses, application launches, etc. You can
double-click on any item in the list to edit that item. Note that you can change the
order of the items in the list by moving them up and down.
3 - Actions
Add a Key Press action button
Click this button to add a keyboard key press to the command action sequence
(See 'Key Press Screen'). You will probably be using this the most often.
Add a Mouse action button
Click this button to add a mouse action (such as moving the mouse, clicking a
mouse button) to the command action sequence (See 'Mouse Action Screen').
Add a Pause action button
Click this button to add a timed pause to the command action sequence (See
'Pause Screen').
Add a miscellaneous, 'Other' action button
Click this button if you want to launch or close an application (among other things).
(See 'Other Stuff Screen'). Lots of fun items in here.
Recorder button
Click this button to bring up the 'Key Press Recorder' screen. This screen will
capture key presses as you perform them for insertion into your macro. This will
make input easier for a series of keys (instead of adding one at a time). (See,
'Record Keypress Screen').
4 - Command Organization
Description
This is where you can give a description of your command. Note: The description
column will not show up in the Commands list unless you actually have at least one
command with a description.
Category
This allows you to organize your commands in a simple fashion. You can type in a
new category in the box, or, you may drop down the list to select a category that
already exists in your profile. Note: The category column will not show up in the
Commands list unless you actually have at least one command with a category.
5 - 'Allow other commands to execute while this one is running' option.
When VoiceAttack recognizes a command, it is executed in one of two ways. One way
is synchronous (the option is unselected). That is, when the command is executing,
subsequent, recognized commands must wait until the command is finished
before they execute. This is useful when you want the command to do its work without
other commands interfering. When other commands try to execute, they can be
canceled, or they can wait and then execute. The setting, ‘Cancel blocked commands’
on the options page will allow you to choose what to do with the commands that are
blocked. If you choose to cancel blocked commands, the commands are simply
ignored. If you choose to let the commands wait, when the blocking command is
finished, all the waiting commands will then execute. Unfortunately, there is no
queuing system yet, so these commands will execute simultaneously so use with
caution. Note that calling a command that has this option set does not affect
commands that are already running.
The second way to execute a command is asynchronously (the option is selected).
That is, when the command is executing, VoiceAttack will continue to execute
subsequent, recognized commands. This is the default behavior of VoiceAttack. Note
that this option is applicable only to the root executed command. Commands executed
as sub-commands (see ‘Execute Another Command’ action) will follow the root
command’s setting. Please exercise caution when using this option, since key presses
can interfere with each other. Note that you can click the 'Stop Commands' button on
the Main Screen or add a command to stop all processing commands (see, 'Other
Stuff' screen). This is basically a panic button that indicates to all running macros that
they need to stop processing.
'Minimum Confidence Level' allows you to specify to VoiceAttack what the minimum
recognition confidence level must be in order to execute this command. This value
overrides the values set at global level as well as the profile level. See the, 'Options'
page for more information about the handy confidence feature.
'Send this command to' - Enabling this option will make this command target either the
active window or another window/process that you specify to receive input. This will
override the target indicated at the profile level (if specified) as well as the target
indicated on the main screen (global level).
To send input to the active window, choose, 'Active Window'. Choosing the active
window at this level is handy when the profile or global settings are directed to a
specific application. Whatever window that is currently active will receive input from
this command.
To send input to a specific window or process, choose the option next to the drop down
box. To see what windows are available, drop down the list. Choosing a window from
the list will indicate to the command that you want to send input to it. Note that this is a
free input text box and you can modify your selection (as detailed below).
The value in the drop down box can contain wildcards indicated by asterisks (*). This
is handy when the title of the window changes. To indicate that the window title
contains the value in the box, put an asterisk on each end. For instance, if you want
to target any window that contains, 'Notepad' in the title, put, '*Notepad*' (without
quotes) in the box. To indicate that the window title starts with the value in the box,
put an asterisk at the end: 'Notepad*'. To indicate that the window title ends with the
value in the box, put an asterisk at the beginning: '*Notepad'. The values are not casesensitive. The first window found to match the criteria indicated will be selected.
Advanced: Note that you can also use process names as they appear in the Windows
Task Manager. You can use wildcards the same as you do with the window titles.
Window titles are checked first, and then the process names.
More advanced: If a window cannot be found by title or process name, the window
class names will then be checked. Wildcards apply if you need them. Note that this
will be the class name of the window itself and not the class name of a child control.
Again, this is an advanced feature that you may never ever use.
Lots more information about process targets is available in this document in the section
titled, 'Application Focus (Process Target) Guide'.
'Stop command if target window focus is lost' - Enabling this option will make this command
stop if the focused window loses focus. The focused window is the window that has
the focus when the command is first executed. One handy use for this feature is if you
have a command that continually loops and interacts with a certain application. If you
click out of the window and lose focus, you probably do not want processing to
continue on the newly active window (especially if keys are being pressed). This
feature also has an option called, 'Resume command if focus regained'. What this
does is attempt to continue the command if you focus the original window.
6 - Action Management
Move action Up button
Click this button to move a selected action to an earlier part of the sequence. This
can also be achieved by holding down the control button and pressing the up arrow
key.
Move action Down button
Click this button to move a selected action to a later part of the sequence. This can
also be achieved by holding down the control button and pressing the down arrow
key.
Edit an action button
Click this button to modify the selected action (works the same as double-clicking
on the selected item).
Delete an action button
Click this button to remove the selected action from the sequence (works the same
as hitting the Delete key).
Undo
Click this button to undo the last change you made to the command lists.
Redo
Click this button to redo a change that has been undone.
7 - Command Type
VoiceAttack supports full commands (this is what you will probably be using almost
exclusively) as well as composite (prefix/suffix) commands. Prefixes and suffixes only
execute when they are used together in a composite voice command (which means
that they will not execute on their own). When they are executed together, the actions
from the prefix are executed first, followed by the actions in the suffix. This is handy if
you want to create a lot of similar commands, without copying and modifying over and
over again.
As an example, let’s use the actions found in a racing game. Let's say that the races
potentially have up to 100 drivers. If you wanted to create commands to eject any one
of the drivers from a race, you would need to create 100 commands ('eject driver 1',
'eject driver 2', 'eject driver 3', etc.). Next, if you wanted to mute any one of those
drivers you would need to create another 100 commands ('mute driver 1', 'mute driver
2', 'mute driver 3', etc.). For every action that involves drivers, you would need to
create another 100 commands. To solve this with prefixes and suffixes, you would first
create the suffixes for the 100 drivers (yeah... I know that's a lot). The suffix actions
would be something like this (for driver 82):
Press 8
Release 8
Press 2
Release 2
Press Enter
Release Enter
Once you have your suffixes lined up, you can then create as many prefixes as you
need to work with them. For, 'mute driver', you create a command and designate it as
a prefix. Its actions would look like this:
Press m
Release m
Press u
Release u
Press t
Release t
Press e
Release e
Press Space
Release Space
When you say, 'mute driver 82', all the actions from, 'mute driver' will be executed first,
followed by the actions in suffix '82'. You only have to create one prefix and it is
automatically paired with all of the available suffixes.
Prefix/Suffix Group Indicate a group name for your prefix or suffix to have the pairing of the prefix and
suffix to occur only within that group. For instance, you can have a group called, 'taunt'
where all of the suffixes contain something funny to say when you mute or eject a
driver:)
8 - Repeating
VoiceAttack can execute the actions of a command once, or as many times as you like.
To get VoiceAttack to repeat the command actions indefinitely, select the option
labeled, 'This command repeats continuously'. To repeat the actions a certain number
of times, choose, 'This command repeats X times' and fill in the number of times to
repeat in the box provided.
To get VoiceAttack to stop repeating, you have a couple of options. The most heavyhanded way is to issue a command to stop all processing (this can be invoked from the
main screen by clicking the, 'Stop Commands' button, by pressing the stop command
hotkey(s) (see Options page) or by issuing a voice command that stops command
processing (see Other Stuff screen). Another option is to issue a voice command that
calls the, 'Stop Another Command' action. This can be found on the, 'Other Stuff'
screen. Note: Looping is also available from within commands as of version 1.5.9.
OK button
Click the OK button to commit all changes to the command.
Cancel button
All changes to this command will be undone if you click the Cancel button.
Note: Actions in this list can be copied and pasted within the same command action list as
well as command action lists in other profiles. Most actions indicated above are also
available in the right-click menu of the command action list.
Key Press Screen
This screen allows you to define a single key press for a command action (See 'Command
Screen'). You are also allowed to specify a modifier with your key press. The modifiers that
are available are 'Shift', 'Control', 'Alt' and 'Windows'. If your key press needs to be held down
for a certain amount of time, you can indicate that time frame in seconds (up to a maximum of
99.999 seconds).
1 - Selected keys
This is where you indicate what keys to press. If you press, 'X', the right-most key icon
will display, 'X'. If you press a modifier key (ctrl, alt, shift or Windows), one of the leftmost key icons will display what you pressed. This will make up the key combination
that VoiceAttack will send to your application.
2 - Key chooser
Clicking the mini keyboard pops up the, 'Extended Key Chooser' screen. From this
screen, you can select any of the available keyboard keys (for example, if your
physical keyboard does not have media or browser keys, you can select them from
here).
3 - Press and release key(s) option
If you choose this option, VoiceAttack will press down and release a key. This option is
further enhanced by using the, 'Hold down for X seconds' box. Enter a value here (in
seconds) to indicate how long VoiceAttack is to hold down the key/key combination
before releasing. Note that a value of zero is not recommended for most games, as
games tend to rely on polling for key state (a value of zero might make the key press
occur too quickly for the game to react).
4 - Press key(s) option
Select this option if you only want VoiceAttack to press the selected keys down. This is
usually used in a macro, with a subsequent, 'Release key(s)' action.
- Release key(s) option
Select this option if you only want VoiceAttack to release the selected keys. This is
usually used in a macro, preceded by a, 'Press key(s)' action.
- Toggle key(s) option
Select this option if you want VoiceAttack to press a key if it is not pressed or release a
key if it is pressed.
5 - Mass update
When you are editing a key press, you have the option to update all of the matching
key presses in either the current command or the current profile to be the same as the
one you are currently editing.
So, if you have a bunch of commands that press the, 'X' key and you want to change
all of them to use the 'Y' key, simply choose one of your key press actions that presses
the, 'X' key only and edit it. Change the key to, 'Y'. Then, choose mass update and
then the 'all keypresses in this command' option. When you click, 'OK', all the actions
in the command that had a key press of, 'X' will now be, 'Y' (all key press actions that
did not have a key of, 'X' will be left alone).
Note that the keys and duration are the only attributes that are mass updated. The
press method (down/up/press) are not updated.
6 – Variable Keypress (Advanced)
Selecting this option will allow you to use a text variable to indicate the keys to press
for this action (instead of using the icons at the top of the screen). This is to aid
(primarily) in cases where keys for various commands may change periodically (such
as with key bindings for games). The idea is that keypress variables would be
initialized at profile startup or by plugin activation, thereby not requiring constant,
manual updating of commands each time the key bindings change in a game.
Usage is pretty straightforward. To turn on variable keypresses for this action, make
sure the box is checked and simply put the name of the text variable to use in the
provided input box. The previously-set text variable must contain properly-notated
text in order to work. The good news is that the notation is (almost) exactly the same
as what you will find in Quick Input. So, for instance, if your command is to raise your
landing gear and the keypress (for now) is ALT + L, set a text variable’s value to
‘[ALT]L’ (no quotes).
Note that the, ‘L’ does not have brackets. Keys with a single-character identifier (A-Z,
+, ß, ç, etc.) do not need brackets. Special keys, such as Enter, Shift, Alt, F12, etc. will
require brackets (see the section titled, ‘Quick Input and Variable Keypress Key
Indicators’ for all the possible key indicators). Note also that there is no space between
[ALT] and L. Spaces are actually picked up as key presses here, so if there is a space,
the space bar will be pressed.
Put the name of the variable in the input box, and when the action is executed, the
appropriate key method is performed (press, down, release, toggle) with the keys
indicated in the variable. Note that with multiple keys that the order that the keys go
down are the order that you provide. This happens virtually instantaneously, but order
is still important. So, in this case, ‘[ALT]L’, the Alt key is manipulated first, and then L.
When releasing keys, the order is reversed. In this case, the L key would be
released first and then the Alt key. This is so you can use the same variable to press
keys down and then release the keys in the proper order without having to create
another variable.
Important: Since we are pressing keys and not (necessarily) generating characters
(as with Quick Input), the keys that are pressed will be unmodified keys. So, for
instance, if you are using an English keyboard and you put in, ‘@’ as the keypress you
will notice that 2 key will be pressed. In order to reproduce the, ‘@’ as a keypress, you
will need to modify the keypress yourself by including Shift, like so: [SHIFT]2 or
[SHIFT]@ (either of these will work). This is the same as it has always been with using
keypresses, however it seems a little more pronounced now.
Important: As an interesting side effect, you can pretty much manipulate as many keys
as you want at once, including all of the modifier keys (LAlt, RAlt, LShift,RShift, etc.).
Remember, again, they will all occur in sequence in the order you provide (no pauses
between). Multiple instances of the same key repeated in a keypress may not have
the desired result. ‘[ENTER][ENTER][ENTER][ENTER][ENTER]’ probably will not press
the enter key five times, however, it will usually press it more than once due to timing
(your system may vary). Just don’t do that lol.
Note: The associated input box can also accept tokens (if, for some reason the
variable name needs to be variable… yikes lol).
In the above example, at position 1, we want VoiceAttack to press 'Control' plus 'Alt' and 'X'
keys all at the same time and release them after holding them down for 1 second. Note that
'Shift' and 'Win' are not selected.
When you click the 'OK' button, the indicated key press is added to your command action
sequence. If the 'Cancel' button is pressed, you are returned to the Add/Edit Command
screen, and no changes are recorded.
Pause Screen
This screen allows you to define a single, timed pause for a command action (See 'Command
Screen'). This is useful for waiting between key presses or waiting for a program to launch.
Simply add the amount of time you would like VoiceAttack to wait (up to 999.999 seconds)
and click the 'OK' button. To cancel adding or editing a pause, click the, 'Cancel' button and
no changes will be recorded.
In the example, above, we are adding a pause for 3 and a quarter seconds.
Note that in the, 'Edit a Pause' screen, you have the ability to mass update all the pauses in
the current command or in the current profile. Just select the, 'Mass Update' option and then
choose the scope of the change. This will only change pause actions where the value
matches the original pause value.
So, let's say we have a lot of pauses in our command that are 1 second long, but we want to
change them all to 2 seconds. Just edit one of the pause actions that have 1 second, change
the value to 2 seconds and then enable, 'mass update' and choose, 'all pauses in this
command'. When you click, 'OK', all pause actions in the command that were 1 second will
now be 2 seconds (pauses with different values other than 1 will not be altered).
Variable Pause Screen
The Variable Pause screen works just like the Pause screen except instead of providing an
exact pause time, you can specify a decimal variable to use. The decimal variable must be set
prior to using this feature (See, 'Set a Decimal Value'), otherwise the pause will not occur (since
it will be zero seconds). Variable pauses can be used to have control over profile-wide pauses
(change in one place, versus changing in many places). They can also be used with random
values to give a slightly more natural feel to TTS, for instance. Note: this feature is variablebased and not token-based for optimal speed reasons.
Other Stuff Screen
Clicking the, 'Other' button on the Add/Edit Command screen will display a fly out menu with
several submenus: VoiceAttack Action, Sounds, Windows, Dictation and Advanced. Clicking
on any of these submenus will display the various, 'special' actions you can add to your
commands. Note: for some of you VoiceAttack old-schoolers that want to use the dropdown
list as it USED to be, simply hold down CTRL while clicking the, 'Other' button. Note that
there is a little star up near the top. Clicking on this star will add this action type to your
favorites which can then be accessed from the, 'Other' button on the Command screen. If
you hold down CTRL while clicking the star, you can optionally clear all your favorites.
When you select a special action, you'll be presented with its corresponding add/edit screen.
You can get to the other special actions by dropping down the list provided near the top
(under the label, 'Select a special action...').
Some items in here may be useful to you. Other items you will probably never use. There's a
lot going on here, so, I'll try to do my best to explain each item. The special actions are
organized below in the same manner they are organized in the submenus:
VoiceAttack Action
'Make VoiceAttack Start Listening'
Select this item if you want VoiceAttack to start listening. This is useful either by itself
or in a macro. Note that there is a button the Main screen as well as a hotkey for this
same action (See 'Options Screen' and 'VoiceAttack's Main Screen').
Also, note that if a, 'Start Listening' action is found AS THE FIRST ACTION within
a command, the entire sequence will be executed as if VoiceAttack is already,
'listening'.
'Make VoiceAttack Stop Listening'
Same as above, except this stops VoiceAttack from listening.
'Make VoiceAttack Stop Processing All Commands'
Use this to stop all currently-processing commands. This works the same way as
clicking the 'Stop Commands' button on the Main Screen. Note that this command
action will only execute if your currently-executing command allows for other
commands to run at the same time (see, 'Command Screen' - 'This command allows
other commands to run at the same time' option).
'Ignore an Unrecognized Word or Phrase'
This is tricky to explain. This basically just discards the recognized command and
does not report it in the recognition log. I added this feature because sometimes the
speech recognition engine picks up background noise and breathing as commands.
You will see entries in the recognition log like: "Unrecognized Command: 'if if if'".
Chances are, you will see things like this, too. Just add the irritating phrase as a
command and select this option all by itself in the action sequence.
'Switch to Another Profile'
This will allow you to issue a command to switch over to another profile without having
to jump out of your application to do so.
'Execute Another Command'
Selecting this will allow you to add a previously-created command to your command
action list. Having nested commands keeps you from having to recreate entire action
lists for duplicated functionality. Also, if any referenced command changes, the
changes will be reflected in the nested commands.
There are two options for executing other commands. The first option allows you to
select an existing command from a list. This is the safest way to execute other
commands, since VoiceAttack knows ahead of time about any loops that may be
encountered.
The second option (designated as an, 'advanced' feature) lets you select a command
to execute by name (replacement tokens are supported). If a name of a command that
exits is given, a simple loop check is done to make sure you will not potentially freeze
up or crash VoiceAttack. If the referenced command does not exist (or if a
replacement token is used) VoiceAttack will be unable to make the loop check, leaving
you at risk for an infinite loop. Use this feature at your own peril:)
The, 'Wait until this command completes before continuing' option allows you to
indicate whether or not subsequent actions will execute while the called command is
running. If the box is checked, any commands that come after the executed command
will have to wait until all the actions in the called command are finished processing.
'Enable / Disable Hotkeys'
Selecting these will allow you to turn on and off the keyboard hotkey shortcuts.
'Enable / Disable Mouse Shortcuts'
Selecting these will allow you to turn on and off mouse button shortcuts.
'Enable / Disable Joysticks'
Selecting these will allow you to turn on and off joystick button detection.
'Stop Another Command'
This option will let you specify a certain command that needs to be stopped. You will
want to use this in conjunction with commands that loop or commands that have longrunning macros. In earlier versions of VoiceAttack, the only way to stop running
commands was to hit the, 'Stop Commands' button. Now you can indicate specific
commands. NOTE - all instances of a command will be stopped, so, if you have
multiple instances of a looping, asynchronous command, calling this will stop ALL
instances.
'Quick Input'
This action will allow you to indicate text that you want typed out in your application.
This differs from the recorder screen, as it allows you to include text tokens for
replacement (see the section on tokens further down in this document). Also, you only
specify one key press delay using this feature (the delay will be used for all key
presses). Simply type the text you want typed out in the, 'Text' box. You can then
specify how long to hold down your keys (a value of zero is not recommended for
DirectX games, as they tend to rely on polling for key state). In order to represent keys
such as, 'Enter', 'Tab', 'F1', etc., you can use some special indicators enclosed in
square brackets: [ ]. For instance, if you want to press the 'Enter' key, simply include
[ENTER] in your text. Some keys, such as 'Shift', 'Alt, 'Ctrl' and 'Windows' need to be
held down while you type other characters. There are some reserved indicators for
this as well. As an example, for the, 'Shift' key, [SHIFTDOWN] and [SHIFTUP] are
provided. If you need to specify a pause between keys, you can use the
[PAUSE:seconds] indicator, where seconds is the number of seconds to pause (Ex:
[PAUSE:0.5] will pause one half a second, and [PAUSE:2.5] will pause for two and a
half seconds).
Adding the following text to the Quick Input, 'Text' box:
Hello, out there![ENTER][ENTER]How are you?
Produces the following output:
Hello, out there!
How are you?
The full list of Quick Input key indicators is near the end of this document.
Note: Key indicators are not case-sensitive.
Sounds
'Say Something with Text-To-Speech'.
Type in a phrase to be spoken by your built-in Text to Speech engine.
Something fun you can do with this is input several phrases at once, separated by a
semicolon and VoiceAttack will randomly pick a phrase to, 'say'. For example, you can
input, 'Fire Weapons;Fire At Will;Destroy Them All' and VoiceAttack will see this as
three random phrases for the same command.
New: If you need further dynamic responses, you can include them by putting the
responses between square brackets (just like dynamic spoken command phrases
from the Command screen). Putting text between square brackets in text to speech is
called a, 'dynamic response section'.
Dynamic response sections allow you to specify a part of your text to speech (TTS)
that may vary. Sometimes you may want TTS to say, 'Hello captain' and sometimes
you may want it to say, 'Greetings, captain'. To indicate that you want to use a dynamic
response section, enclose the section in square brackets: [ ], with each element
separated by a semicolon. Your TTS phrase may look something like this:
[Hello;Greetings]captain
This will result in either, 'Hello captain' or, 'Greetings captain'.
Note that you can still add phrases separated with a semicolon:
[Greetings;Hello]captain;Hi
With this example, the result will be either 'Greetings captain', 'Hello captain' or 'Hi'.
The dynamic response sections don't have to just be at the beginning. They can be
anywhere in the phrase. Also, as a side-effect, if you put a semicolon on at the end of
the selections, it makes the section optional:
[Greetings;Hello]captain[how are you;]
This results in a response of:
Greetings captain how are you
Hello captain how are you
Greetings captain
Hello captain
Note that there is a semicolon after 'how are you' to indicate that the entire section is
optional.
Something to consider when using this feature is that you can create a lot of
permutations from very few words. Use with care :)
Dynamic response sections can also contain numeric ranges. To indicate a numeric
range in a dynamic response section, just include the minimum and maximum values
separated by an ellipsis (..). Not sure how many applications this may have, but it's
there for you (it's available for dynamic commands… just thought I'd leave it in).
A bad example would be [Greetings;Hello]captain. I tried to call you [2..10] times today
This will include responses that look like this:
Hello captain. I tried to call you 5 times today
Greetings captain. I tried to call you 10 times today.
Note that you can preview and set the volume and voice rate of your phrase from this
panel.
Speech Synthesis Markup Language (SSML) is supported if you want to do some
more fancy stuff. Visit Microsoft's site for more information on SSML:
http://bit.ly/1PisKMD.
Certain tokens can be used with the Text-To-Speech phrases. See the section way
down at the end titled, 'Text-To-Speech Tokens'.
There are two options available. Checking the, 'Wait until speech completes' option
will hold up the executing command until the speech is finished. Checking, 'This
completes all other text-to-speech' will stop any other speech that is currently running.
Note that it says, 'complete' rather than, 'stop' or, 'interrupt'. Any commands that are
currently waiting on speech to finish will immediately resume (as their pending speech
actions would then be, 'completed').
'Play a Sound'
This feature simply plays a sound file that you choose. The two modes that
VoiceAttack can be in are Standard (default) mode and, 'Legacy Audio' mode.
VoiceAttack uses Windows Media Player 10+ components to handle audio. If you do
not have these components installed (you probably do, but some choose to uninstall
this feature), VoiceAttack uses native components to provide at least some sort of
audio feedback (this is called, 'Legacy Audio', since that was what was included in
VoiceAttack up until v1.2.5). If you are having trouble with Windows Media
components, you can choose, 'Force Legacy Audio' in the options screen to help you
along. Legacy Audio mode is ok, but all you get is basic, single-instance audio. You
also lose volume control, the ability to play anything other than .wav files, plus you
will not be able to have VoiceAttack wait for the sound to complete (legacy audio is
always played asynchronously in the executing command).
The options for standard (default mode) include being able to select the volume of the
sound you are playing. You also have several additional options. The first is, 'Wait
until sound completes before continuing'. This will hold up the containing command
until the audio finishes. The next option is, 'This completes all other sounds'. This will
stop any other sound that is currently playing. Note that it says, 'complete' rather than,
'stop' or, 'interrupt'. Any commands that are currently waiting on sounds to finish will
immediately resume (as their pending sound actions would then be, 'completed'). The
third option is the, ‘Begin at position’ option. This will allow you to start the sound
playback at a certain number of seconds, expressed as a decimal value. Note that this
box can accept a decimal variable name as well as a token that resolves to a decimal
value. See also the, ‘{STATE_AUDIOCOUNT}’ and, ‘{STATE_AUDIOPOSITION}’
tokens later in this document. Note that, ‘Begin at position’ is not available when using
Legacy Audio Mode. If you choose to start your audio at a certain position, the, ‘Fade
in’ option will become available. Fading in may help make the audio sound better
when started in positions that are loud. Just a very minor enhancement… no big deal
;)
This feature works just like the 'Run an application' feature above. Click the file
browser ('…') button to select a sound file (legacy audio mode is restricted to .wav
files. Standard mode will allow .wav, .wma and .mp3 (also .ogg, .flac, .m4a and .aac if
you have the proper codecs installed for Windows Media player) files). Note that you
can preview your sound file by clicking the, 'Preview' button.
Note: As indicated above, if you are unable to hear your sound file, you can always
force VoiceAttack back into, 'Legacy Audio Mode' by going into Options and then
selecting the, 'Force Legacy Audio' check box.
'Play a Random Sound'
This action will allow you to make a selection of sounds that will play randomly. You
can choose to select individual files or entire directories of files.
To add individual sound files to the list, click on the radio button titled, 'Play a random
sound file from a list' then click the, 'Add New' button. You will then be presented with
the same interface as found in the, 'Play a Sound' action (see above). For every sound
file selected, you will be able to choose its volume and whether or not it holds up the
macro before until it completes or stops other sounds from playing. To edit a sound,
just click on the, 'Edit' button (or double-click the item in the list). To remove a sound,
click the, 'Remove' button. Note that you can select multiple files at once for adding,
editing or removing.
To play a random sound out of a directory of sounds, choose the option labeled, 'Play a
random sound from a directory. You will then be able to choose the desired directory,
plus set the options for all the files that will be played (note that the options apply to all
files in the directory. If your files need to have their own attributes, you will need to use
the first option above). All supported files (.wav, .mp3, .ogg, .flc, .m4a, .aac) will be
used out of the selected directory as well as shortcut files (.lnk) that are for sound files.
To minimize the chance of constantly repeating sounds, select the, 'Suppress Repeat'
option at the bottom.
Windows
'Run an Application'
Select this option if you want VoiceAttack to launch a program. There are a few extra
input boxes with this action:
Path of the program to be run
This is what program will be launched by VoiceAttack. You can click on the file
browser button (labeled, '...') to browse for a file.
Note: You can drag and drop files to this input box (edit: maybe... depends on the
security of your system).
Note: I won't go into much detail, but, you can also execute shell commands with
Windows Vista and later (type in a value like, 'shell:MyComputerFolder').
Check out the web for more details on shell commands (very handy).
File browser ('...') button
Use this button to select a file to launch. This doesn't have to be just executable (.exe)
files for games and apps. This can also be files that Windows have associated with
other applications (for example, launching, 'helloWorld.txt' would launch the Windows
Notepad.exe program and load the, 'helloWorld.txt' file. Kinda handy....
'With these parameters' box
If your launched program needs extra run-time parameters, you can specify them here.
The example shows us launching Notepad with 'c:\mytext.txt' as the parameter. When
this action is activated, VoiceAttack launches Notepad and displays the contents of,
'mytext.txt'.
'In this working directory' box
Specify the working directory for your launched application here.
'Window Style' selection
Indicate how your launched application will behave when it is launched. Note: that the
target application must support the attribute specified.
Advanced
This section is for advanced use of, 'Run an Application'.
'Do not wait for launched application' option - This option allows the command to
continue on without waiting for the launched app (this is the default option).
'Wait until launched application is started before continuing' option - This option
tells VoiceAttack to wait until the launched application is started and is ready to receive
input before continuing to the next action. You can specify how long to wait before
giving up by selecting the, 'Only wait up to X seconds' option and filling in the box (see
below). If the application does not launch, or, the time indicated is exceeded, you can
exit the command completely if you select the, 'Exit command if launch has failed
or wait time exceeded' option. This option also has its own option called, 'Set
command to target launched application'. This option will make the launched
application the process target for the remaining duration of the command and all
subsequent input operations will be directed to it (this overrides the currently selected
process target). See the guide titled, 'Application Focus (Process Target) Guide'
later in this document.
'Wait until the launched application exits before continuing' option - This option
will keep the command from continuing to the next action until the launched
application closes. There are two options that go along with this feature:
'Capture STDOUT to a text variable' and 'Capture Exit Code to an integer variable'.
'Capture STDOUT to a text variable' allows you to specify a text variable to hold the
STDOUT generated by the launched app. The text variable can then be used as you
wish (for instance, in a condition block or as a plugin parameter). This option is
enabled by simply indicating the variable. Leave this blank to leave this option turned
off.
'Capture Exit Code to an integer variable' works exactly like the STDOUT feature,
except you are capturing the app's exit code an integer variable. Again, leave this field
blank to leave this option turned off.
You can specify how long to wait before giving up by selecting the, 'Only wait up to X
seconds' option and filling in the box (see below). If the application fails to launch,
or, the time indicated is exceeded, you can exit the command completely if you
select the, 'Exit command if launch has failed or wait time exceeded' option.
'Only wait up to X seconds for launched application' option – This option is
available for both of the wait features listed above. Specify how many seconds to wait
for the application to either launch or exit. If the time is exceeded, the command will
continue on to the next step.
'Exit command if launch has failed or wait time exceeded' option – This option will
cause the command to exit if the application fails to launch or exceeds the time
indicated in the, 'Only wait up to X seconds…' option.
'Stop a Process by Name'
Select this if you want to terminate a running process. The drop down list shows all
running processes, as indicated by Windows. If you know the name of the process
that you might like to terminate, you can select it here. Note that you can type into this
box and that tokens can also be used. Use this functionality with great care.
'Set a text value to the Windows clipboard'
This action will allow you to put a text value in the Windows clipboard. The value can
also contain text tokens or condition tokens.
To clear the clipboard, leave the value in the box blank.
The value that is stored in the clipboard can be accessed with the, '{CLIP}' token (see
section on Tokens near the end of this document).
Note: Pasting from the clipboard will require a command that executes a CTRL + V
action (or whatever your system supports).
'Perform a Window Function'
This action will let you target a particular window/process (main window of a process)
and perform a particular action on it. To select a window, just drop down the box
labeled, 'Window Title'. Note that this is a free input box and you can modify your
selection (as detailed below). This box also respects tokens if needed.
The value in the drop-down box can contain wildcards indicated by asterisks (*). This
is handy when the title of the window changes. To indicate that the window title
contains the value in the box, put an asterisk on each end. For instance, if you want
to target any window that contains, 'Notepad' in the title, put, '*Notepad*' (without
quotes) in the box. To indicate that the window title starts with the value in the box,
put an asterisk at the end: 'Notepad*'. To indicate that the window title ends with the
value in the box, put an asterisk at the beginning: '*Notepad'. The values are not casesensitive. The first window found to match the criteria indicated will be selected.
Advanced: Note that you can also use process names as they appear in the Windows
Task Manager. You can use wildcards the same as you do with the window titles.
Window titles are checked first, and then the process names.
VoiceAttack will also allow the action to pause for a specified amount of time while
trying to acquire the window and make sure it is receiving messages. If the pause
expires, nothing will happen. If the window is found, processing will continue
immediately. To set the maximum amount of pause time, just check the box labeled,
'Pause up to' and set the number of seconds (or fractions of seconds) to the desired
value.
If the wait time is exceeded, or, if the window/process are not available, you can set the
option, 'Exit command immediately if window/process not available' to jump out of
the command instead of allowing the command to continue processing.
Once we have a handle on the window, there are several things that can be done to it:
'Display' - This will let you show/minimize/maximize/hide/etc. your targeted window.
Just drop down the list and choose one of the following (Note: Yeah, this seems a little
confusing. You will probably need to try out various methods to see which one works
for you. The list could have been pared down to just a few simple items
(show/minimize/maximize), but the underlying feature allows for more flexibility. In
order to provide this flexibility, all the functions have been exposed to the user, both in
name and description. So, basically, these will work differently based on situation, and,
quite frankly, I'm not entirely sure if they are all even necessary for most (just left in for
your use, if you can use 'em )) :
Normal - Activates and displays a window. If the window is minimized or maximized,
the system restores it to its original size and position.
Minimize - Minimizes the specified window and activates the next top-level window in
the Z order.
Maximize - Maximizes the specified window.
Show Minimized - Activates the window and displays it as a minimized window.
Show Maximized - Activates the window and displays it as a maximized window.
Show Minimized No Activate - Displays the window as a minimized window. This
value is similar to 'Show Minimized', except the window is not activated.
Force Minimized - Minimizes a window, even if the thread that owns the window is not
responding.
Normal No Activate - Displays a window in its most recent size and position. This
value is similar to 'Normal', except the window is not activated.
Show - Activates the window and displays it in its current size and position.
Show No Activate - Displays the window in its current size and position. This value is
similar to 'Show', except the window is not activated.
Restore - Activates and displays the window. If the window is minimized or maximized,
the system restores it to its original size and position. You should specify this flag
when restoring a minimized window.
Show Default - Sets the show state based on the state of the window when it was
created.
Hide - Hides the window and activates another window. Use with caution.
The 'Display' feature also has an additional option, 'Set command to target this
window'. This option will make the displayed window the process target for the rest of
the command. This will override what you have set as the process target at the
command, profile or global level. This is useful if you need to send input to a different
application while you are in the middle of a command. There's a lot of extra detail in
the section titled, 'Application Focus (Process Target) Guide' later in this document.
'Close Window' - Closes the targeted window (surprise!).
'Move Window' - This will allow you to move the targeted window to a specific X, Y
coordinate on your screen. Yup... you can move it right off the screen, so be careful.
'Resize Window' - This will allow you to resize the targeted window to whatever width
and height you like.
'Change Title' - This will all you to change the title text of the target window. If you find
yourself with multiple instances of the same application open, this can be handy when
it comes to targeting each instance. Note that this box respects replacement tokens.
'Change Default Audio Devices'
This action will let you change Windows’ default playback and/or default recording
device.
VoiceAttack uses Windows Media components and the Windows speech engine to do
its thing. Windows Media components will only work with the default playback device,
and the Windows speech engine can be set (and is set by default) to the default
recording device. Sometimes you may want to change these devices when you are
using VoiceAttack. For instance, you may want to switch over from a webcam mic /
speaker setup over to a headset. This feature may save you a step (or several) while
using VoiceAttack. To use this feature, simply select the devices you would like to use
by checking the appropriate boxes and selecting the devices you would to use from the
lists (the list only shows your currently-available devices). Now for lots of NOTES:
Note: If the Windows speech engine is set up to be something different than the default
recording device (set up through the control panel), changing the default audio device
will have no effect on the Windows speech engine, which means it will have no effect
on VoiceAttack.
Note: This feature is only available for Windows 7 and later.
Note: If the device’s underlying identifier is changed (driver update, Windows update,
crash, etc.) and this action is run, VoiceAttack will attempt to resolve the device by its
last-known device name. If you see a log message containing, ‘Resolved by device
name’, VoiceAttack has successfully made the change, but you may want to update
this action as it is not automatically saved.
Note: There are other ways to change these devices. One way is through VoiceAttack
startup in the Options screen. Another way is through command-line variables (see the
section on command-line variables later in this document). There are also
corresponding tokens ‘{STATE_DEFAULTPLAYBACK}’ and
{STATE_DEFAULTRECORDING}’ (see the token reference later in this document).
WARNING: This is not a VoiceAttack setting, rather a Windows device setting and can
(and probably will) cause other applications that depend on the changed devices to
appear to malfunction. It’s not THAT big of a deal, but it will definitely throw you off
when your Skype or TeamSpeak is not working how you left them.
'Windows Miscellaneous Functions'
Given proper version and user rights, VoiceAttack will attempt to execute any of the
following Windows functions (they’re all mostly self-explanatory and/or probably don’t
need explanation):
'Toggle Desktop' - Toggles the desktop view in case the boss is coming. You’ll need
to come up with a creative command name here so he/she will think you are actually
doing work.
'Lock Workstation' - Locks your PC so your roommate can’t mess with your settings.
Also, works to hide what you are doing from your boss ;)
'Log Off Current User' - Logs you out when you are done for the day.
'Sleep (Standby) PC' - Put your PC to sleep to save some power while you go and do
stuff.
'Force Sleep (Standby) PC' - This forces your PC into sleep mode. What this does is
it tells Windows to not alert any apps that it’s going into standby mode. Take that,
apps!
'Hibernate PC' - Hibernate your PC and save even more power.
'Force Hibernate PC' - Again, this tells Windows to dis all of the apps by not telling
them that it’s going into hibernation.
'Restart PC' - This will reboot your PC. This generally gives you a chance to save any
unsaved documents
'Force Restart PC' - This will not only reboot your PC, but it will NOT give you a
chance to save any unsaved documents. Use with care.
'Shutdown PC' - Shuts down your PC and will probably give you the chance to save
your unsaved documents.
'Force Shutdown PC' - Just like the restart option above, only the PC just stays off.
You will LOSE any unsaved work. Use with care.
'Power Off PC' - Works just like shutdown, except, where supported, will act like you
pulled the plug out of the wall. This may have adverse effects on your system.
'Force Power Off PC' - Forces the power off of your pc. Just like all the other, ‘force’
options, you WILL LOSE unsaved data.
'Minimize All' - Minimizes all open windows.
'Undo Minimize All' - An undo for the, ‘minimize all’ you just did.
'Open Run Dialog' - Opens the run dialog so you can look like you know what you are
doing… maybe even be productive.
'Open Search Dialog' - Opens the Windows search dialog so you can find those cat
videos easily.
'Open Window Switcher' - This will arrange all open windows in a tiled format for you
to choose from.
'Run Screen saver' - Simply runs your screen saver if you have one that is
active. “Why did you just shove this in here?” It was just one more option, might as
well include it, right? Easier than adding it later. Coming soon: Espresso Maker
‘Hide Task Bar’, ‘Show Task Bar’ - Hides and shows the Windows task bar.
'Set Audio Level'
This screen will allow you to add an action that will change a specified audio endpoint’s
volume. This is useful if you want to voice control or hotkey various volume controls.
The endpoints that can be changed are the system volume (the default playback
device), the microphone (default recording device) and the volume of various
applications as they relate to the System Volume Mixer and the overall system volume
(you can find the user interface of the System Volume Mixer in the system tray, or by
right-clicking on the VoiceAttack icon in the task bar and selecting, ‘System Volume
Mixer’). To change the overall audio volume of your computer, select, ‘System’. To
change the audio level of your microphone or default recording device, select,
‘Microphone (Default Recording Device)’. To change the audio level of an application,
select the application from the dropdown list. Note that this is a free input box and you
can modify your selection (as detailed below). This box also respects tokens if
needed.
The value in the drop-down box can contain wildcards indicated by asterisks (*). This
is handy when the title of the window changes. To indicate that the window title
contains the value in the box, put an asterisk on each end. For instance, if you want
to target any window that contains, 'VLC' in the title, put, '*VLC*' (without quotes) in the
box. To indicate that the window title starts with the value in the box, put an asterisk
at the end: 'VLC*'. To indicate that the window title ends with the value in the box, put
an asterisk at the beginning: '*VLC'. The values are not case-sensitive. The first
window found to match the criteria indicated will be selected. Advanced: Note that
you can also use process names as they appear in the Windows Task Manager.
You can use wildcards the same as you do with the window titles. Window titles are
checked first, and then the process names. More advanced: If a window cannot be
found by title or process name, the window class names will then be checked.
Wildcards apply if you need them. Note that this will be the class name of the window
itself and not the class name of a child control. Again, this is an advanced feature that
you may never ever use.
Once you select the type of audio that you want to control, you can then set the audio’s
level using several methods. You can mute and unmute the audio by selecting
either, ‘Mute’ or ‘Unmute’, or you and toggle the mute on and by selecting, ‘Toggle
Mute’. You can also set the level of the audio to a specific value by selecting, ‘Level’
and inputting a value. This value must resolve to a whole number from 0 to 100. So, if
you want to set your volume to 50%, simply enter, ‘50’ (without quotes) into the box.
Advanced: Note that this box will also accept an integer variable name or a token that
resolves into either a number or even an integer variable name.
To increase/decrease the current volume by a certain amount, select the, ‘Offset’
option and input the value by which you would like to increase or decrease the volume.
For example, if you want to increase the volume by 10, input 10 in the input box. If you
want to decrease the volume by 10, enter -10 in the input box. Advanced: Note that
this box will also accept an integer variable name or a token that resolves into either a
number or even an integer variable name.
Note: The application volume is not the actual volume that is controlled by the selected
application. For instance, there is a volume slider bar on Windows Media Player that
controls the volume. VoiceAttack does NOT control that slider. VoiceAttack will control
the volume for WMP as it is reflected in the System Volume Mixer. That means that if
you set WMP’s audio level value to 50, the slider in the System Volume Mixer will
adjust the volume for WMP to 50% of whatever the system volume is currently set.
Dictation (Speech to Text)
In order to be as flexible as possible, 'dictation' in VoiceAttack requires multiple parts.
Since VoiceAttack is already, 'listening' for your commands, you will need to be able to turn
dictation on and off. There are two new actions to do this for you: Start Dictation Mode, and
Stop Dictation Mode.
To turn on dictation mode, just add the action to one of your commands. You can initialize
variables, play a sound, clear the dictation buffer (more on that later) or whatever you want
before or after the Start Dictation action. For example, you can have a command called,
'Open Quote'. In that command, you can play a sound to notify you that dictation is on and,
'listening', followed by the, 'Start Dictation' action.
To turn off dictation mode, just add the Stop Dictation Mode action to a command you specify.
Again, you can paste the dictation buffer, play a sound, clear variables or whatever in the
same command.
Note: When dictation mode is on, you can still issue normal VoiceAttack commands. The
commands will be processed and not included in the dictation buffer. That way, you can still,
'fire all weapons' when you're in the middle of messaging your wingmen ;)
The main part of the dictation feature is what is referred to as the speech buffer (or, 'the
buffer', for short).
The speech buffer holds all the words that you are speaking. Every time you speak and then
pause, the speech is converted to text and is added to the buffer. The buffer will continue to
grow until you clear it. To clear the speech buffer, the, 'Clear Dictation Buffer' action is
provided. Simply add the action to your specified command at the place where you want to
clear the buffer. As an option in this action, you can limit what is cleared to the last statement
in the buffer. Also, in the Start and Stop Dictation actions, you can optionally clear what is in
the buffer.
The value in the dictation buffer is accessed in VoiceAttack in places that accept tokens (see,
'Tokens' in the VoiceAttack documentation for more info on how to use them... seriously...
check it out because you can do a lot with tokens).
The tokens for the dictation buffer is {DICTATION} and {DICTATION:options}. For example,
you can pop that token into the Text to Speech output box, into the Quick Input value box or
into the Set Windows Clipboard value box.
VoiceAttack will convert the {DICTATION} token into what is contained in the buffer at the
point that it is used.
Some things you might want to do with what is in the speech buffer:
-output to some application (messaging teammates)
-output to text to speech (feedback for you)
-output to a plugin, the VoiceAttack log, the Windows clipboard, etc.
There are two ways to get what is in the speech buffer out of VoiceAttack and into another
application. One way is to output the text one character at a time using VoiceAttack's Quick
Input feature. This is a fairly reliable way to get your text out, however, it is one character at a
time. That means that there will be a delay getting the text out. Since there is a delay, there
are opportunities to accidentally hit other keys while the text is being output to your
application.
The preferred way to get the buffered text out is by using the Windows clipboard. This way,
all the text is output in one shot, reducing the chance for error. To add what is in the buffer to
the Windows clipboard, simply add a, 'Set a Text Value to the Windows Clipboard' action to
your command. In the, 'Value' box, just add the, '{DICTATION}' or '{DICTATION:options}'
token (again, see, 'Tokens' in the VoiceAttack documentation for more info on how to use
them). To paste from the Windows clipboard, simply issue your preferred method of pasting
(CTRL + V or SHIFT + INSERT with appropriate delays).
Note: If you do not have access to the Windows clipboard (within games), outputting your text
one character at a time may be your only option.
It also needs to be noted that dictation is only as reliable as your speech engine's training
and/or your hardware and/or your configuration and drivers. It's not going to be nearly as
accurate as your spoken commands. For some, dictation may be near flawless while others
may find it hit or miss or even frustrating. Apologies in advance, however, this is a first goround with dictation and is provided as-is (sorry!). Over time, I'm hoping that this will get even
better.
'Start Dictation Mode'
This action will turn on VoiceAttack's, 'dictation' mode. Any recognized speech while
this mode is active will be added to the dictation buffer. Recognized commands that
are spoken on their own will still be processed first and not added to the dictation buffer
(just in case you are dictating a message to your team and then you get attacked...
lol). Note that dictation can be stopped and started and the dictation buffer will be
maintained until you clear it.
The value in the dictation buffer can be accessed by using the {DICTATION} and
{DICTATION:options} tokens. See more about this token in the Token section near
the end of this document.
The, 'Clear dictation buffer before starting dictation mode' does just that. It clears the
entire buffer once you start this action (for convenience... saves a step if you really
need it).
'Stop Dictation Mode'
This action will turn off VoiceAttack’s, 'dictation' mode. Note that the dictation buffer is
still maintained while you start and stop dictation mode. That is, unless you select the,
'Clear dictation buffer after stopping dictation mode' option. Using this option will clear
the dictation buffer immediately after stopping dictation mode. Again, more of a
convenience feature to save steps.
'Clear Dictation Buffer'
This action will clear the dictation buffer. The option, 'clear only the last statement' is
handy if you botch the last thing you said (which will happen a lot, given the current
state of the speech engine).
Advanced
The next few command actions are considered, 'advanced' and are for use within VoiceAttack
to allow users to make things a bit more flexible. There is a good chance that you will never
use these features, or use them very little (since they are a little bit outside of what you
probably need to make VoiceAttack work for you). Have fun!
'Set a Small Integer (Condition) Value'
NOTE: Due to the expansion of VoiceAttack's available variable types, what used to
be called a, 'Condition' has been renamed, 'Small Integer'. The Small Integer type is
going to be left in for backward-compatibility, however, you may find the Integer type a
little bit more useful. Make sure to check out the Integer, Boolean and Decimal
variable types (and the accompanying new features) outlined below.
This command action will allow you to set the value of a small integer variable. These
variables are used in conjunction with Conditional blocks ('If' statements) to control the
flow of your command actions (more on conditional blocks below).
The Small Integer name can be whatever name you want. This value will be stored at
the application level (shared among all profiles), so care must be made in order to
make your name is unique enough so you don't overwrite your values accidentally. The
variable names are not case-sensitive and they must not contain semicolons or
colons (variable names can only contain colons if contained within a token… this would
be a good place to indicate that this input box also processes tokens).
The value that you set to your small integer variable can be explicit (you set an exact
value), random (from a low value to a high value), incremental, decremental, to another
small integer variable's value that you have defined, or to the value of text/tokens. The
value can be no more than 32,767 and no less than -32,767.
If you want your small integer variable to be saved with the active profile, select the,
'Save value to profile' option. This will allow you to access the value between
application sessions (VoiceAttack application is closed and then run again).
To retrieve the small integer variable saved with the profile, select the, 'Retrieve saved
value' option.
Note: To clear all previously-saved small integer variables, see the, 'Clear Saved
Values from Profile' action.
Note: You can define as many values as you want, however, the values that you
define are not persisted. That is, they are not saved to disk. These values will be reset
every time you restart VoiceAttack. If you want your values saved to disk for use
between application sessions, select the 'Save value to profile' option.
Advanced: Variables can be scoped at the command-level, at the profile-level and
globally. Most will use the globally-scoped variables (for good reason), however, for
those that need a finer level of control, make sure to check out the, ‘Advanced Variable
Control (Scope)’ section later in this document.
'Begin a Conditional (If Statement) Block'
This command action is what you will use to begin a conditional block. Think of a
conditional block as a simple, 'IF' statement. This block MUST be used with a
corresponding End Conditional Block action (below).
Basically, the command actions that occur between the Begin and End Conditional
Blocks will ONLY be executed if the comparison you define meets the criteria that you
indicate in the Begin Conditional Block.
You will need to first indicate what type of comparison you are going to make. If you
are going to compare small integers, select the, 'Small Integer Tab'. If you are going to
compare the text in a text variable, select the, 'Text' tab (and so on for the other data
types).
Small Integer (Condition) Value Comparison
If you are wanting to compare small integer (formerly called, 'conditions') values and
chose this tab, the next step is to indicate what variable you are going to check by
typing its name in the Variable Name field (you would have set this value in the, 'Set a
Small Integer (Condition) Value' action... see above).
Next, you will need to establish how the variable is going to be compared, by
dropping down the, 'operator' box. You can choose Equals, Does Not Equal, Greater
Than, Less Than, Is Set and Is Not Set (a variable is, 'Set' if a value has actually been
assigned to the variable. In programming-speak, the value would be considered null or
not null).
The last thing you will need to do is to indicate the value that you are going to compare
the variable to. This can be an explicit value (by selecting, 'A Value' and filling in the
box), or the value of another small integer variable that you had set up (by selecting,
'Another Variable' and typing the name of that variable in the box provided).
Optionally, you can select the, “Evaluate, ‘Not Set’ as zero” feature that will
automatically evaluate the included variables (variables indicated in both, ‘Variable
Name’ as well as, ‘Another Variable’) as zero when comparing. If you want to compare
variables as null (‘Not Set’) when they are null (‘Not Set’), make sure to uncheck this
option.
If the comparison is made and the condition is met, the command action immediately
following the Begin a Conditional Block action will be executed. If the condition is NOT
met, the command action immediately following a corresponding Else or the
corresponding End Conditional Block will be executed (this is why the End Conditional
Block is required).
Note: If a variable that is being compared is NOT SET, the comparison will always
result as false. So, if 'My Condition 1' is not set, and you try to compare it to 0 by
setting the operator as, 'not equal to', the result will be false and the code will continue
after the end block (see information above regarding evaluating, ‘Not Set’ as empty
(blank)).
Text Value Comparison
If you are wanting to compare a text variable and chose this tab, the next step is to
indicate what text variable you are going to check by typing its name in the,
'Variable Name / Token' field (you would have set this value in the, 'Set a Text Value'
action… see way below). Note that this box can accept tokens as well. This way, you
can compare either variable values or the value of a rendered text token.
Next, you will need to establish how the variable is going to be compared, by
dropping down the, 'operator' box. You can choose Equals, Does Not Equal, Starts
With, Does Not Start With, Ends With, Does Not End With, Contains, Does Not
Contain, Is Set and Is Not Set (a text variable is, 'Set' if a value has actually been
assigned to the variable. If you are a programmer, you would refer to this as the
variable being null or not null).
The last thing you will need to do is to indicate the value that you are going to compare
the text variable to. This can be an explicit value (by selecting, 'Text' and filling in
the box), or the value of another text variable that you had set up (by selecting,
'Another Variable' and typing the name of that variable in the box provided).
Optionally, you can select the, “Evaluate, ‘Not Set’ as empty (blank)” feature that will
automatically evaluate the included variables/tokens (variables indicated in both,
‘Variable Name/Token’ and ‘Another Variable’, as well as the converted value of what is
placed in the Token field) as empty (blank) when comparing. If you want to compare
variables as null (‘Not Set’) when they are null (‘Not Set’), make sure to uncheck this
option.
If the comparison succeeds, the command action immediately following the Begin a
Conditional Block action will be executed. If the comparison fails, the command action
immediately following a corresponding Else or the corresponding End Conditional
Block will be executed (this is why the End Conditional Block is required).
Note: If a text value variable that is being compared is NOT SET, the comparison will
always result as false (see information above regarding evaluating, ‘Not Set’ as empty
(blank)).
Note: The 'Text' option also accepts tokens.
True/False (Boolean) Comparison
If you are wanting to compare a true/false (Boolean) variable and chose this tab, the
next step is to indicate what Boolean variable you are going to check by typing its
name in the, 'Variable Name' field (you would have set this value in the, 'Set a
True/False (Boolean) Value' action… see way below).
Next, you will need to establish how the variable is going to be compared, by
dropping down the, 'operator' box. You can choose Equals, Does Not Equal, Is Set
and Is Not Set (a Boolean variable is, 'Set' if a value has actually been assigned to the
variable. If you are a programmer, you would refer to this as the variable being null or
not null).
The last thing you will need to do is to indicate the value that you are going to compare
the Boolean variable to. This can be an explicit value (by selecting, True or False from
the 'Value' field), or the value of another Boolean variable that you had set up (by
selecting, 'Another Variable' and typing the name of that variable in the box provided).
Optionally, you can select the, “Evaluate, ‘Not Set’ as false” feature that will
automatically evaluate the included variables (variables indicated in both, ‘Variable
Name’ as well as, ‘Another Variable’) as false when comparing. If you want to compare
variables as null (‘Not Set’) when they are null (‘Not Set’), make sure to uncheck this
option.
If the comparison succeeds, the command action immediately following the Begin a
Conditional Block action will be executed. If the comparison fails, the command action
immediately following a corresponding Else or the corresponding End Conditional
Block will be executed (this is why the End Conditional Block is required).
Note: If a True/False (Boolean) variable that is being compared is NOT SET, the
comparison will always result as false (see information above regarding evaluating,
‘Not Set’ as empty (blank)).
Integer, Decimal and Date/Time Value Comparison
If you would like to compare the values of integers, decimal and date/time variables,
simply select the appropriate tab. The functionality of these three options are basically
the same as the Small Integer comparisons indicated above (so, we'll save a tree and
not duplicate even more stuff... lol.).
'Add Else If to a Conditional Block'
This action will allow you to add an, 'Else If' to your condition block. That is, if the
result of the beginning, 'If' statement is false (condition not met), you can use an Else If
block to do another comparison. You can have as many, 'Else If' blocks as you wish
between the Begin and End Conditional block actions. The options for the, 'Else If' are
the same as what you find in the 'Begin a conditional (if statement) block'. If all the
'Else If' blocks do not have their conditions met, the command will then go to an
existing, 'Else' action or to the End (if there are no, 'Else' actions for the containing
conditional block).
'Add Else to a Conditional Block'
You can add an 'Else' action to direct the flow of your condition block. If the result of
the conditional block is true, all actions in the conditional block ABOVE the, 'Else' will
be executed. When the actions between the start of the conditional block and the,
'Else' are finished, the command will jump down to (and execute) the, 'End Conditional
Block' action.
When a conditional block does not meet the requirements (result is false), all actions
between the, 'Else' action, up to and including the 'End Conditional Block' action will be
executed.
'End a Conditional Block'
This command action is what you will use to end a condition block. This MUST be
used in conjunction with a Begin Condition Block action (see above).
When a Condition Start Block action is executed, a value is checked to see if a
condition is met. If the condition is met, all the actions between the Condition Start
Block and the End Condition block are executed. If the condition is not met, the code
following the End Condition Block is executed (everything between the Condition Start
and Condition End blocks is skipped).
If you select either of the options indicated in the End Condition block, you can have
one more check before processing resumes after the block. You have the option of
completely exiting the command if the condition is or is not met. One thing this is useful
for is to bypass a long list of condition checks.
A sample conditional block with Else If and Else actions is below:
Set 'myTextVariable' to 'howdy'
Begin Text Compare 'myTextVariable' equals, 'hello'
Say, 'You said hello'
Else If 'myTextVariable' equals, 'greetings'
Say, 'You said greetings'
Else If 'myTextVariable' contains, 'howdy'
Begin Text Compare 'myTextVariable' contains 'partner'
Say, 'You said howdy and I'm not your partner'
Else
Say, 'You said howdy'
End Condition
Else
Say, 'You didn't say anything I recognize'
End Condition
In this example, TTS would say, 'You said howdy'. If, 'myTextVariable' was set to 'hola',
TTS would say, 'You didn't say anything I recognize'. Note that the conditional blocks
can contain other conditional blocks (nested).
'Add a Loop Start'
This action indicates the beginning of a looping block that will continue looping as long
as the indicated condition is met. The options for the loop condition are identical to the
ones found in 'Begin a Conditional (If Statement) Block' (see above), so, they will not
be repeated here (there's a lot of options (lol)). All actions between the Loop Start and
Loop End will be repeated. Once the condition is not met, the command flow will go to
the command action immediately following the Loop End. Note that loops can contain
other loops (nested loops).
'Add a Loop End'
Use in conjunction with a, 'Loop Start' action to indicate the end of the block that
requires looping. Command flow will go to the command action immediately following
this action when the loop condition is not met.
'Add a Jump Marker'
This command action lets you place a marker within your command that will indicate a
location that can be, 'jumped' to (using a 'Jump' command action).
Jump markers can be named whatever you want, but must be uniquely named within
the command (if markers happen to be named the same in a prefix/suffix situation, the
first marker will be the target of the jump). See, 'Add a Jump' (below) for more info.
'Add a Jump'
This action will instruct your running command to jump to another place within in your
command’s actions. You'll notice that you can jump to three different places: To a
marker, to the exit of the command and to the start of the command. If you choose to
jump to a marker, you can choose an existing marker from the dropdown list, or just
type in a name (in case you haven't created the marker yet, or, if the marker exists in a
corresponding prefix or suffix command and is not available). Note that this input box
also supports the use of tokens (see token reference near the end of this document).
If you choose to jump to the exit, the command will do just that... exit. Note that any
sub-commands that are currently executing will continue to execute (this is not a kill
switch for the command).
If you choose to jump to the start of the command, the command will continue
processing from the start of the command.
Note that all jump types will work in prefix/suffix commands when they are executed
together as a composite command.
'Exit Command'
This action allows you to simply exit the command. This will not stop any executing
sub-commands, as this is just a simple exit (not a kill command). Note: This is just a
more obvious implementation of what was previously only available as an option in a
Jump (see above).
'Set a Text Value'
This command action will allow you to set a text value to a named variable. These
values can be accessed by special tokens in various places within VoiceAttack (such
as Text-To-Speech, Launch Application paths/parameters/working directories, etc).
The Text Value Name can be whatever name you want. This value will be stored at the
application level (shared among all profiles), so care must be made in order to make
your name is unique enough so you don't overwrite your values accidentally. The text
value names are not case-sensitive and they must not contain semicolons or colons.
You can choose to set your text value explicitly, by typing in a value and selecting the,
'Text' option. This value can also contain other tokens that are replaced out when the
command runs (see the section regarding tokens near the end of this manual).
You can also choose to set your text value to another text value variable. To do this,
just select ‘A variable' option and type the name of the target text value variable in the
box provided. Note that the variable can be the same as the one you are setting (for
use if you just want to use the text options without assigning to another variable first).
To save the text variable value with the current profile, check the, 'Save value to profile'
box. The value will be available even if the VoiceAttack application is closed and
opened again. This is a simple way to save your text value variable to disk.
To retrieve the saved value, select the, 'Retrieve saved value' option.
To set the text value variable to an unset state, select the, 'Clear value' option.
If you want to get the value for your text value variable from a file or URL, select the,
'Value from file/URI' option. To browse for a file, click the button with the ellipsis ('…').
To get the value from a URL, just type the address. For example, you can try,
'http://www.voiceattack.com/test.htm' (without the quotes). VoiceAttack will attempt to
get the text from the response.
To access the values stored as text values, you will use the {TXT:valueName} token
(see the section about tokens near the end of this manual).
There are a few additional options available to you when you set a text variable. The
options are Trim Spaces, Upper Case, Lower Case and Replace. These are applied
after the variable is set. Trim Spaces will remove any spaces/whitespace from either
end of the text value. If your text value is, ' Hello, how are you? ', using the Trim
Spaces option will update the value to be, 'Hello, how are you?'. The Upper Case and
Lower Case options will convert the text values to either all upper or all lower case
characters. Using the Replace option will allow you to replace a portion of the text
value with another value. For instance, you can replace, 'Hello' with 'Greetings' by
putting 'Hello' in the first box and 'Greetings' in the second box. Any instance of the
word, 'Hello' in the text value will be replaced with, 'Greetings'. Note that, 'Replace' is
case-sensitive, and both of the 'Replace' input boxes can accept tokens.
Note: You can define as many values as you want, however, the values that you
define are not persisted. That is, they are not saved to disk (unless you check the,
'save values to profile' option). These values will be reset every time you restart
VoiceAttack.
Advanced: Variables can be scoped at the command-level, at the profile-level and
globally. Most will use the globally-scoped variables (for good reason), however, for
those that need a finer level of control, make sure to check out the, ‘Advanced Variable
Control (Scope)’ section later in this document.
'Set an Integer Value'
This command action will allow you to set the value of an integer variable. These
variables can be used in conjunction with Conditional blocks ('If' statements) to control
the flow of your command actions, provide feedback through things like text-to-speech
as well as do other stuff like provide information to plugins.
The Integer Variable Name can be whatever name you want. This value will be stored
at the application level (shared among all profiles), so care must be made in order to
make your name is unique enough so you don't overwrite your values accidentally. The
variable names are not case-sensitive and they must not contain semicolons or
colons (variable names can only contain colons if contained within a token… this would
be a good place to indicate that this input box also processes tokens).
The purpose of this screen is to set the value of the variable, and you do that by
selecting one of several different ways. The first way is to set an exact value (such as
500). Just select the option labeled, 'A value' and type the value in the box.
Another way to set an integer value is to give it a random value. Just select, 'A random
value' and provide a minimum and maximum value and the variable will have a random
number chosen within that range.
You can set your variable to the same value as another variable. Select, 'Another
variable' and type the name of the variable with the value that you want copied in the
box provided.
To clear the value of your variable (make the value be, 'Not Set' (programmers will call
this, 'null'), select the, 'Clear value' option.
If you have a value in text or in a token, you can attempt to convert the value to an
integer by selecting, 'Convert Text/Token' and type the text and/or tokens into the box
provided. If the value cannot be converted, the variable value will be, 'Not Set'. This
is kind of advanced, and you may never even use this option.
If you want your integer variable to be saved with the active profile, select the, 'Save
value to profile' option (check box at the bottom). This will allow you to access the
value between application sessions (VoiceAttack application is closed and then
launched again).
To retrieve the integer variable saved with the profile, select the, 'Retrieve saved value'
option. If the value was previously saved (as indicated above), the value will be set. If
no value is available, the variable value will be, 'Not Set'.
Note: To clear all previously-saved integer variables, see the, 'Clear Saved
Values from Profile' action.
If you want your integer variable's value to be computed for you, there are some simple
math functions available to you. First, select the, 'Computed value' option. Next,
select the appropriate function. You can add, subtract, multiply and divide (with integer
division… 7 divided by 3 is 2, for example), or get the remainder (Modulus)… 7 Mod 3
is 1, for example). The next thing you will want to do is indicate what you would like to
compute against… that can be an explicit value (such as 2) or another variable or
even a converted token. To select an explicit value, select, 'Compute against a value'
and provide a value. To select another variable, choose, 'compute against a variable
or token' and provide the variable name. To compute against a token, select this same
option and indicate the token in the box provided. If the token cannot be converted,
the value of computation will be, 'Not Set'.
As a convenience feature, there is a check box labeled, 'Evaluate Not Set as zero'.
This will allow you to initialize your variables as zero if they are not set when computing
values. This is merely to save an initialization step (yes, another advanced bit you may
never use).
Note: You can define as many values as you want, however, the values that you
define are not persisted. That is, they are not saved to disk. These values will be reset
every time you restart VoiceAttack. If you want your values saved to disk for use
between application sessions, select the 'Save value to profile' option.
Advanced: Variables can be scoped at the command-level, at the profile-level and
globally. Most will use the globally-scoped variables (for good reason), however, for
those that need a finer level of control, make sure to check out the, ‘Advanced Variable
Control (Scope)’ section later in this document.
'Set a True/False (Boolean) Value'
This command action will allow you to set the value of True/False (Boolean) variable.
These variables can be used in conjunction with Conditional blocks ('If' statements) to
control the flow of your command actions, provide feedback through things like text-tospeech as well as do other stuff like provide information to plugins.
The Variable Name can be whatever name you want. This value will be stored at the
application level (shared among all profiles), so care must be made in order to make
your name is unique enough so you don't overwrite your values accidentally. The
variable names are not case-sensitive and they must not contain semicolons or
colons (variable names can only contain colons if contained within a token… this would
be a good place to indicate that this input box also processes tokens).
The purpose of this screen is to set the value of the variable, and you do that by
selecting one of several different ways. The first way is to set an explicit value (such
as either True or False). Just select the option labeled, 'True' or the option labeled,
'False' to set your variable accordingly.
Another way to set a Boolean variable is to toggle its value. So, if a variable's value is
True, it will be set to False. If it is False, it will be set to True.
Note: A Boolean variable that is, 'Not Set' (programmers call this, 'null') will not toggle.
The value will remain, 'Not Set'.
You can set your variable to the same value as another variable. Select, 'Another
Boolean variable value' and type the name of the variable with the value that you want
copied in the box provided.
To clear the value of your variable (make the value be, 'Not Set' (programmers will call
this, 'null'), select the, 'Clear value' option.
If you want your Boolean variable to be saved with the active profile, select the, 'Save
value to profile' option (check box at the bottom). This will allow you to access the
value between application sessions (VoiceAttack application is closed and then
launched again).
To retrieve the Boolean variable saved with the profile, select the, 'Retrieve saved
value' option. If the value was previously saved (as indicated above), the value will be
set. If no value is available, the variable value will be, 'Not Set'.
Note: To clear all previously-saved Boolean variables, see the, 'Clear Saved
Values from Profile' action.
Note: You can define as many values as you want, however, the values that you
define are not persisted. That is, they are not saved to disk. These values will be reset
every time you restart VoiceAttack. If you want your values saved to disk for use
between application sessions, select the 'Save value to profile' option.
Advanced: Variables can be scoped at the command-level, at the profile-level and
globally. Most will use the globally-scoped variables (for good reason), however, for
those that need a finer level of control, make sure to check out the, ‘Advanced Variable
Control (Scope)’ section later in this document.
'Set a Decimal Value'
This command action will allow you to set the value of a decimal variable. These
variables can be used in conjunction with Conditional blocks ('If' statements) to control
the flow of your command actions, provide feedback through things like text-to-speech
as well as do other stuff like provide information to plugins.
The Variable Name can be whatever name you want. This value will be stored at the
application level (shared among all profiles), so care must be made in order to make
your name is unique enough so you don't overwrite your values accidentally. The
variable names are not case-sensitive and they must not contain semicolons or
colons (variable names can only contain colons if contained within a token… this would
be a good place to indicate that this input box also processes tokens).
The purpose of this screen is to set the value of the variable, and you do that by
selecting one of several different ways. The first way is to set an exact value (such as
100.1). Just select the option labeled, 'A value' and type the value in the box.
Another way to set a decimal variable value is to give it a random value. Just select, 'A
random value' and provide a minimum and maximum value and the variable will have a
random number chosen within that range.
You can set your variable to the same value as another variable. Select, 'Another
variable' and type the name of the variable with the value that you want copied in the
box provided.
To clear the value of your variable (make the value be, 'Not Set' (programmers will call
this, 'null'), select the, 'Clear value' option.
If you have a value in text or in a token, you can attempt to convert the value to a
decimal by selecting, 'Convert Text/Token' and type the text and/or tokens into the box
provided. If the value cannot be converted, the variable value will be, 'Not Set'. This
is kind of advanced, and you may never even use this option.
If you want your decimal variable to be saved with the active profile, select the, 'Save
value to profile' option (check box at the bottom). This will allow you to access the
value between application sessions (VoiceAttack application is closed and then
launched again).
To retrieve the decimal variable saved with the profile, select the, 'Retrieve saved
value' option. If the value was previously saved (as indicated above), the value will be
set. If no value is available, the variable value will be, 'Not Set'.
Note: To clear all previously-saved decimal variables, see the, 'Clear Saved
Values from Profile' action.
If you want your decimal variable's value to be computed for you, there are some
simple math functions available to you. First, select the, 'Computed value' option.
Next, select the appropriate function. You can add, subtract, multiply and divide (plus
several more functions). The next thing you will want to do is indicate what you would
like to compute against… that can be an explicit value (such as 2.6) or another
variable or even a converted token. To select an explicit value, select, 'Compute
against a value' and provide a value. To select another variable, choose, 'compute
against a variable or token' and provide the variable name. To compute against a
token, select this same option and indicate the token in the box provided. If the token
cannot be converted, the value of computation will be, 'Not Set'.
As a convenience feature, there is a check box labeled, 'Evaluate Not Set as zero'.
This will allow you to initialize your variables as zero if they are not set when computing
values. This is merely to save an initialization step (yes, another advanced bit you may
never use).
If you would like your assigned variable to be rounded to a certain number of decimal
places (from 0 up to 10), select the 'Round value' option and choose the appropriate
value.
Note: You can define as many values as you want, however, the values that you
define are not persisted. That is, they are not saved to disk. These values will be reset
every time you restart VoiceAttack. If you want your values saved to disk for use
between application sessions, select the 'Save value to profile' option.
Advanced: Variables can be scoped at the command-level, at the profile-level and
globally. Most will use the globally-scoped variables (for good reason), however, for
those that need a finer level of control, make sure to check out the, ‘Advanced Variable
Control (Scope)’ section later in this document.
'Set a Date/Time Value'
This command action will allow you to set the value of a date/time variable. These
variables can be used in conjunction with Conditional blocks ('If' statements) to control
the flow of your command actions, provide feedback through things like text-to-speech
as well as do other stuff like provide information to plugins.
The Variable Name can be whatever name you want. This value will be stored at the
application level (shared among all profiles), so care must be made in order to make
your name is unique enough so you don't overwrite your values accidentally. The
variable names are not case-sensitive and they must not contain semicolons or
colons (variable names can only contain colons if contained within a token… this would
be a good place to indicate that this input box also processes tokens).
The purpose of this screen is to set the value of the variable, and you do that by
selecting one of several different ways. The first way is to set the date/time variable to
the current date/time (the current date/time when the action is executed). Just select
the option, 'Current date/time'. If you want to set this value to UTC, select the, ‘Use
UTC’ option.
Another way is to set an exact date and time. You can do this by selecting the,
'Specific date/time' option and selecting the date and time in the boxes provided.
You can set your variable to the same value as another variable. Select, 'Another
variable' and type the name of the variable with the value that you want copied in the
box provided.
To clear the value of your variable (make the value be, 'Not Set' (programmers will call
this, 'null'), select the, 'Clear value' option.
If you want your date/time variable to be saved with the active profile, select the, 'Save
value to profile' option (check box at the bottom). This will allow you to access the
value between application sessions (VoiceAttack application is closed and then
launched again).
To retrieve the date/time variable saved with the profile, select the, 'Retrieve saved
value' option. If the value was previously saved (as indicated above), the value will be
set. If no value is available, the variable value will be, 'Not Set'.
Note: To clear all previously-saved date/time variables, see the, 'Clear Saved
Values from Profile' action.
If you want add or subtract time from your date/time variable, there are some simple
options available. Select the, 'Add' option and then indicate the number of seconds,
milliseconds, minutes, hours, days, months or years to add to the variable. To subtract
time from your date/time variable, simply use negative values in the input box. If your
date/time variable is, 'Not Set', adding or subtracting time from it will still result in, 'Not
Set'. As a convenience, the, 'Evaluate Not Set as current date/time' option is available.
If this option is selected and the variable is new or cleared (Not Set), the variable will
initialize as the current date/time (might save a step).
Note: You can define as many values as you want, however, the values that you
define are not persisted. That is, they are not saved to disk. These values will be reset
every time you restart VoiceAttack. If you want your values saved to disk for use
between application sessions, select the 'Save value to profile' option.
Advanced: Variables can be scoped at the command-level, at the profile-level and
globally. Most will use the globally-scoped variables (for good reason), however, for
those that need a finer level of control, make sure to check out the, ‘Advanced Variable
Control (Scope)’ section later in this document.
'Clear Saved Values from Profile'
This action will allow you to clear all saved variables of a given type from a profile.
This is an easy way to initialize or clean up what has been persisted to disk. Simply
select the data type(s) to clear using the check boxes provided.
Note: This will clear the variable values that are saved to the profile, but will NOT clear
the resident variables from memory.
'Execute an External Plugin Function'
This command action is what you will use to invoke an external plugin function (see
plugin section near the end of this document). To invoke a plugin, you must have
enabled VoiceAttack plugin support (see, 'Options' page). If you have plugins installed,
you can pick one to invoke from the dropdown list. To know how to interact with a
plugin, you must see the documentation provided by the developer of your plugin. The
plugin developer will explain what values need to go in which of the several boxes.
Below is a short reference on what each control does.
Plugin Context - This is a string value that can be used to pass a simple value to the
plugin. This can be anything you want, including any combination of replacement
tokens.
Small Integer Variables (formerly referred to as, 'Conditions') - This is a semicolondelimited list of small integer (condition) variable names that you want to pass to the
plugin. They can be small integers that already exist (see, 'Set a Small Integer
Variable' command action above), or new values that you want the plugin to fill
(optional). The values can be modified in the plugin and returned to VoiceAttack for
further processing.
Text Variables - This works exactly the same as small integers, except you are passing
the text variables instead.
Integer Variables - This works exactly the same as small integers, except you are
passing integer variables instead.
Decimal Variables - This works exactly the same as small integers, except you are
passing decimal variables instead.
Boolean Variables - This works exactly the same as small integers, except you are
passing Boolean variables instead.
Date/Time Variables - This works exactly the same as small integers, except you are
passing date/time variables instead.
'Wait for the plugin function to finish before continuing' - This option allows you to have
VoiceAttack wait until the plugin is finished so that you may have a chance to react to
changes that have been made in the plugin. For instance, maybe the plugin goes out
to the internet and retrieves data. The plugin packages up the data and returns it to
VoiceAttack. If this option is checked, VoiceAttack's next action in sequence could do
something with that data (like read it with text-to-speech, or invoke some other
command based on a condition).
'Execute an Inline Function: C# or VB.net Code'
This will allow you to write C# or VB.net code that will be compiled and executed as a
VoiceAttack action. Within this code, you have access to the VoiceAttack proxy object,
‘VA’, that is the same object used within the plugin framework so you can execute
commands, get/set variables, parse tokens, etc. (see, ‘Plugins for the Truly
Mad’/’Plugin Parameter Notes’ section later in this document for information on using
this object). Since this is an advanced, specialized feature that requires a fair amount
of detail, the discussion about this feature will be on the VoiceAttack user forums. For
now, a light description will be provided here.
The first thing you will probably notice is the big code window right in the middle. This
is where you will write your function(s). In there, you’ll see various, optional
using/Imports statements that you would find in a typical new C# or VB.net forms
project. You’ll notice that there is a required function, ‘main’ that needs to be present,
as well as the class that encloses it (with required name of, ‘VAInline’). From, ‘main’,
you can call your functions or instantiate your classes (or just put it all right in, ‘main’).
As stated above, you will have access to a dynamic-typed VoiceAttack proxy object
called, ‘VA’. When you create a new, ‘Inline Function’, you’ll see some commented-out
examples showing how to use, ‘VA’. Note this is a very basic editor that will probably
evolve as time permits ;)
Above the code editor is the, ‘Referenced Assemblies’ box. Within this box, you’ll
see an initial set of common referenced assemblies that are separated by semicolons.
You can add or remove assemblies from this list as you need them. Note that full
paths to assemblies can be used, and that this box will accept tokens.
Down below the code window is a simple box for a description or name that will show
up in the action list (instead of just, ‘Inline C# function’).
The, ‘Wait for the inline function to finish before continuing’ option will cause the
calling command to wait until the, ‘main’ function is finished before it resumes
executing the next action. This is referred to as running the inline function
synchronously. If this option is not checked, the inline command will be run
asynchronously, and the command will resume execution of its next action
immediately. Note: Running your inline function asynchronously will make it so that
the code you write will run on in the background with no way to stop it with a command
stop (by pressing the, ‘stop all commands’ button or by issuing a, ‘stop commands’
action). In order to help with this type of situation, the VoiceAttack proxy object (‘VA’)
can be queried to find out if a command stop has been issued. Simply put a check in
your code using the, ‘Stopped’ property so that you can stop your function if it needs to
be stopped with a command stop. Additionally, if you need to reset this flag for
whatever reason, the, ‘ResetStopFlag()’ function can be used.
The, ‘Retain Instance’ option will allow you to keep the instance of the class resident
for subsequent calls. When an inline function is executed, an instance of the ‘VAInline’
class is created and then the, ‘main’ function is called. When this option is not
selected, the instance of ‘VAInline’ is destroyed when, ‘main’ completes. The next time
the inline function is called, a fresh, new instance is created and the cycle starts over.
If this option is selected, the instance is not destroyed when, ‘main’ completes and any
properties that are set within the instance are maintained. This is so you can maintain
your information between subsequent calls.
The, ‘Compile’ button will attempt to compile the code that is in the code window with
the assembly references listed. The box below the code window will show the status
of the compile (errors, warnings or confirmation of a successful compilation).
The, ‘Test Run’ button will allow you to test run the, ‘main’ function. When you click,
‘Test Run’, the code is first compiled (just as if you clicked the, ‘Compile’ button) and
then run if successful (0 errors). If the code finishes, you will see, ‘Test Run Complete’
in the status box. If your function runs on a while, you’ll notice that the, ‘Test Run’
button has changed to, ‘Stop’. You can stop your function by pressing the button
again.
Even more advanced, in case you haven’t had enough…
Normally, your compiled code in an Inline Function is not stored on disk. The function
is completely kept in memory and only become compiled the first time it is run after
VoiceAttack is launched. Sometimes, for whatever reason, you may not want to just
have your code available to the end user, or, if your code requires a long compile time
(probably not likely in this context, but you never know, right?) you may want to
precompile your code into its very own file. You can do this by adding a file path to
the, ‘Build Output’ box and then clicking on the, ‘Build’ button. The, ‘Build’ button
works exactly like the, ‘Compile’ button, except that when the code is successfully
compiled, the compiled, ‘function’ (also called an, ‘assembly’) will be written to the file
location specified in the, ‘Build Output’ input box. The new file can then be referenced
and executed by the, ‘Execute an Inline Function: Precompiled’ action outlined
below. Note that the, ‘Build Output’ and, ‘Build’ buttons are specifically for this purpose
and are not used for anything else (Frankly, I didn’t want to create an entirely separate
set of screens just to do this one little bit that maybe two people out there might use…
you’ll have to forgive me ;)).
Note: Since there is (currently) no debugger, you will need to use the VA.WriteToLog()
function (detailed later in this document) to write values out to the VoiceAttack log.
'Execute an Inline Function: Precompiled'
This will allow you to execute a previously-compiled inline function that you or
somebody else create. This action goes along directly with the, ‘Execute an Inline
Function: C#/VB.net Code’ action above. An option of the, ‘Execute an Inline Function:
C#/VB.net Code’ action is the ability to compile your code to a specified file. The
resulting, ‘function’ (also called an, ‘assembly’) can then be referenced from this action
and executed. To specify the file to use, just click on the ‘…’ button to browse and
select the file. You can then optionally provide a description for display purposes. The
options, ‘Wait for the inline function to finish before continuing’ and ‘Retain
Instance’ work exactly like they do in the, ‘Execute an Inline Function: C#/VB.net
Code’ action listed above.
Note: When using a compiled function provided by somebody else, make sure that
you trust the party from which you received the file. A malicious function can cause
serious harm or cause security to be compromised in your system and/or network.
'Write Text to a File'
This action will allow you to write text to a file. The value to be written can contain
literal text or tokens. Just indicate the text you want to write in the, ‘Text’ input box.
You will then need to select a file to output your value to. Just click on the, ‘…’ button
to browse for a file, or just type in the full path in the, ‘Output File’ input box.
There are a couple of options that you can select. The first is whether or not you want
to append the value to the target text file. If you choose the, ‘Append text to file’ option,
the value will be written to the end of the target file. If the file does not exist, it will be
created first. The next option is whether or not to overwrite an existing file. If the
target file already exists and this option is selected, the target file will be completely
overwritten. Make sure you use these options with absolute care, as you can erase or
corrupt important data.
'Write a Value to the Event Log'
This action is very simple... just print some text to the VoiceAttack event log.
Although not technically an, 'advanced' feature, this command action was created to
assist in the development of commands that contain conditions and invoke plugins.
The value that you output to the log can contain as many tokens as you need. You can
also specify a color-coded dot if you want:)
'Add a Comment to the Action List'
This action is simply a comment that you can add to the action list for your own
notation. It has no effect when executing commands. Note that this can be blank to
add some spaces between actions (just to pretty things up a bit).
Key Press Recorder Screen
This screen allows you to capture key presses as you perform them. It will help you to create
more lengthy macros quickly, as well as provide a better way to mimic human keyboard
interaction (as required by a lot of games).
To start recording your keystrokes, click on the, 'Start Recording' button. Click this button
again to stop recording. Notice that your keystrokes appear in the window as you press and
release the keys. In this example, we are not recording the pauses that occur between key
events. To record pauses, check the, 'Record pauses between key events' box. If you want
all of the pauses to be the same time value, check the, 'Equalize all pauses' box, then change
value to what you would like the pauses to be. If your recording is very verbose (key X down,
pause, key X up), select the, 'Consolidate keys' box to consolidate multiple key events into a
single command action (in the above example, M Key Down and M Key Up would become,
'Press and Release the M Key'). If you would like to omit pauses between the different key
presses, select the, 'Suppress pauses between key presses' option.
When you are satisfied with your recording, click the, 'OK' button to insert your recording into
your command.
Mouse Action Screen
The Mouse Action screen allows you to add mouse actions to your macros, such as moving
the mouse, clicking a mouse button or using the scroll wheel. The Mouse Action screen is
now divided up into two tabs: Move and Click.
Mouse Move Tab
Move to coordinates (X, Y)
Selecting this will allow you to move the mouse to a particular point on the screen.
There are two ways of inputting the coordinates. First, you can manually enter the X
and Y values in the input boxes, or you can click on the, 'Set Position' button to open
up the 'Capture Mouse Location' helper screen:
To capture the mouse position, simply open your game or application and move your
mouse to the location that you want and then press the designated hotkey / hotkey
combination (in this example, the hotkey combination is Alt + F3). The coordinates of
the mouse will then be displayed. Click, 'OK' to keep the coordinates.
Note: The hotkey can be reconfigured in the Options screen.
There are several options that go along with the setting the mouse position. The first
two are ‘Screen Coordinates' and 'Application Coordinates'. Choosing, 'Screen
Coordinates' indicates that the mouse position is in relation to the entire screen (this
includes multiple-monitor setups). So, if your coordinates are (100, 100), you'll notice
your mouse moves close to the top-left edge of your monitor.
'Screen Coordinates' is good for a lot of cases (especially games) but if you are using
windows to do tasks, this could be almost useless (since you move you move your
windows around all the time). To make the mouse position relative to the current,
active window, choose 'Application Coordinates'. If the coordinates are (100, 100),
you'll notice that the cursor is placed near the top left corner of whatever window you
are looking at. Note that the, 'Capture Mouse Location' helper respects this setting.
The other four options for setting the mouse position deal with how the position relates
to a particular corner (either the corner of the screen or the corner of a window). The
default is Top-left of screen/window (since this is the option you will probably be using
almost exclusively). The second-most used option will be the Bottom-right of
screen/window (useful when windows are resizable… you know… so you can click that
button that moves when your screen is resized). Your mouse coordinates will be in
relation to the bottom-right of the screen or active window. Notice that the effective
coordinates will be negative numbers, since the origin is the bottom-right corner. I
hope this makes sense (lol). The 'Capture Mouse Location' helper respects this
setting also.
Move to text / token-based coordinates
This option allows you to specify your X and Y coordinates as tokens so you can,
'programmatically' set your mouse positions. If your X and Y tokens resolve to values
that can be interpreted as integers, the position will be used. Otherwise, no movement
will occur (info will be displayed in the log). If the evaluated coordinate is outside the
boundaries of the area, the boundary will still be used. See the section on Tokens later
in this document to find out what's available to you. Note: all variable types can be
expressed using tokens.
Move to specific location
This feature will allow you to move the mouse to specified locations. The locations are
the top-left, top-right, bottom-left, bottom-right, center, top, bottom, left and right of
certain screens. Choosing top-left, top-right, bottom-left or bottom-right will move the
cursor to the corners of the target. Choosing center moves the mouse cursor to the
middle of the target. Choosing left, right, top or bottom will move the mouse cursor
to that area of the target, related to the current location of the cursor. The targets are:
‘Application’ - the executing command’s active target.
‘Primary Screen’ - the primary screen as indicated by Windows.
‘Cursor Screen’ - the screen where the cursor is located.
‘Active Window Screen’ - the screen where the active window is located (as indicated
by the top-left corner of the screen).
‘All Screens’ - all active screens which constitute a, ‘virtual screen’.
Save Current Position
Choosing this option will make VoiceAttack remember the current mouse cursor
position in your macro. This, 'remembered' position can be recalled with the 'Recall
mouse cursor to saved location' option.
Recall mouse cursor to saved position
Adding this action to your command will move the mouse cursor to the last
remembered position (after 'Save current position' is issued). Note: If no position is
saved, the mouse position will not change. Additionally, when the 'Recall mouse cursor
to saved location' action is issued, the remembered value is cleared.
Move Mouse Left / Right / Up / Down (Adjust the Mouse Cursor Location)
These actions will allow you to move your mouse a specified number of pixels. You
can choose to move your mouse left/right and up/down. Simply select the radio button
to select the direction and type the number of units to move in the box provided. The
input boxes for each direction will allow you to input numbers (like 100), tokens (like,
‘{INT:myVariable}’ (see the VoiceAttack token reference later in this document for
information on tokens)) and long integer variables (like ‘myVariable’). VoiceAttack will
attempt to resolve your numbers, tokens or variables into a value and move the mouse
accordingly. If the value provided cannot be resolved into an integer, the value will be
resolved as zero and the mouse will not be moved in that particular direction.
The option, ‘Move from cursor position’ will make your mouse movement relative to
the current location of your mouse cursor. The option, ‘Move from last-moved
position’ will make the mouse move from the last place that VoiceAttack had set it
(note that if this position has not been set, the current mouse cursor location will be
used).
Some 3D games require a certain type of input to work properly. The option labeled,
‘Move using relative data’ is provided to assist with moving the mouse in, ‘3D space’.
Try checking this box if your ship or your FPS character doesn’t respond to mouse
movements.
A fun feature added to the movement of the mouse is the ability to do some simple
mouse animation. This was added to help with keeping track of the mouse, versus
having it just move to another part of the screen instantly. To animate your mouse
cursor movement, simply check the option labeled, ‘Animate movement’. There are
some options that go along with animating the mouse that are required. First, you
need to choose whether or not your movement will ease in to its destination or just
move consistently. To make your mouse ease into its destination, select, ‘Ease
movement’, otherwise, uncheck the box. The next two parts go hand-in-hand:
‘Timing’ and, ‘Steps’. Steps is the maximum number of steps to take when animating
your mouse, and Timing is a base time for the movement. Increasing the timing makes
the mouse cursor take longer to reach its final destination. Increasing the steps
increases how smooth the mouse cursor seems to move. There are catches, however.
Timing is based on seconds, but the end result will usually not be exact (especially if
you add a lot of steps). The more steps you add, the more the base time is going to
expand. On the flipside of this is if you use the, ‘Ease movement’ option, where the
mouse cursor may reach its destination faster. You will want to play around the
settings to get it just right for you. Easing the movement with timing of 1.00 and 60
steps works great here, but it may not with your system.
Mouse Click / Scroll Tab
Click Left / Right / Middle / Back / Forward button
These actions will make the mouse click at the current point on the screen using the
selected mouse button.
Double-click Left / Right / Middle / Back / Forward button
These actions will make the mouse double-click at the current point on the screen
using the selected mouse button.
Mouse Click Duration
Available only for click and double-click actions, this value is the amount of time in
seconds between when the mouse button is pressed and when it is released. For
most Windows applications, this value can be zero. For games, however, a value of
zero is usually too fast to be detected reliably. The default value is 0.1 second, which
may need to be adjusted for your application.
Left / Right / Middle / Back / Forward button down
These actions will make the mouse press down only at the current point on the screen
using the selected button. This effectively simulates, 'press-and-hold', and, you will
need to add a subsequent release.
Release Left / Right / Middle / Back / Forward button
These actions will make the mouse release the selected button. Use this as a followup to a previous mouse button down action.
Scroll wheel forward / backward
These actions will allow you to scroll the mouse wheel forward or backward by
however many number of 'wheel clicks' that you choose.
Note: To simulate what an actual mouse does when clicking, any mouse down action will
now set the command's process target to be the application of the window that is located
under the mouse. This will be for the remainder of the executing command. In older versions
of VoiceAttack, the active window or specified process target always received the command's
mouse messages for input. This would cause problems unless you knew a lot about
VoiceAttack. Not good for something that should be so simple, right?
In order to turn this feature off, select the option, 'Bypass Mouse Targeting' on the
System tab on the Options screen.
Registration Screen
If you are using the limited trial version of VoiceAttack and are still within the trial period, you
will see the splash screen below each time you run VoiceAttack. In the bottom-left corner,
there will be an indication of how much time is left to use the trial.
If you have run out of time, or, you have clicked the 'Options' button on the main screen (See
'Options Screen') and then clicked the 'Registration' button, you will be presented with the
registration screen for VoiceAttack:
If you have purchased a registration key from VoiceAttack.com, this is the place to put it in.
Simply type or paste in your registration key into the box provided. Additionally, you will need
to put in the very same email address that you used when you purchased the VoiceAttack
registration key. Click the, 'OK' button to start the validation process. This should only take
seconds depending on your Internet connection and firewall settings.
Upon successful validation, the registration screen changes to display only what you have just
entered, just for your records. If validation is not successful (for various reasons), you can hit
cancel to continue using the VoiceAttack trial until time runs out.
Options Screen
The, Options screen allows you to configure your VoiceAttack application. The Options
screen and it's supporting dialogs are outlined below. Note that the Options screen now has
three tabs with various settings on each tab.
General tab
Below are the items you'll find on the, 'General' tab of the Options screen.
Registration Button
Click this to bring up the registration screen (See 'Registration Screen').
Check for Updates Button
Click this button to have VoiceAttack check if an update is available for download
(internet connection is required, of course).
Reset Defaults Button
Click this button if you want VoiceAttack to return all of the settings back to what
they were when it was first installed. The screen presented also contains an option to
remove all registration data. If the option is selected, the registration data will also be
reset. Note: Profile data is not reset.
Launch with Windows Start
Checking this option will make VoiceAttack launch when Windows is started. This is a
per-user setting.
Minimize to System Tray
When selected, a VoiceAttack icon is placed in the System Tray. When unselected,
VoiceAttack minimizes to the task bar.
Check for Updates on Startup
Selecting this option will make VoiceAttack check for updates each time it is
started. You will only get a message if there is actually an update available.
Start Minimized
Select this option to make VoiceAttack start up in a minimized window state.
Show Tips at Startup
When this is selected, the VoiceAttack Tips screen will be displayed each time
VoiceAttack is launched.
Show Control Tips
Tool tips pop up to give descriptions of most items. Deselect this box to turn them off.
Default value is 'selected'.
Enable Auto Profile Switching
This turns the VoiceAttack automatic profile switching on and off for all profiles
that are enabled. See the Profile Options page for more details on automatic profile
switching.
Enable Plugin Support
This will turn on plugin support in VoiceAttack. Plugins are external pieces of code that
can be custom-built to work with VoiceAttack. See the section entitled, 'Plugins' near
the end of this document for more information. Note that this is an advanced feature of
VoiceAttack, and you will receive a warning box indicating the dangers of enabling this
feature.
Display Size
This option changes the size of VoiceAttack's fonts and screens. The three sizes are
Normal, Larger, Largest. You will be required to restart VoiceAttack if this option is
changed.
Reset Screens Button
Pressing this button will allow you to reset the position and size of all VoiceAttack
screens.
Keyboard Display Layout
When using the Key Press screen, this option allows you to change what is displayed
for selected keys. For instance, key code 51 maps to the, '3' key. If you are in the
US, '3 #' is displayed. If you are in the UK, '3 £' is displayed. If your layout is not
yet supported, VoiceAttack will use the US layout (which is what VoiceAttack had
been using up to v1.5.3). For most users, this value will not need to be changed.
If you would like to force the display to another layout, just drop down the list to
select from the ones available (more to come).
Joystick Options
This is where you will assign and enable joysticks for use within VoiceAttack.
Joysticks can be used to carry out various tasks, such as executing commands as well
as turning VoiceAttack's listening on and off. Clicking on this button will take you to the
Joystick Options screen, shown below:
From this screen, you will be able to assign up to two joysticks for use in VoiceAttack.
You will notice when you first open this screen, you will have no assigned joysticks. To
assign a joystick to use within VoiceAttack, click on a plus (+) icon next to either
joystick slot 1 or joystick slot 2. You will then be asked to select a joystick to assign
from any currently-enabled devices reporting to be joysticks on your PC. Select the
joystick that you want to assign and then you will be returned to the Joystick Options
screen. Now that you have a joystick assigned, you can enable it or disable it by using
the checkbox labeled, 'Enable Joystick (1 or 2)'. To clear a joystick assignment, just
click the minus (-) icon next to the appropriate assignment. You'll notice that you can
also change the rate at which VoiceAttack checks the state of your joysticks. This
value is 30 times per second by default, but you can raise or lower that rate as you see
fit.
In the big middle of everything is where you can set up your POV (hat) controllers
to act like simple switches. Your POV can become a switch that acts like 1, 2, 4 or 8
buttons. For instance, if you select 4, pushing forward, right, back or left on your POV
will make VoiceAttack treat each position as POV button 1, 2, 3 and 4 respectively. If
you select option1, VoiceAttack treats any direction as POV button 1. Selecting 2
(Up/Down), if you push up, that represents POV button 1. Pulling back represents
POV button 2, and so on. VoiceAttack can support up to four POV controllers on each
joystick if you've got 'em.
In the bottom-left portion of the screen, you will see the, 'Test' button. If your
joysticks are assigned and enabled, you can click on this button to try them out.
Sounds Folder
Part of the advanced features of VoiceAttack, the VoiceAttack Sounds folder makes it
easy to have a central place to keep and maintain your VoiceAttack sound effects files.
This folder can be located anywhere on your system and can be accessed via the
{VA_SOUNDS} token (see tokens near the end of this document). Where this comes
in handy is that it allows you to have kind of a virtual directory that you can export with
your profile and share. Let's say you have a collection of sounds in
C:\VoiceAttack\Sounds\VeryCoolSoundPack. Inside this sound pack folder, you have a
sound file called, 'detonate.wav'. You can set the Sounds folder to
C:\VoiceAttack\Sounds, and access the sound file in the sound pack directory like this
{VA_SOUNDS}\VeryCoolSoundPack\detonate.wav. If you export this in a command in
your profile, the token goes with it, so your friends do not have to have the same file
structure as you do. They only need to have the Sounds folder set up with the,
'VeryCoolSoundPack' folder located appropriately.
Apps Folder
Just like the Sounds folder above, the Apps folder makes it easy to have a central
place to keep your apps (.exe files) and plugins (.dll files). This is also a special folder
for VoiceAttack in regards to plugins. VoiceAttack will only look in the subfolders of this
folder to look for plugins (see section on Plugins near the end of this document).
Recognition Tab
Speech Engine
This will allow you to choose a SAPI-compliant engine. You may never need to change
this. It was fun for us to mess with, but, 99.99999 percent of users will just need to
leave this set to 'System Default'. More on this at a later time.
Recognized Speech Delay
This is the amount of time that VoiceAttack's speech engine waits to perform the
actions of a command after it understands a phrase and detects a silence. Play
around with this number. If you have phrases that are similar and lengthy, a higher
value might be needed. If your phrases are short and different, go with a lower value.
The value range is 0 – 10000 (10 seconds). The default value is 0 (it is recommended
that you start at zero and work your way up if are having trouble).
A simple example of a reason to increase the value of 'Recognized Speech Delay'
would be if you had two commands. The first one is, ‘pet attack' and the second one
is, 'pet attack plus ten'. Depending on *your* speaking ability, VoiceAttack may
execute, 'pet attack' if the value is set too low. Increasing the value causes
VoiceAttack to wait before execution, so you can finish articulating your command.
Unrecognized Speech Delay
This is the amount of time that VoiceAttack's speech engine waits to reject a speech
stream that it does not understand and then detects a silence. The value range is
from 0 to 10000 (10 seconds). The higher the value, the longer VoiceAttack will take to
reject the speech and move on.
An example of a reason to increase the, 'Unrecognized Speech Delay' value would be
in a situation where you have a two-word command like, 'pet attack' (also, let's
consider that you do not have a command called, 'pet'). Depending on *your* speaking
ability, you may only be able to get out, 'pet' (which is unrecognized). Increasing the
value causes VoiceAttack to not immediately reject the command, thereby allowing
you to finish speaking your command.
Note: This setting is useful for those that leave VoiceAttack's listening on all of the
time. It adjusts the delay after one finishes talking over their headset before being able
to issue a command.
Command Weight
This value is the relative weight of the commands in your profile versus everything else
you say. The higher the number, the more likely VoiceAttack will make a, 'best guess'
at what you say. For example, when this value is at maximum (100), your commands
have full weight. That means that basically everything you say will be interpreted into
a command. If you say, 'flag', and, you have no command called, 'flag', but, the closest
match is, 'bag', VoiceAttack will execute the command named, 'bag'. Note that a high
value in this option will probably not be desirable when VoiceAttack's listening is on all
of the time (especially if you carry on conversations). However, a high value may be
beneficial when using the push-to-talk feature. Play around with this number to get the
right balance for your speaking style.
Minimum Confidence Level
When the Windows speech engine recognizes a phrase, it provides a confidence rating
of just how accurate it thinks it was at doing its job. VoiceAttack will allow you to filter
out anything that the speech engine recognizes but does not meet a minimum rating.
You can set this value here (from 0 to 100). The higher the number, the more selective
VoiceAttack will be about executing commands. Note that this value can be overridden
at both the profile level (on the Profile Overrides screen) as well as for each individual
command (on the Command Add/Edit screen). Any phrase that is recognized but
rejected because it falls below the minimum value will show up in the log.
Select the, 'Show confidence level' option to show the speech engine's confidence
level in the log for each recognized phrase.
Disable Adaptive Recognition
The speech engine used by VoiceAttack is constantly learning from what it, 'hears'.
When environments are noisy, the speech engine may become somewhat
unresponsive. Although selecting this option is not recommended, it may be very
helpful if you are using VoiceAttack in a noisy place.
Disable Acoustic Echo Cancellation
This will disable the acoustic echo cancellation on your pc in an attempt to increase
recognition reliability. Note that this is a system-wide change and can affect other
applications that may depend on this.
Reject Pending Speech
When you turn off, 'listening' in VoiceAttack, you can choose how to handle what
happens if you are speaking at the same time. When this option is not checked
and you turn off, 'listening', VoiceAttack will let you finish the phrase you already
started before it stops processing your commands. Checking this box will stop
command processing immediately, including the phrase you are speaking.
Recognition prefix exclusions
Sometimes when we speak commands there are ambient noises. You might breathe
or make a, 'pop' noise. These noises are sometimes interpreted as words by the
speech engine. For instance, if you have a command called, 'power to shields', you
might see it come up as, 'Unrecognized: if power to shields'. This is
because the speech engine interpreted the, 'if' from some kind of noise
it picked up (mostly breathing). Items that you add to this semicolon-delimited list
will be filtered out from the beginning of unrecognized phrases and reprocess those
phrases to see if they are actually recognized. Adding, 'if' to the list will filter out the
'if' at the beginning of, 'if power to shields' and recheck to see if, 'power to shields' is
acceptable (which it will be in this case). Your command will then be recognized.
Note that the default is, 'if;but;the' (without quotes). That means that all three of
these words will be filtered from the beginning of all unrecognized commands.
You will probably need to change these if you are not using the English speech
engine ;)
For a long time, VoiceAttack has filtered out some words ('if' and 'but'). This doesn't
work well with non-English speakers and they are hard-coded (of course). This option
lets you pick what words to use. This is a semicolon-delimited list of values (the
default is, 'if;but;the').
Audio Tab
Enable Notification Sounds
This turns on/off notification alert sounds within VoiceAttack (such as the sounds you
hear when VoiceAttack starts and stops listening). Default value is 'selected'.
Force Legacy Audio
Use this option if you are having difficulty hearing sound files that are played back in
your command sequences. VoiceAttack checks to see if you have Windows Media
Player 10 (or later) installed. If VoiceAttack's detection fails, or, Windows Media Player
is failing, try out this option.
Sound File Volume Offset
This is the offset value for the volume of all sound files that are played using the, 'Play
a Sound' command action. Think of this as a main volume control for all of your
sounds. Note: This feature only works if you are not using Legacy Audio.
TTS Volume Offset
This is the offset value for the volume of all Text-To-Speech playback using the, 'Say
Something' command action. Think of this as a main volume control for Text-ToSpeech in VoiceAttack.
Set Windows Default Audio Playback Device on Startup
This is kind of a multi-function feature that allows you to set the Windows default audio
playback device (like speakers or headphones) when VoiceAttack starts. Also, the,
‘Change Now’ button is provided as a convenience so you can change the audio
device immediately.
VoiceAttack uses Windows Media components to do its thing, and since these
components only work with the default playback device, this feature may save you a
step (or several) while using VoiceAttack. To use this feature, simply select the device
you would like to use (the list only shows your currently-available devices). If you want
to switch to the selected device on startup of VoiceAttack, just check the option box. If
you want to change the device immediately, just click the, ‘Change Now’ button. There
are also some command line options for controlling the default playback device. See,
‘-output’ in the command line options section later in this document.
Note: This feature is only available for Windows 7 and later.
Note: If the device’s underlying identifier is changed (driver update, Windows update,
crash, etc.), VoiceAttack will attempt to resolve the device by its last-known device
name. If you see a log message containing, ‘Resolved by device name’, VoiceAttack
has successfully made the change, but you may want to update this setting.
WARNING: This is not a VoiceAttack setting, rather a Windows device setting and can
(and probably will) cause other applications that depend on the changed devices to
appear to malfunction. It’s not THAT big of a deal, but it will definitely throw you off
when your Skype or TeamSpeak is not working how you left them.
Set Windows Default Audio Recording Device on Startup
This works exactly like the option above but for the default recording device (table mic,
headset mic, webcam mic, etc.). Everything applies, except you’ll be looking for,
‘-input’ in the command line options section.
Hotkeys Tab
Recognition Global Hotkey
This is the key/key combination that stops and starts VoiceAttack's, 'listening'. You
can make VoiceAttack toggle listening on and off, or, you can hold down this key/key
combination to make VoiceAttack listen and more. The default value for this is to
toggle listening with Alt + F1 (works just like clicking on the Listening/Not Listening
button on the Main screen. To change this value, click the, '…' button, and, you will
be presented with the following screen:
From this screen, you can enable/disable this key combination. To choose a key
combination, simply hit the keys that you want to use. Modifiers (shift/alt/ctrl/win) will
highlight on the left, while the main key will highlight on the right. To clear all of the
keys, just click the, 'clear' link.
The listening methods are as follows:
Toggle listening start/stop - Choose this option if you want VoiceAttack to toggle
listening on and off with each press of the key/key combination.
VoiceAttack listens when keys are down – VoiceAttack's listening is only enabled
when the key/key combination are held down.
VoiceAttack stops listening while keys are down – VoiceAttack's listening is always
enabled, except for when the key/key combination is held down.
The, 'Do not allow key to be passed through' option prevents the main key (nonmodifier) from being passed through to the application. For example, if your hotkey is
F1 and this option is selected, VoiceAttack will respond to the F1 key press and then
prevent any other application from receiving this key press (for this example, if F1 is
being handled by VoiceAttack, you will not be able to use the F1 key while other
applications are running. If you rely on F1 to bring up, 'Help', then, you'll have to pick
another key). Use care when selecting this option.
Note: If the key is part of a combination and this option is selected, hitting the main
key by itself will still pass through to the application.
Note: This option can be overridden at the profile level. See, 'Profile Override' screen.
Mouse Click Recognition
Works like the Global Hotkey, only with your mouse. You toggle 'Listening/Not
Listening', and, you can hold down a mouse button to 'Listen', or, you can hold down a
mouse button to stop listening. This feature is available on the five standard mouse
buttons (left, right, middle, forward & back).
Note: This option can be overridden at the profile level. See, 'Profile Override' screen.
Stop Command Hotkey
This is the hotkey you can select to act as a panic button to halt all running macros.
This works the same as pressing the 'Stop Commands' button on the main screen
(See, 'Main Screen'). Click the, '…' button to change this option (this works pretty
much the same as the, 'Global Hotkey', so, for brevity, the screen shot and description
is omitted).
Note: This option can be overridden at the profile level. See, 'Profile Override' screen.
Mouse Capture Hotkey
This is the hotkey that you will use to capture the mouse's current position in the,
'Mouse Action / Capture Position' screen. Click the, '…' button to change this option.
Joystick Button Recognition
This is the joystick button that stops and starts VoiceAttack's, 'listening'. You can make
VoiceAttack toggle listening on and off, or, you can hold down this button to make
VoiceAttack listen and more. To change this value, click the, '…' button, and, you will
be presented with the following screen:
From this screen, you can enable/disable this joystick button. To choose a button,
simply press the button on the joystick that you want to use. To clear the button,
just click the, 'reset' icon in the top-right.
The listening methods are as follows:
Toggle listening start/stop - Choose this option if you want VoiceAttack to toggle
listening on and off when the selected buttons are pressed.
VoiceAttack listens while button is down - VoiceAttack's listening is only enabled
when the selected button is held down.
VoiceAttack stops listening while the button is down - VoiceAttack's listening is
always enabled, except for when the selected button is held down.
Note: This option can be overridden at the profile level. See, 'Profile Override' screen.
System Tab
Bypass Mouse Targeting
This option disables setting the process target of the application located under the
mouse on a mouse-down event. When this option is not checked, when a mousedown event occurs (mouse down, click, double-click) the application located under the
mouse is selected as the process target (overriding any set process target) for the
duration of the command.
Single TTS Instance
VoiceAttack will allow for essentially any number of text-to-speech (TTS) instances by
default. Some TTS packages are particular about the number of instances of their
voices that are running and will cause VoiceAttack to hang or crash. Check this option
if you are experiencing trouble with a TTS voice package.
Cancel Blocked Commands
Checking this option will prevent commands from executing that are blocked by
synchronous commands (commands that do not have the option, 'Allow other
commands to be executed while this one is running' checked). Deselecting this option
will cause any commands that are triggered during the block to be executed when
the blocking command completes. Note that there is no guarantee of the order of the
execution of the blocked commands and there is also no guarantee that the blocked
commands will themselves be able to block. Hope that makes sense o_O.
Show Third-Party App Warnings
Some third-party applications can cause conflicts with VoiceAttack. Selecting this
option will show a warning in the log at the startup of VoiceAttack if any of the
predefined applications are running. The list of applications will be updated when
you click on the, ‘Check for Updates’ button. This value is on by default, so if you get
sick of seeing warning messages when you start up, deselect this option.
Stop Running Commands When Editing
When this option is selected, any commands that are running when the Profile Edit
screen is opened will be stopped. This will also prevent any commands from running
while the screen is open. Deselecting this option will allow commands to continue
while the profile is being edited and will not stop commands from being executed. Use
with caution when turning off this option.
Use Nested Tokens
When this option is selected, tokens are processed from the inner-most token to the
outer-most token, reprocessing from the inside out on each iteration. This allows for
tokens to be nested, or, in other words, tokens can provide input values to other
tokens. This may possibly cause issues with older commands. Unchecking this box
puts VoiceAttack back to what it used to be and may help if some tokens are giving you
problems. Note that this is a global setting, so you will want to fix up your old tokens if
you want to be able to use this functionality.
Exporting Profiles
Exporting a VoiceAttack profile is very simple. Just click the 'Export' button on the main
screen (See 'VoiceAttack's Main Screen') and you will be presented with the Export Profile
screen below:
Next, you can give your exported a profile a new name by typing it into the 'Export Profile
As' box. You will notice that all of the available commands are checked. If you do not want
certain commands exported, simply deselect the boxes next to them. When you are ready
to go, click on the 'Export' button, and, you will be presented with a ‘Save Profile' dialog
box. Make sure that you have selected 'VoiceAttack Profile' in the, 'Save as Type' box.
Pick a good place to save and hit the, 'Save' button. All saved VoiceAttack profile files are
given the '.vap' (VoiceAttack Profile) extension.
To import this newly saved profile, see the 'Importing Profiles' section. To import
commands from this profile, see, 'Importing Commands'.
NOTE: The Export Profile functionality is only available to registered versions of
VoiceAttack.
Creating Quick-Reference Lists
Creating a Quick-Reference List like the one below uses the same steps as exporting a
profile.
The only difference is that, instead of choosing to save your profile as a VoiceAttack Profile
(.vap), you need to save your profile as an HTML file (see image below). The HTML file
that is generated is viewable and printable in most compatible browsers.
NOTE: The Export Profile functionality (which includes creating quick reference lists) is
only available to registered versions of VoiceAttack.
Importing Profiles
Importing profiles into VoiceAttack is even easier than exporting ('See Exporting Profiles').
Just go to the main screen and drop down your profile list as shown below:
Click the 'Import Profile' item to initiate the import. When the 'Select a VoiceAttack Profile
File To Import' dialog appears, simply browse and select your previously saved VoiceAttack
profile file.
If the profile being imported has the same name as a profile that you already have,
VoiceAttack will rename the new profile for you.
NOTE: The 'Import Profile' functionality is only available to registered versions of
VoiceAttack.
Importing Individual Commands
To import commands into a profile, first click on the 'Import Commands' button located at the
bottom-left corner of the 'Add Profile' or 'Edit Profile' screens (See 'Profiles' section). You will
then be presented with an open file dialog titled, 'Select a VoiceAttack Profile Containing
Commands to Import'. Browse and select a previously saved VoiceAttack profile (VoiceAttack
profile files have a, '.vap' extension). The, 'Import Commands' screen will then appear as
below:
Only the commands that are checked will be imported into your profile. Commands that
are in red are conflicting commands that already exist in your profile. Importing the
conflicting commands will result in your profile's commands being overwritten. To
clear all conflicting commands at once, simply click the gigantic label in the bottom-left
corner :) When you are ready to import the selected commands, click on the, 'Import'
button at the bottom-right of the screen. Remember, the commands that you import are not
committed until you hit, the 'Done' button on the profile screen.
NOTE: In the unregistered version of VoiceAttack, the single profile given is limited to 20
commands. If the profile ends up with more than 20 commands, only the first 20 will be
shown (you may lose commands you have entered, since they may drop off).
Command Line Options
VoiceAttack supports the following command line options:
These turn on and off VoiceAttack listening:
-listeningoff
-listeningon
These turn on and off hotkey shortcuts:
-shortcutson
-shortcutsoff
These turn on and off mouse shortcuts:
-mouseon
-mouseoff
These turn on and off joystick buttons:
-joystickson
-joysticksoff
-minimize Starts VoiceAttack minimized.
-nofocus Prevents VoiceAttack from popping up an already-running instance (if this is not
specified, VoiceAttack pops up as the topmost window).
-profile “My Profile Name” Changes VoiceAttack's active profile. Note that double quotes
are only necessary if your profile name has spaces in it.
-command “My Command Name” Executes the command specified by name in the
running profile. Note that double quotes are only necessary if your command name has
spaces in it.
-stopcommands This will work just like clicking the, 'stop commands' button.
-bypassPendingSpeech If VoiceAttack's 'not listening' mode is invoked, and you
are in the middle of issuing a command, VoiceAttack will allow you to finish your phrase
and not cut off what you were saying. For some, this behavior is not what is expected.
What is expected is that setting VoiceAttack into, 'not listening' mode should cut off
immediately, excluding anything that is currently being spoken. To allow VoiceAttack to cut
you off immediately, use -bypassPendingSpeech. Note this does require VoiceAttack to be
restarted (does not affect an already-running instance).
-ignorechildwindows This is to help with toolbox windows that are always on top. By
default, VoiceAttack will seek out popup windows. This attempts to suppress that check.
This is experimental right now and may become a feature later with a finer level of control if
the need is there. For now, it is available as a global setting.
-verifyaudio This will make VoiceAttack check all ‘play a sound’ and ‘play a random’ sound
files to see if they exist. This just runs at startup and does not affect the already-running
instance.
-alwaysontopon This will set the running instance of VoiceAttack to be the top-most
application.
-alwaysontopoff This will turn off, ‘Always on Top’ if it is on, returning VoiceAttack to not
be the top-most application.
-showloadtime This will show the amount of time it takes to load a profile in the log. The
time taken by the speech engine is shown as well. Both times are in milliseconds. This is
useful for the folks making enormous profiles to give some sort of indication of what is
going on.
-nospeech This disables VoiceAttack speech recognition initialization. This is
experimental and functionally incomplete and is used primarily for testing (that is, it is not
currently supported). However, this may be a last resort for those that just cannot get their
speech engine to work and need to get into the software for whatever reason.
-input “Device Name” This will set the Windows default recording device (table mics and
headset mics for example) and set the speech engine to this device. The device name
parameter value (between the required double quotes) must be spelled exactly as it is
shown in the list on the VoiceAttack Options screen (see the Options screen for more
information on where to find this). Sometimes with certain events (like a driver update) the
name may change. This change may even be very slight (and frustrating). In order to
ease that pain
a bit, the device name parameter will accept wildcards. For example, this shows how to
change to a device exactly as indicated:
C:\Program Files(x86)\VoiceAttack\VoiceAttack.exe -input "Speakers (4- Sennheiser 3D
G4ME1)"
This example shows how to select the first device that has a description that contains,
'G4ME1':
C:\Program Files(x86)\VoiceAttack\VoiceAttack.exe -input "*G4ME1*"
Search this help document for, ‘wildcards’ for more examples of how they are used.
Note: Double quotes are required for this command line parameter. Also, this parameter
will work against new or existing instances of VoiceAttack.
WARNING: This is not a VoiceAttack setting, rather a Windows device setting and can
(and probably will) cause other applications that depend on the changed devices to appear
to malfunction. It’s not THAT big of a deal, but it will definitely throw you off when your
Skype or TeamSpeak is not working how you left them.
-output “Device Name” This works exactly like the -input parameter above except it
controls the default output device (like speakers and headphones). Same notes and
warning applies as well ;)
-inputx “Device Name” and -outputx “Device Name” These work exactly like -input and output, except that once the devices are changed, VoiceAttack closes immediately. This
means you can make a desktop shortcut or batch file that can change your headphones to
your speakers or your tabletop mic to your headset mic (or both at the same time) without
fully launching VoiceAttack.
-nokeyboard This keeps all keyboard hooks from turning on when VoiceAttack launches.
That means that global hotkeys (such as listening, stop commands, mouse capture) and
command shortcuts will be disabled. Note this affects only the instance launched with this
parameter and not an instance of VoiceAttack already running.
-nomouse This keeps all mouse hooks from turning on when VoiceAttack launches. That
means that global mouse clicks (such as listening) and command shortcuts will be
disabled. Note this affects only the instance launched with this parameter and not an
instance of VoiceAttack already running.
-uritimeout Timeout This indicates the timeout to use when setting text variables via the
URI option. This is a stopgap feature until proper user interface is created and may not be
in future versions of VoiceAttack. The timeout parameter is expressed in milliseconds:
-uritimeout 5000 sets the timeout to 5 seconds. The default value for the timeout that
VoiceAttack uses is 30 seconds. Note this affects only the instance launched with this
parameter and not an instance of VoiceAttack already running.
Note: If VoiceAttack is already started, most command line parameters affect the alreadyrunning instance of VoiceAttack. This way you can create desktop shortcuts that affect
VoiceAttack. Command line options are case-sensitive.
Text (and Text-To-Speech) Tokens
A VoiceAttack Token is a tag that can be used as a placeholder to represent a value in
places that use text (think of Tokens as mini functions). Tokens are surrounded by curly
brackets { } and will always contain a title that is case-sensitive : {DATE} or {CMD} or
{CLIP}. Tokens started their life in VoiceAttack for use in Text-To-Speech (TTS). Over
time, the uses for tokens grew and now they can be used in all sorts of places that require
text, such as file paths for launching apps and use in conditional statements. Some tokens
you may use a lot, others you may never use at all. Some are simple (like {DATE} ) and
some are way out there (like {EXP} ). An example of how to use the first token ( {TIME} ) is
below. It was used in TTS to help indicate the local time to the VoiceAttack user.
“The current time is now {TIME}”.
This value was put in the, 'Say Something with Text-To-Speech' action. When the action is
executed, VoiceAttack replaces the {TIME} tag with the local time (24-hour clock):
“The current time is thirteen hundred hours”.
A variation of the {TIME} token is {time} (notice the lower case). This token will be
rendered as a 12-hour clock, so, “The current time is now {time}” would be rendered as
“The current time is now one o'clock” when the action is executed.
Some tokens are a little bit more complicated (or flexible, depending on how you look at it)
and contain parameters. An example of this would be the {RANDOM:lowValue:highValue}
token. The purpose of this token is to generate a random number within a range.
Notice that this token has TWO parameters: lowValue and highValue to represent the lower
and upper boundaries of the range (I believe its first use was to roll virtual, 'dice'). Notice
also that the parameters are separated from the title (and other parameters) by colons. As
an example, let's say we want to generate a random number between 10 and 20. The
token would look like this: {RANDOM:10:20}.
Using Text-To-Speech, your action could use the following statement:
“I am generating a random number and it is {RANDOM:10:20}”.
When the action is executed, VoiceAttack will generate the random number and replace
the tag, so the result would be something like, “I am generating a random number and it is
16”.
There are some tokens that take a variable name as a parameter, such as
{TXT:variableName}. When VoiceAttack encounters a token that accepts variable names
as parameters, it replaces the tag with the value in that variable. In the case of
{TXT:variableName}, VoiceAttack will get a text variable's value. {INT:variableName} will
get an integer variable's value. {BOOL:variableName} will get a boolean variable's value
(and so on). Let's say you set up a text variable called, 'myText' to have a value of, 'Dave'.
The token you would use to get the value from 'myText' would be {TXT:myText}. You could
use the token in a Text-To-Speech statement such as this:
“I'm sorry, {TXT:myText}, I'm afraid I can't do that.” When the action is executed, the
rendered statement would be, “I'm sorry, Dave, I'm afraid I can't do that.” Then, if you set
'myText' to have a value of, 'Sally' and execute the statement again, the rendered
statement would be, “I'm sorry, Sally, I'm afraid I can't do that.”.
With version 1.6 of VoiceAttack and later, tokens can be, ‘nested’. That means you can
have tokens that accept the value of other tokens. Tokens are processed from the innermost token to the outer-most token, reprocessing with each iteration. Also, anything
contained within curly brackets { } that do not resolve to a token will be rendered as
whatever is contained within the brackets. To indicate a literal curly bracket, simply prefix
the curly bracket with a pipe symbol: |{ or |}.
Note that since tokens are reprocessed on each iteration (and although certain measures
are taken within VoiceAttack to prevent it), you can end up in an infinite loop and/or cause
VoiceAttack to crash, so use nested tokens with caution. If you are using an older
command and it is giving you problems, you can uncheck the option, ‘Use Nested Tokens’
on the options screen to see if that that helps out.
Note: VoiceAttack's tokens work even when there are multiple entries for random TTS
statements. Remember, tokens are case-sensitive... {Time} will not be processed
properly, but, {TIME} or {time} will work just fine.
Below is a haphazard list of tokens in no particular order (mostly in the order they were
created… lol… sorry, I will do better at some point):
{TIME} - The current time, expressed in a 24-hour clock.
{TIME:dateVariableName} - The indicated date variable's time, expressed in a 24-hour
clock.
{time} - The current time, expressed as a 12-hour clock.
{time:dateVariableName} - The indicated date variable's time, expressed as a 12-hour
clock.
{TIMEHOUR} - The hour of the current time, expressed in a 12-hour clock.
{TIMEHOUR:dateVariableName} - The hour of the indicated date variable's time,
expressed in a 12-hour clock.
{TIMEHOUR24} - The hour of the current time, expressed in a 24-hour clock.
{TIMEHOUR24:dateVariableName} - The hour of the indicated date variable's time,
expressed in a 24-hour clock.
{TIMEMINUTE} - The minute of the current time.
{TIMEMINUTE:dateVariableName} - The minute of the indicated date variable's time.
{TIMESECOND} - The second of the current time.
{TIMESECOND:dateVariableName} - The second of the indicated date variable's time.
{TIMEMILLISECOND} - The second of the current time.
{TIMEMILLISECOND:dateVariableName} - The second of the indicated date variable's
time.
{TIMEAMPM} - The AM/PM designation of the current time (or the proper designation of
AM/PM in the set culture).
{TIMEAMPM:dateVariableName} - The AM/PM designation of the indicated date
variable's time (or the proper designation of AM/PM in the set culture).
{DATE} - The current date, formatted as follows: 'April 3, 2015'.
{DATE:dateVariableName} - The indicated date variable, formatted as follows: 'April 3,
2015'.
{DATEYEAR} - The current year as a number (2015, 2016, 2017, etc).
{DATEYEAR:dateVariableName} - The indicated date variable's year as a number (2015,
2016, 2017, etc.).
{DATEDAY} - The current day of the month as a number.
{DATEDAY:dateVariableName} - The indicated date variable's day of the month as a
number.
{DATEMONTH} - The current month, spelled out ('April', 'May', 'June', etc.).
{DATEMONTH:dateVariableName} - The indicated date variable's month, spelled out
('April', 'May', 'June', etc.).
{DATEMONTHNUMERIC} - The current month as a number (April would be 4, May would
be 5, June would be 6, etc.).
{DATEMONTHNUMERIC:dateVariableName} - The indicated date variable's month as a
number (April would be 4, May would be 5, June would be 6, etc.).
{DATEDAYOFWEEK} - The current day of the week spelled out ('Monday', 'Tuesday',
'Wednesday', etc.).
{DATEDAYOFWEEK:dateVariableName} - The indicated date variable's day of the week
spelled out ('Monday', 'Tuesday', 'Wednesday', etc.).
{DATETICKS} – The current date as ticks. This will be a numeric value expressed as text
that can be used for comparison.
{DATETICKS:dateVariableName} – The indicated date variable as ticks. This will be a
numeric value expressed as text that can be used for comparison.
{CMD} - The name of the currently-executing command.
{CMDSEGMENT:segment} – If your command contains, ‘dynamic command sections’
(see, ‘Dynamic Command Sections’ in the, ‘Command Screen’ documentation above), you
can retrieve specific portions of the spoken command, indicated by its numeric position.
This will allow you to make more precise decisions based on what was spoken.
For instance, let’s say you have a complex dynamic command that you use to build several
kinds of items like this:
‘build [1..10][bulldogs;wolves;strikers][please;]’
Then, you say, ‘build 5 bulldogs’ to execute that command. To find out what was built, you
can check {CMDSEGMENT:2} (note that the specified, ‘segment’ is zero-based. So, the
first segment is 0. The second is 1, and so on). The rendered value will be, ‘bulldogs’.
Then, you can find out how many items to build by checking {CMDSEGMENT:1}. The
rendered value will be, ‘5’ (which you can convert and use in a loop, for instance). For
bonus points, you can check {CMDSEGMENT:3} and see if, ‘please’ was spoken and then
thank the user for being so polite (or chide them if they didn’t say, ‘please’) ;)
{CMDACTION} - The method by which the current command was executed. The possible
results are, 'Spoken', 'Keyboard', 'Joystick', 'Mouse', 'Profile', 'External', 'Unrecognized' and
'Other'. The value will be, 'Spoken' if the command was executed by a spoken phrase,
'Keyboard' if the command was executed using a keyboard shortcut, 'Joystick' if executed
by a joystick button, 'Mouse' if executed by a mouse button click and 'Profile' if the
command was executed on profile load (from the command indicated in the profile options
screen). The value will be 'External' if the command is executed from a command line.
'Unrecognized' will be the value if the command was executed using the unrecognized
phrase catch-all command in the profile options screen. 'Other' is reserved.
{CMD_BEFORE} - When using wildcards in spoken phrases, this is the text that occurs
before the wildcard phrase. For example, if using, '*rocket*' as your wildcard phrase and
you say, 'i am going for a ride in my rocket ship' {CMD_BEFORE} will contain, 'i am going
for a ride in my' and {CMD_AFTER} will contain 'ship'. This token does not have to be set
prior to using.
{CMD_AFTER} - When using wildcards in spoken phrases, this is the text that occurs
after the wildcard phrase.
{CMDCONFIDENCE} - This token provides the confidence level that the speech engine
provides when the speech engine detects speech. The value range for a spoken
command is from “0” to “100”. This value will always be, “0” when a command is not
executed as a spoken command (use the, ‘{CMDACTION}’ token to check how the
command was executed). Note this value is accessible from within the specified
unrecognized catch-all command.
{CMDMINCONFIDENCE} - This token provides the minimum confidence level set by the
user as it applies to the executing command. The value range is “0” to “100”. This value
will be, “0” if the minimum confidence level is not set. Note that this token can return a
value even if the command is not spoken.
{LASTSPOKENCMD} - This provides the last-spoken command phrase. Useful from
within sub-commands where you need to know what was said to invoke the root command,
or if you need to know what was spoken prior to the current command (if the current
command was not spoken (executed by keyboard, mouse, joystick, external, etc.).
{CMDISSUBCOMMAND} - This token will render as ‘1’ if the currently-executing command
is executing as a subcommand (a command that is executed by another command). The
rendered value will be, ‘0’ if the command is not a subcommand.
{CMDCOUNT} - This token provides the count of top-level commands (commands that are
not subcommands) that have executed since VoiceAttack had launched.
{CMDWHENISAY} - This token provides the full value of what is indicated in the, ‘When I
Say’ input box on the command screen.
{ISLISTENINGOVERRIDE} - If the executing command was invoked by a listening
override keyword (for instance, if you executed the command by saying, 'Computer, Open
Door' instead of, 'Open Door') the result will be, '1'. Otherwise, the result will be, '0'.
{ISCOMPOSITE} - If an executing command is composite (where there is a prefix and a
suffix), the return of this token will be, '1'. Otherwise, it will be, '0'.
{PREFIX} - If an executing command is composite (where there is a prefix and a suffix),
this token will be replaced with the prefix portion of the command. If called in a noncomposite command, this will result in a blank string.
{SUFFIX} - If an executing command is composite (where there is a prefix and a suffix),
this token will be replaced with the suffix portion of the command. If called in a noncomposite command, this will result in a blank string.
{COMPOSITEGROUP} - If an executing command is composite (where there is a prefix
and a suffix), this token will return the group value if it is being used.
{CATEGORY} - This returns the category of the executing command. If this token is used
on a composite command (a command using a prefix and suffix), the result will be the
category of the prefix and the category of the suffix separated by a space. For the
individual parts of a composite category, see, ‘{PREFIX_CATEGORY}' and
'{SUFFIX_CATEGORY}'.
{PREFIX_CATEGORY} - This returns the prefix category of the executing command (if the
executing command is a composite command).
{SUFFIX_CATEGORY} - This returns the suffix category of the executing command (if the
executing command is a composite command).
{PROFILE} - The name of the currently-loaded profile.
{RANDOM:lowValue:highValue} - A random number between a low number and a high
number (inclusive) will be generated. For example, {RANDOM:1:100} will pick a number
between 1 and 100. {RANDOM:77:199} will pick a number between 77 and 199.
***Important Note: Conditions have been renamed to Small Integer. The token
{SMALL:variableName} (see below) has been created to handle small integer variables.
The {COND:conditionName} and {CONDFORMAT:conditionName} have been left in for
backward compatibility (you can use either token interchangeably, since they both access
the same values).
{SMALL:variableName } - The numeric value stored in a small integer variable will be
retrieved. For example, if you have a variable called, 'My Small Int', you would use,
{SMALL:My Small Int}. Note that with this token, everything to the left of the colon is casesensitive. Everything to the right is not ({SMALL:mY sMaLL InT} would work the same way
;)) The referenced variable must be set prior to using, otherwise the value will be, 'NOT
SET' when accessed. NOTE: The comma formatting of this token has been removed.
See, '{SMALLFORMAT}' token, below).
{Small:variableName:defaultValue} - The small integer value stored in a small.l integer
variable will be retrieved (just like above), but, if the value results in, 'Not Set', the value in
the, 'defaultValue' parameter will be used. This referenced variable does not have to be set
prior to using (since the default value will be used instead).
{SMALLFORMAT:variableName } - This returns the same value as {SMALL}, but the
value is formatted with commas (for TTS). This used to be the default behavior of
{SMALL}, but, since the introduction of the {EXP} token, this token had to be created.
{SMALLFORMAT:variableName:defaultValue} - This returns the same value as
{SMALLFORMAT}, except if the variable is, ‘NOT SET’, the value indicated as the default
will be used.
{INT:variableName} - The numeric value stored in an integer variable will be retrieved.
For example, if you have a variable called, 'My Int', you would use, {INT:My Int}. Note that
with this token, everything to the left of the colon is case-sensitive. Everything to the right
is not ({INT:mY InT} would work the same way ;)) The referenced variable must be set
prior to using, otherwise the value will be, 'NOT SET' when accessed. NOTE: The comma
formatting of this token has been removed. See, '{INTFORMAT}' token, below).
{INT:variableName:defaultValue} - The integer value stored in an integer variable will be
retrieved (just like above), but, if the value results in, 'Not Set', the value in the,
'defaultValue' parameter will be used. This referenced variable does not have to be set
prior to using (since the default value will be used instead).
{INTFORMAT:variableName} - This returns the same value as {INT}, but the value is
formatted with commas (for TTS). This used to be the default behavior of {INT}, but,
since the introduction of the {EXP} token, this token had to be created.
{INTFORMAT:variableName:defaultValue} - This returns the same value as
{INTFORMAT}, except if the variable is, ‘NOT SET’, the value indicated as the default will
be used.
{DEC:variableName} - The numeric value stored in a decimal variable will be retrieved.
For example, if you have a variable called, 'My Decimal', you would use,
{DEC:My Decimal}. Note that with this token, everything to the left of the colon is casesensitive. Everything to the right is not ({DEC:mY DeCImal} would work the same way ;))
The referenced variable must be set prior to using, otherwise the value will be, 'NOT SET'
when accessed.
{DEC:variableName:defaultValue} - The decimal value stored in a decimal variable will
be retrieved (just like above), but, if the value results in, 'Not Set', the value in the,
'defaultValue' parameter will be used. This referenced variable does not have to be set
prior to using (since the default value will be used instead).
{BOOL:variableName} - The text representation of the boolean value will be retrieved. If
the variable value is true, the token will be replaced with, 'True'. If false, the token will be
replaced with, 'False'. The referenced variable must be set prior to using, otherwise the
value will be, 'NOT SET' when accessed.
{BOOL:variableName:defaultValue} - The Boolean (true/false) value stored in a Boolean
variable will be retrieved (just like above), but, if the value results in, 'Not Set', the value in
the, 'defaultValue' parameter will be used. This referenced variable does not have to be set
prior to using (since the default value will be used instead).
{TXT:variableName} - The text value stored in a text variable will be retrieved. This works
the same way as all the other types (above), except that... well... you get the idea. The
variable referenced by this token must be set prior to using, otherwise the value will be,
'NOT SET' when accessed.
{TXT:variableName:defaultValue} - The text value stored in a text variable will be
retrieved (just like above), but, if the value results in, 'Not Set', the text in the, 'defaultValue'
parameter will be used. This referenced variable does not have to be set prior to using
(since the default value will be used instead).
{TXTURL:variableName} - The text value stored in a text variable will be retrieved (again,
just like above), but the result will be URL encoded.
{TXTRANDOM:value} - This token will do a simple randomize of its text contents. For
example, a token could be used in TTS to say, 'I love {TXTRANDOM:food;animals;jewelry}'
and the result would be, 'I love animals' or, 'I love food' or, 'I love jewelry'. Note that the,
'value' portion can be another token, however, if you want to randomize randomized
tokens, it is suggested that you use text value variables to store the values, otherwise it
may get a little out of sorts. Experiment with this one, since the permutations for testing
are a little out there :)
{TXTLEN:variableName / value} - This will return the length of the text variable's value.
This token can also evaluate a literal text value or token, if the literal text or token is
contained between double quotes. For example, if text variable, ‘myTextVariable’ is set
to, ‘weapons’, {TXTLEN:myTextVariable} will evaluate to “7”.
{TXTLEN:”{TXT:myTextVariable}”} will also evaluate to “7”. {TXTLEN:”apple pie”} will
evaluate to “9”.
{TXTUPPER:variableName / value} - This will return the text variable's value in upper
case. This token can also render a literal text value or token, if the literal text or token is
contained between double quotes. For example, if text variable, ‘myTextUpper’ is set to,
‘citadel’, {TXTUPPER:myTextUpper} will render as “CITADEL”.
{TXTUPPER:”{TXT:myTextUpper}”} will also render as, “CITADEL”. {TXTUPPER:”apple
pie”} will render as, “APPLE PIE”.
{TXTLOWER:variableName / value} - This will return the text variable's value in lower
case. This token can also render a literal text value or token, if the literal text or token is
contained between double quotes. For example, if text variable, ‘myTextLower’ is set to,
‘TeXaS’, {TXTLOWER:myTextLower} will render as “texas”.
{TXTLOWER:”{TXT:myTextLower}”} will also render as, “texas”. {TXTLOWER:”PECAN
PIE”} will render as, “pecan pie”.
{TXTTRIM:variableName / value} - This will return the text variable's value with spaces
removed from the beginning and end. This token can also process a literal text value or
token, if the literal text or token is contained between double quotes. For example, if text
variable, ‘myTextTrim’ is set to, ‘ Parachute ’, {TXTTRIM:myTextTrim} will return as
“Parachute”. {TXTTRIM:”{TXT:myTextTrim}”} will also return as, “Parachute”.
{TXTTRIM:”Yellow Submarine
”} will return as, “Yellow Submarine”.
{TXTREPLACEVAR:variableSource / value:variableFrom / value:variableTo / value} This will return the text variable's value with the text indicated in variableFrom as the value
in variableTo. For example: Variable, 'myVariable' value set to, 'This is a test'. Variable,
‘mySearch’ value set to, ‘test’ and variable, ‘myReplacement’ value set to, ‘monkey’.
{TXTREPLACEVAR:myVariable:mySearch:myReplacement} renders as, ‘This is a
monkey’. This token can also process a literal text value or token for each parameter, if
each literal text or token is contained between double quotes. For example,
{TXTREPLACEVAR:myVariable:”test”:”monkey”} will also render as, “This is a monkey”.
{TXTNUM:variableName / value} - This will attempt to remove all characters except
numeric (0-9, ., -). This token can also render a literal text value or token, if the literal text
or token is contained between double quotes. For example, if text variable, ‘myTextNum’
is set to, ‘8675309 Jenny’, {TXTNUM:myTextNum} will return as “8675309”.
{TXTNUM:”{TXT:myTextNum}”} will also render as, “8675309”. {TXTNUM:”Brick, 08724”}
will render as, “08724”.
{TXTALPHA:variableName / value} - This will attempt to remove all numeric characters
(0-9). This token can also render a literal text value or token, if the literal text or token is
contained between double quotes. For example, if text variable, ‘myTextAlpha’ is set to,
‘8675309 Jenny’, {TXTNUM:myTextAlpha} will return as “ Jenny”.
{TXTALPHA:”{TXT:myTextNum}”} will also render as, “ Jenny”. {TXTALPHA:”Brick, 08724”}
will render as, “Brick, ”.
{TXTTITLE:variableName / value} - This will attempt to title case the value (for supported
locales). For example, 'war and peace' becomes, 'War And Peace'. Yes… I know that's
not proper title case (at least in English), but it's as close as the framework will allow
without linguistic rules. Sorry!
This token can also render a literal text value or token, if the literal text or token is
contained between double quotes. For example, if text variable, ‘myTextTitle’ is set to,
‘napoleon dynamite’, {TXTTITLE:myTextTitle} will return as “Napoleon Dynamite”.
{TXTTITLE:”{TXT:myTextTitle}”} will also render as, “Napoleon Dynamite”.
{TXTTITLE:”nacho libre”} will render as, “Nacho Libre”.
{TXTCONCAT:variableName1 / value:variableName2 / value} - This will attempt to
concatenate the text in variable 2 to the text of variable 1. For instance, let's say var1 is
set to “Good” and var2 is set to “ Morning” (note the space). {TXTCONCAT:var1:var2} will
yield, “Good Morning”. If variable 1 or variable 2 are “Not set”, the result will be, “Not set”.
This token can also render a literal text value or token for either parameter, if the literal text
or token is contained between double quotes. For example, if text variable,
‘myTextConcat’ is set to, ‘Good’, {TXTCONCAT:myTextConcat, “ Morning”} will return as “
Good Morning”. {TXTCONCAT:”Good” : “ Morning”} will also render as, “Good Morning”.
{TXTSUBSTR:textVariableOf / text value : intVariableBegin / int value :
intVariableLength / int value} - this will return a portion (substring) of the text provided in
textVariableOf, starting at intVariableBegin with a length of intVariableLength. This token
uses three parameters that may contain variables, literal values or tokens. If variables are
used in any position, the variables MUST BE SET prior to using. The value indicated for
the beginning of the substring (second parameter, intVariableBegin) is zero-based. That
means, if you want to retrieve the substring at the beginning of the provided text
(txtVariableOf), set the beginning to zero. If the value of intVariableBegin resolves to, ‘Not
Set’, zero will be assumed. To indicate the length of the substring, provide the length in the
third parameter (intVariableLength variable). If the value in the third parameter resolves to,
‘Not Set’ or if the value in the third parameter ends up past the end of the provided text, the
end of the provided text is assumed. If either the value of intVariableBegin or
intVariableLength is less than zero, the result will be an empty (blank) string.
{TXTSUBSTR:”We are the Champions”:11:9} will render as, ‘Champions’ (note that,
‘Champions’ starts at position 12, but since the beginning position is zero-based, the value
is 11).
{TXTPOS:textVariableOf / text value : textVariableIn / text value : intVariableStart / int
value} - this will return the position of text (txtVariableOf) within more text (txtVarIn) starting
at a given point (intVarStart). This uses three parameters that may contain variables, literal
values or tokens. If variables are used in any position, the variables MUST BE SET prior
to using. The text search is case-sensitive. If the text is found, the result will be the zerobased index of the start of the text. Otherwise, if the text is not found the result will be “-1”.
For example (using ALL VARIABLES), if you are wanting to find the word, 'active' in the
phrase, 'all systems active' you will first need to set a text variable to the word, 'active'. In
this example, that variable is called, 'txtFindActive'. Next, you will need to set a second text
variable to the phrase, 'all systems active'. That variable is called, 'txtStatus'. Next, you
will need to set a variable to indicate the position where you would like to start searching.
Since you would like to search the entire phrase, you will need to set this variable to zero.
So, a third variable, 'intPosition' needs to be set to zero (see note on this below). You will
then use this token with the three variables like this:
{TXTPOS:txtFindActive:txtStatus:intPosition}. The result will be “12”, as the position of
'active' appears in position 12 (the phrase actually starts at the 13th character, but we are
using a zero-based positioning system).
Note: if txtVarIn or txtVar of are not set, the result will be, '-1'. If intVarStart is not set, 0 is
assumed (for convenience).
Another example, using variables AND literal values based on the example above, you can
create a statement that does the same thing: {TXTPOS:”active”:txtStatus:5}. This will
search for the word, ‘active’ starting at position 5 (it still returns, “12”). Note that double
quotes are required if you are using literal text in the first and second parameters (and not
required for the last parameter).
{TXTLASTPOS:textVariableOf / text value : textVariableIn / text value}
and
{TXTLASTPOS:textVariableOf / text value : textVariableIn / text value :
intVariableStart / int value} - this will return the last position of text (txtVariableOf) within
more text (txtVarIn) starting at a given point (intVarStart). This uses three parameters that
may contain variables, literal values or tokens. If variables are used in any position, the
variables MUST BE SET prior to using. The text search is case-sensitive. If the text is
found, the result will be the zero-based index of the start of the text. Otherwise, if the text
is not found the result will be “-1”. One thing you will need to understand about this token
is that, unlike {TXTPOS:}, the start position is from the end of the text to the beginning. So,
the search will begin at the length of the text and move to zero. For example,
{TXTLASTPOS:”abc”, “123abc”:0} will return “-1” because the search begins and ends at 0
(the beginning). {TXTLASTPOS:”abc”, “abc123abc”:9} will return “6” because the search
begins at 9 (the end of the text) and moves left. Note that start positions that are beyond
the length of the search string will be adjusted to the length of the search string.
Note that there are two variations of this token. One with a numeric start position and one
without. If you use the option without a start position, the end of the text is assumed.
{TXTLASTPOS:”abc”, “abc123abc”} will again return “6”.
For brevity, the variable usage examples for this token are the same as they are for
{TXTPOS:}, only that the search begins at the end of the search string instead of the start.
{ACTIVEWINDOWTITLE} - Returns the active window's title text.
{ACTIVEWINDOWPROCESSNAME} - Returns the active window's process name (the
one you see in Task Manager).
{ACTIVEWINDOWPROCESSID} - Returns the active window's process id (the one you
see in Task Manager details).
{ACTIVEWINDOWWIDTH} - Returns the active window's width. Helps with
resizing/moving.
{ACTIVEWINDOWHEIGHT} - Returns the active window's height. Helps with
resizing/moving.
{ACTIVEWINDOWTOP} - Returns the active window's top (Y coordinate). Helps with
resizing/moving.
{ACTIVEWINDOWLEFT} - Returns the active window's left (X coordinate). Helps with
resizing/moving.
{ACTIVEWINDOWRIGHT} - Returns the active window's right (left + width). Helps with
resizing/moving.
{ACTIVEWINDOWBOTTOM} - Returns the active window's bottom (top + height). Helps
with resizing/moving.
{WINDOWEXISTS:textVariable} – Returns “1” if a window with the title specified in
textVariable exists. Returns “0” if not. Note that this can take wildcards (*) for window titles
that change. For instance, if textVariable contains '*notepad*' (without quotes), the search
will look for a window that has a title that contains 'notepad'.
{WINDOWCOUNT:textVariable} – Returns “1” or more if windows with the title specified in
textVariable exist. Returns “0” if there are none. Note that this can take wildcards (*) for
window titles that change. For instance, if textVariable contains '*notepad*' (without
quotes), the search will look for windows that have a title that contains 'notepad'.
{WINDOWTITLEUNDERMOUSE} – Returns the title for the window that is currently
located under the mouse.
{WINDOWPROCESSUNDERMOUSE} – Returns the process name for the window that is
currently located under the mouse.
{MOUSESCREENX} - Returns the X coordinate of the mouse position as it relates to the
screen. Zero would be the top-left corner of the screen.
{MOUSESCREENY} - Returns the Y coordinate of the mouse position as it relates to the
screen. Zero would be the top-left corner of the screen.
{MOUSEWINDOWX} - Returns the X coordinate of the mouse position as it relates to the
active window. Zero would be the top-left corner of the window.
{MOUSEWINDOWY} - Returns the Y coordinate of the mouse position as it relates to the
active window. Zero would be the top-left corner of the window.
{CAPSLOCKON} - Returns “1” if the caps lock key is locked. Returns “0” if not.
{NUMLOCKON} - Returns “1” if the numlock key is locked. Returns “0” if not.
{SCROLLLOCKON} - Returns “1” if the scroll lock key is locked. Returns “0” if not.
{CLIP} - This token will be replaced by whatever is in the Windows clipboard, as long as
what is in the clipboard is a text value. Note: This value can also be set within VoiceAttack
by using the 'Set a text value to the Windows clipboard' action.
{DICTATION} - This token will be replaced by whatever is in the dictation buffer, without
any formatting. So, if you said, 'This is a test of the emergency broadcast system' and then
later said 'this is only a test', the result would be 'This is a test of the emergency broadcast
system this is only a test'.
{DICTATIONON} - This token returns “1” if dictation mode is on, and “0” if it is off.
{DICTATION:options} - This token is an attempt to offer some basic touch up to whatever
is in the dictation buffer. The speech recognition engine may do all kinds of heinous things
to your text (as you will see... lol ;)) First, let’s talk about the options. The option examples
below will be used with as if your dictation buffer was filled first by saying 'This is a test of
the emergency broadcast system' and then later saying 'this is only a test'.
The options are:
PERIOD - This puts a period in for you at the end of each line (so you don’t have to
constantly say, 'period' to the speech engine). The rendered output would be:
'This is a test of the emergency broadcast system. this is only a test.'.
CAPITAL - Capitalizes the first character of every line (since the speech engine may or
may not do it for you... o_O). The rendered output would be:
'This is a test of the emergency broadcast system This is only a test'.
LATEST - Only display the last thing you said. In the example, you would get 'this is only a
test'.
UPPERCASE - Converts all characters to upper case:
'THIS IS A TEST OF THE EMERGENCY BROADCAST SYSTEM THIS IS ONLY A TEST'
LOWERCASE - Converts all characters to lower case:
'this is a test of the emergency broadcast system this is only a test'
NEWLINE - Makes sure each phrase is on its own line (note that it won’t show up this way
if you write to the log... the log doesn't care about new lines). Rendered output would be:
'This is a test of the emergency broadcast system
this is only a test.'.
SPACEX - Replace the, 'X' with an integer number, and that many extra spaces will be
placed at the end of each phrase. The default is one space. So, if you use
{DICTATION:SPACE4}, the rendered output will be
'this is a test of the emergency broadcast system this is only a test'.
You can use any or all of the options, in any order, separated by a colon. They are not
case-sensitive. So, if you simply wanted to add a period to the end of each spoken
dictation phrase and ensure that the first character is always capitalized, you would use
{DICTATION:PERIOD:CAPITAL}. The above example would be rendered as:
'This is a test of the emergency broadcast system. This is only a test.'.
If you wanted to also make it so that a line feed is placed between lines,
you can use {DICTATION:PERIOD:CAPITAL:NEWLINE}. You will then get:
'This is a test of the emergency broadcast system.
This is only a test.'.
{EXP:expression} - Currently experimental, the expression token will evaluate a typed-out
expression (parenthesis and all, for order of operation) and return the value as text.
Comparison expressions can be used on both text and numeric values (including numeric
variables such as Integer, Small Integer and Decimal). Arithmetic expressions can be
performed on numeric values. Values intended to be used for numeric variables can then
be converted using their various, 'Convert Text/Token' option in each of the set value
screens (for use in condition blocks (note that the result values can be decimal values
when dividing). There are several ways to use expressions as outlined below.
Evaluating Arithmetic Expressions
The expression token can be used to evaluate arithmetic expressions like so:
{EXP: ((5 + 5) - 2) * 10} (evaluates to, '80')
Accepted arithmetic operators: +, -, * (multiplication), / (division), % (modulus).
This token also accepts tokens to be evaluated. So, if you have a text value myText1 and
it is set to '100' and an integer variable myInt1 that is 200, you can have a mixed
expression of, {EXP:({TXT:myText1} + {INT:myInt1}) * 2} that results in '600'.
Numeric Comparisons
You can do numeric comparisons using expressions as well:
{EXP: {TXT:myText1} = {INT:myInt1} } (evaluates to, '0' (false))
Comparison expressions return either '1' for true, or '0' for false.
Accepted comparison operators: =, <, >, <= (less than or equal), >= (greater than or equal),
<> (not equal).
You may also use, 'And', 'Or', 'Not':
{EXP: ('cat' = 'dog') And Not (20 = 30) } (evaluates to, '0' (false))
{EXP: ('cat' = 'dog') Or (20 = 30) } (evaluates to, '0' (false))
{EXP: Not ('cat' = 'dog') } (evaluates to, '1' (true))
Evaluating Text Comparisons
The expression token can evaluate text.
{EXP: 'all your base are belong to us' = 'hello'} (evaluates to, '0' (false)).
{EXP: 'all your base are belong to us' <> 'hello'} (evaluates to, '1' (true)).
Just like numeric comparisons, comparison expressions return either '1' for true, or '0' for
false.
Note that you have to enclose the text in single quotes (the quotes even need to be around
tokens if the token value itself does not have quotes). If the text contains single quotes,
they need to be doubled up to be used in expression tokens:
{EXP:'catcher''s mitt' = 'pitcher''s mitt'}
Text comparisons are not case sensitive.
Accepted comparison operators: =, <, >, <= (less than or equal), >= (greater than or equal),
<> (not equal). You may also use, 'And', 'Or', 'Not'.
You can use, 'LIKE' as part of your text comparison expressions. The text that you are
comparing to needs to have asterisks in various places in order to indicate the type of
comparison to make (wildcards).
Asterisks around the text indicate, 'contains':
{EXP: 'rocket ship' LIKE '*rocket*'} (evaluates to '1' (true) because the text contains,
'rocket')
Asterisks at the end indicate, 'starts with' :
{EXP: 'rocket ship' LIKE 'ship*'} (evaluates to '0' (false), since the text does not start with,
'ship')
Asterisks at the beginning indicate, 'ends with':
{EXP: 'rocket ship' LIKE '*ship'} (evaluates to '1' (true), since the text ends with 'ship')
No asterisks indicate exact match (just like using, '=').
Other Expression Abilities
You can concatenate text by using, '+':
{EXP: 'welcome' + ' ' + 'captain' } evaluates to 'welcome captain'.
You can use, 'TRIM', 'SUBSTRING', 'LEN' and, 'IIF' (immediate, 'if')).
TRIM removes any blank spaces around text:
{EXP: TRIM(' my trimmed text ') } evaluates to 'my trimmed text'
SUBSTRING(start position, length) gets just the portion of the text you are wanting:
{EXP: SUBSTRING('let the good times roll', 9, 4) } evaluates to, 'good'.
Note that the start is 1-based (not zero-based).
LEN gives the length of the text:
{EXP: LEN('let the good times roll') } evaluates to 23.
IIF(expression, true part, false part) allows you to evaluate an expression and get one of
two values depending on the result:
{EXP: IIF('cat' = 'dog', 10, 20) } evaluates to, '20'
{EXP: IIF('cat' <> 'dog', 10, 20) } evaluates to, '10'
myCondition1 is 100 and myCondition2 is 200 :
{EXP: IIF({INT:myInt1} > {INT:myInt2}, 'Blue', 'Green') } evaluates to, 'Green'.
VoiceAttack State Tokens
State tokens will allow you to test various conditions that are occurring within VoiceAttack.
These can be handy by allowing you to modify the flow of your command actions based on
the state of your devices. For instance, you can check (with a conditional (if) statement) if
the right mouse button is down when I say, 'fire weapons', missiles are fired instead of
photons (lol). Also, if the 'x' button is down, fire both photons and missiles. You can also
monitor the position of your sliders or X, Y and Z positions of the joystick itself to create
some interesting, 'triggers' using loops and conditional (if) statements.
{STATE_KEYSTATE:key} - This token checks to see if a particular key is pressed down or
not. The, 'key' parameter can be any key you can type in a token: 'A', 'B', 'C', 'ß', 'ö', 'ñ', 'ç',
as well as keys you can't type in a token: ENTER, TAB, LCTRL, ARROWR (see section
later in this document titled, 'Key State Token Parameter Values' for the full list).
So, if you want to test to see if the F10 key is down, just use the following token:
{STATE_KEYSTATE:F10}. To test for the letter 'A', just use this token:
{STATE_KEYSTATE:A}. If a keyboard key is down, the replaced value of the token will be
"1". If the key is not down, the value will be "0".
{STATE_LEFTMOUSEBUTTON}
{STATE_RIGHTMOUSEBUTTON}
{STATE_MIDDLEMOUSEBUTTON}
{STATE_FORWARDMOUSEBUTTON}
{STATE_BACKMOUSEBUTTON} - Each of these tokens test to see if a mouse button is
being pressed. If you want to test for the right mouse button, use token
{STATE_RIGHTMOUSEBUTTON}. If the mouse button is pressed down, the replaced
value will be "1". If the mouse button is not pressed, the value will be "0".
{STATE_MOUSESHORTCUTS} - this token tests to see if VoiceAttack's mouse button
shortcuts are enabled. If they are enabled, the replaced value will be "1". Otherwise, the
replaced value will be "0".
{STATE_AUDIOLEVEL} - This token indicates the currently reported audio level from the
speech engine. The replaced value will be from “0” to “100”.
{STATE_LISTENING} - this token tests to see if VoiceAttack is, 'listening'. If, 'listening' is
on, the replaced value will be "1". If, 'listening' is off, the replaced value will be "0".
{STATE_SHORTCUTS} - this token tests to see if VoiceAttack's shortcuts are enabled. If
shortcuts are enabled, the replaced value will be "1". Otherwise, the replaced value will be
"0".
{STATE_CPU:coreNumber}
{STATE_CPU} - these will return your cpu usage. {STATE_CPU} will return the average
for all cores. The value returned will be from “0” to “100”. {STATE_CPU:coreNumber} will
allow you to specify a particular core. For instance, {STATE_CPU:5} will get the cpu usage
for core 5.
{STATE_RAMTOTAL} - this will return the total RAM on your system in bytes.
{STATE_RAMAVAILABLE} - this will return the available RAM on your system in bytes.
{STATE_FILEEXISTS:textVariable} - this will return “1” if the file indicated in the text
variable exists, or “0” if it does not.
{STATE_DIRECTORYEXISTS:textVariable} - this will return “1” if the directory indicated in
the text variable exists, or “0” if it does not.
{STATE_AUDIOCOUNT} - This returns the number of all currently-playing audio files. If
legacy mode is on this value will always be, “0”.
{STATE_AUDIOCOUNT: variableName / value } - This returns the number of currentlyplaying instances of an audio file with a given file path. The parameter can be a text
variable name (without quotes: {STATE_AUDIOCOUNT:mySoundVariable}, or it can be a
token or a literal if contained within double quotes:
{STATE_AUDIOCOUNT:"{TXT:someTextVariable}"} or
{STATE_AUDIOCOUNT:"C:\Sounds\Robot.wav"}.
Notes: Since sounds run asynchronously in VoiceAttack, there is a slight chance that if you
use this token IMMEDIATELY after executing a ‘Play Sound’ action the file may not yet
have had a chance to queue or load up and will not be included in the count. This is
technically correct, but may not be a proper count depending on what you are trying to
accomplish.
This token will allow you to put a literal in that contains colons (for file paths). Use with
caution (or use variables/tokens).
If legacy mode is on this value will always be, “0”.
{STATE_AUDIOPOS: variableName / value } - This returns the position of currentlyplaying audio file with a given file path, expressed as seconds. The parameter can be a
text variable name (without quotes: {STATE_AUDIOPOS:mySoundVariable}, or it can be a
token or a literal if contained within double quotes: {STATE_AUDIOPOS:"{TXT:someText}"}
or {STATE_AUDIOPOS:"C:\Sounds\TargetEwoks.wav"}.
Notes: Since sounds run asynchronously in VoiceAttack, there is a slight chance that if you
use this token IMMEDIATELY after executing a ‘Play Sound’ action the file may not yet
have had a chance to queue or load up and will return a position of “0”. This is technically
correct, but may not be a proper value depending on what you are trying to accomplish.
Since you can run multiple instances of a sound file at once, if there is more than one
instance currently playing, the rendered value will be, “0” (assumptions cannot be made on
which instance to be chosen). To help with this, check the
{STATE_AUDIOCOUNT:variable} token outlined above prior to using the
{STATE_AUDIOPOS} token.
If no instances of the indicated file are currently playing, “0” will be returned.
This token will allow you to put a literal in that contains colons (for file paths). Use with
caution (or use variables/tokens).
If legacy mode is on this value will always be, “0”.
{STATE_DEFAULTPLAYBACK} - This returns the device name of the default audio
playback device as indicated by Windows. Note that there is a very minor memory leak
when accessing the multimedia device property store, so this will be reflected in
VoiceAttack (using this token sparingly will not present a problem… running it over and
over in a loop will chew up memory… the search for a better way continues).
{STATE_DEFAULTRECORDING} - This works just like {STATE_DEFAULTPLAYBACK},
except the default recording device name will be returned.
{STATE_SYSVOL} - This returns the system volume (default playback device) rendered as
a value from “0” to “100”.
{STATE_MICVOL} - This returns the microphone volume (default recording device)
rendered as a value from “0” to “100”.
{STATE_APPVOL: variableName / value} - This renders a value between “0” and “100”
based on the indicated app volume as it relates to the System Volume Mixer. If the volume
cannot be accessed (app closed for instance), a value of "-1" will be returned. The
parameter for this token should be the window title, process name or window class name of
the target application (see “Set Audio Level” section of the, “Other Stuff” screen for more
information on targeting the application). The parameter can be a text variable name
(without quotes: {STATE_APPVOL:myTextVariable}, or it can be a token or a literal if
contained within double quotes: {STATE_APPVOL:"*windows media*"} or
{STATE_APPVOL:"{TXT:myTextVariable}"}.
{STATE_VA_VERSION} - Displays the full VoiceAttack version: “1.5.12.15”.
{STATE_VA_VERSION_MAJOR} - Displays the version major component: “1”.
{STATE_VA_VERSION_MINOR} - Minor component: “5”.
{STATE_VA_VERSION_BUILD} - Build component: “12”.
{STATE_VA_VERSION_REVISION} - Revision component: “15”.
{STATE_VA_VERSION_ISRELEASE} - Returns “1” if the version is a release version. “0”
if it is not (beta release).
{STATE_VA_VERSION_COMPARE:textVariable} - Returns “1” if the VoiceAttack version
number is greater than or equal to the version number indicated in the text variable.
“0” if the indicated version is earlier than the VoiceAttack version number.
{STATE_VA_PLUGINSENABLED} - Returns “1” if plugin support is enabled. “0” if not.
Joystick State Token Reference
This section is for the joystick state tokens. Everything below the buttons and POV are
lifted directly from DirectX states. Each state value may or may not be available for your
device, so, your mileage may vary.
{STATE_JOYSTICKBUTTONS} - this token tests to see if VoiceAttack's joystick buttons
are enabled. If joystick buttons are enabled, the replaced value will be "1". Otherwise, the
replaced value will be "0".
{STATE_JOYSTICK1BUTTON:buttonNumber}
{STATE_JOYSTICK2BUTTON:buttonNumber} - these two tokens test to see if particular
joystick's button is down or not. The, 'buttonNumber' parameter is the number of the button
on the desired stick. To test if button 10 is down on joystick 2, just use this token:
{STATE_JOYSTICK2BUTTON:10}. Once again, if the button is down on the tested
stick, the replaced value will be "1". If the button is not down, the value will be "0".
Point of View (Hat) Controllers – (Note: there are up to 4 available POV controllers per
stick)
{STATE_JOYSTICK1POVENABLED}
{STATE_JOYSTICK2POVENABLED} - this token indicates whether or not POV is enabled
for the indicated stick. If enabled the replaced value will be “1”. Otherwise, the replaced
value will be “0”.
{STATE_JOYSTICKXPOVYTYPE} - Use this token to find out how the POV is being used
by VoiceAttack (as indicated in the joystick options on the options page). X indicates the
stick number (1 or 2) and Y indicates the POV controller (1-4). So, to get the POV type for
the second POV controller on stick 1, use: {STATE_JOYSTICK1POV2TYPE}. The
replaced value will be one of the following:
“-1” - POV not available.
“0” - POV available, not turned on in settings.
“1” - POV acts as on/off switch (any direction will cause the POV to indicate as switched.
“2” - POV acts as two-directional switch (up or down).
“3” - POV acts as two-directional switch (left or right).
“4” - POV acts as four-directional switch (up, down, left, right).
“8” - POV acts as eight-directional switch (up, up right, right, down right, down, down left,
left, up left).
{STATE_JOYSTICKXPOVY} - This token is used to get the direction pressed by the POV
controller. X indicates the stick (1 or 2). Y indicates the POV controller (1-4). So, to get the
position value for stick 1, POV controller 2, use: {STATE_JOYSTICK1POV2}.
The replaced value will be “CENTER”, “UP”, “UPRIGHT”, “RIGHT”, “DOWNRIGHT”,
“DOWN”, “DOWNLEFT”, “LEFT”, “UPLEFT” depending on the direction pushed, or, “-1” if
the POV controller is unavailable. Note that certain directions will only be available due to
the type of POV setup in options (see the token above for getting the POV type). For POV
type “1” (POV is on/off switch), the only position that will be indicated and that you should
test for is, “UP” (this is for speed reasons). For “2” (POV is up/down only), “UP” and
“DOWN” are indicated. For “3” (POV is left/right only), “LEFT” and “RIGHT” are indicated.
For “4” (four-direction), “LEFT”, “RIGHT”, “UP” and “DOWN” are indicated. For “8” (eight-
direction), all eight directions are available.
DirectX Joystick States (simply DirectX query, not tracked by VoiceAttack for
managing events):
{STATE_JOYSTICKXPOVY_NUMERIC} - This token is used to get the numeric value
presented by the POV controller. X indicates the stick (1 or 2). Y indicates the POV
controller (1-4). So, to get the position value for stick 1, POV controller 2, use:
{STATE_JOYSTICK1POV2}. The value will usually be “-1” (some drivers may report
“65535”) if the POV is centered, or “0” to “35999” as the POV is pressed in a direction. You
can use this token if the VoiceAttack, 'switch' model does not fit your needs.
{STATE_JOYSTICK1X}
{STATE_JOYSTICK2X} - This token is used to indicate the X value of the indicated
joystick. The replaced value is “0” at minimum and “65535” at maximum. This value will be
“-1” if the stick is unavailable.
{STATE_JOYSTICK1Y}
{STATE_JOYSTICK2Y} - This token is used to indicate the Y value of the indicated
joystick. The replaced value is “0” at minimum and “65535” at maximum. This value will be
“-1” if the stick is unavailable.
{STATE_JOYSTICK1Z}
{STATE_JOYSTICK2Z} - This token is used to indicate the Z value of the indicated
joystick. The replaced value is “0” at minimum and “65535” at maximum. This value will be
“-1” if the stick is unavailable.
{STATE_JOYSTICK1ROTATIONX}
{STATE_JOYSTICK2ROTATIONX} - This token is used to indicate the rotation X value of
the indicated joystick. The replaced value is “0” at minimum and “65535” at maximum.
This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1ROTATIONY}
{STATE_JOYSTICK2ROTATIONY} - This token is used to indicate the rotation Y value of
the indicated joystick. The replaced value is “0” at minimum and “65535” at maximum.
This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1ROTATIONZ}
{STATE_JOYSTICK2ROTATIONZ} - This token is used to indicate the rotation Z value of
the indicated joystick. The replaced value is “0” at minimum and “65535” at maximum.
This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1ACCELERATIONX}
{STATE_JOYSTICK2ACCELERATIONX} - This token is used to indicate the acceleration
X value of the indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1ACCELERATIONY}
{STATE_JOYSTICK2ACCELERATIONY} - This token is used to indicate the acceleration
Y value of the indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1ACCELERATIONZ}
{STATE_JOYSTICK2ACCELERATIONZ} - This token is used to indicate the acceleration
Z value of the indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1ANGULARACCELERATIONX}
{STATE_JOYSTICK2ANGULARACCELERATIONX} - This token is used to indicate the
angular acceleration X value of the indicated joystick. This value will be “-1” if the stick is
unavailable.
{STATE_JOYSTICK1ANGULARACCELERATIONY}
{STATE_JOYSTICK2ANGULARACCELERATIONY} - This token is used to indicate the
angular acceleration Y value of the indicated joystick. This value will be “-1” if the stick is
unavailable.
{STATE_JOYSTICK1ANGULARVELOCITYZ}
{STATE_JOYSTICK2ANGULARVELOCITYZ} - This token is used to indicate the angular
acceleration Z value of the indicated joystick. This value will be “-1” if the stick is
unavailable.
{STATE_JOYSTICK1ANGULARVELOCITYX}
{STATE_JOYSTICK2ANGULARVELOCITYX} - This token is used to indicate the angular
velocity X value of the indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1ANGULARVELOCITYY}
{STATE_JOYSTICK2ANGULARVELOCITYY} - This token is used to indicate the angular
velocity Y value of the indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1ANGULARVELOCITYZ}
{STATE_JOYSTICK2ANGULARVELOCITYZ} - This token is used to indicate the angular
velocity Z value of the indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1FORCEX}
{STATE_JOYSTICK2FORCEX} - This token is used to indicate the force X value of the
indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1FORCEY}
{STATE_JOYSTICK2FORCEY} - This token is used to indicate the force Y value of the
indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1FORCEZ}
{STATE_JOYSTICK2FORCEZ} - This token is used to indicate the force Z value of the
indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1TORQUEX}
{STATE_JOYSTICK2TORQUEX} - This token is used to indicate the torque X value of the
indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1TORQUEY}
{STATE_JOYSTICK2TORQUEY} - This token is used to indicate the torque Y value of the
indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1TORQUEZ}
{STATE_JOYSTICK2TORQUEZ} - This token is used to indicate the torque Z value of the
indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1VELOCITYX}
{STATE_JOYSTICK2VELOCITYX} - This token is used to indicate the velocity X value of
the indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1VELOCITYY}
{STATE_JOYSTICK2VELOCITYY} - This token is used to indicate the velocity Y value of
the indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICK1VELOCITYZ}
{STATE_JOYSTICK2VELOCITYZ} - This token is used to indicate the velocity Z value of
the indicated joystick. This value will be “-1” if the stick is unavailable.
{STATE_JOYSTICKXSLIDERY} - This token is used to indicate the slider value. X
indicates the stick number (1 or 2) and Y indicates the control number (1 or 2). If the
control is not available, the replaced value will be “-1”.
{STATE_JOYSTICKXACCELERATIONSLIDERY} - This token is used to indicate the
acceleration slider value. X indicates the stick number (1 or 2) and Y indicates the control
number (1 or 2). If the control is not available, the replaced value will be “-1”.
{STATE_JOYSTICKXFORCESLIDERY} - This token is used to indicate the force slider
value. X indicates the stick number (1 or 2) and Y indicates the control number (1 or 2). If
the control is not available, the replaced value will be “-1”.
{STATE_JOYSTICKXVELOCITYSLIDERY} - This token is used to indicate the velocity
slider value. X indicates the stick number (1 or 2) and Y indicates the control number (1 or
2). If the control is not available, the replaced value will be “-1”.
VoiceAttack Path Tokens
VoiceAttack has a few tokens that can be used in places that require a file path (sound file
locations and application locations). There are certain cases where it is helpful to keep
certain files together, especially when it comes to sharing profiles.
{VA_DIR} - This is the VoiceAttack installation directory.
{VA_SOUNDS} - By default, this is the folder named, 'Sounds' under the VoiceAttack root
directory. This is a place where you can store your VoiceAttack sound packs. If you do not
want to use the 'Sounds' folder in the VoiceAttack installation directory, you can change this
to be whatever folder you want it to be on the VoiceAttack Options page.
{VA_APPS} - This is the folder named, 'Apps' under the VoiceAttack root directory. This is
the place where you can store apps that you use with VoiceAttack (.exe files) and
VoiceAttack plugins (.dll files). Just like the, 'Sounds' folder, you can change the location of
the VoiceAttack Apps folder in the VoiceAttack Options page.
Quick Input and Variable Keypress Key Indicators
As explained earlier in this document, you can include special indicators in your Quick Input
and keypress variable text to represent keys that do not have a character representation
(such as, 'Enter', 'Tab', 'F1', etc.).
Below is a list of the acceptable key indicators, some with a brief description. Remember
that key indicators need to be enclosed in square brackets: []. At the bottom of this list
is the Quick Input function list (currently only contains, ‘PAUSE’, but will grow as needed).
For information on what these are for, see the section titled, 'Quick Input' in the, 'Other
Stuff' screen documentation, or the section detailing variable keypresses in the, ‘Keypress’
screen documentation.
Note: Items below that are marked with a blue asterisk (*) are for Quick Input only.
Items that are marked with a red asterisk (*) are for keypress variables only and are not
available for Quick Input.
ENTER
- presses the enter key
TAB
- presses the tab key
ESC
- presses the escape key
ESCAPE
- works the same as, 'esc' above
BACK
- press the backspace button
BACKSPACE - works the same as, 'back' above
SPACE
- presses the space bar (note that you can also just have a space in your
keypress variable or Quick Input value.
SHIFTDOWN* - holds the left shift key down
SHIFTUP*
- releases the left shift key
RSHIFTDOWN* - right shift if you need it
RSHIFTUP*
LSHIFTDOWN* - works the same as shiftdown
LSHIFTUP*
- works the same as shiftup
SHIFT*
LSHIFT*
RSHIFT*
ALTDOWN*
ALTUP*
RALTDOWN*
RALTUP*
LALTDOWN*
LALTUP*
- press left shift key
- press left shift key
- press right shift key
- holds down the left alt key
- releases the left alt key
- holds down the right alt key
- releases the right alt key
- works the same as altdown
- works the same as altup
ALT*
LALT*
RALT*
- keypress variable - press left alt key
- keypress variable - press left alt key
- keypress variable - press right alt key
CTRLDOWN*
- holds down the left ctrl key
CTRLUP*
- releases the left ctrl key
RCTRLDOWN* - holds down right ctrl key
RCTRLUP*
- releases right ctrl key
LCTRLDOWN* - works the same as ctrldown
LCTRLUP*
- works the same as ctrlup
CTRL*
LCTRL*
RCTRL*
- keypress variable only - press left ctrl key
- keypress variable only - press left ctrl key
- keypress variable only - press right ctrl key
WINDOWN*
WINUP*
RWINDOWN*
RWINUP*
LWINDOWN*
LWINUP*
- holds down the left win key
- releases the left win key
- holds down the right win key
- releases the right win key
- works the same as windown
- works the same as winup
WIN*
LWIN*
RWIN*
- keypress variable only - press left win key
- keypress variable only - press left win key
- keypress variable only - press right win key
DEAD
- The, ‘dead’ key that is available on German keyboards (located next to the
‘1’ key) and various French keyboards (located next to the ‘P’ key).
NUM0
NUM1
NUM2
NUM3
NUM4
NUM5
NUM6
NUM7
NUM8
NUM9
- numeric pad 0-9
NUM*
NUM+
NUMNUM.
NUM/
NUMENTER
NUMINSERT
NUMHOME
NUMDELETE
NUMPAGEUP
NUMPAGEDOWN
NUMEND
NUMRIGHT
NUMLEFT
- numeric pad *
- numeric pad +
- numeric pad - numeric pad .
- numeric pad /
- numeric pad enter
- numeric pad insert
- numeric pad home
- numeric pad delete
- numeric pad page up
- numeric pad page down
- numeric pad end
- numeric pad right arrow
- numeric pad left arrow
NUMUP
NUMDOWN
- numeric pad up arrow
- numeric pad down arrow
F1 - F24
- press F(unction) keys... F1-F24
ARROWD
ARROWL
ARROWR
ARROWU
CAPSLOCK
DEL
DELETE
END
HOME
INS
INSERT
NUMLOCK
PAGEUP
PAGEDOWN
PAUSE
BREAK
PRINTSCREEN
SCRLOCK
SCROLLLOCK
- arrow down
- arrow left
- arrow right
- arrow up
- toggle capslock
- press delete key
- works the same as del
- press end key
- press home key
- press insert key
- works the same as ins
- toggle numlock
- press page up
- press page down
- press the pause/break button (use, ‘BREAK’ instead)
- press the pause/break button
- press printscreen button
- toggle scroll lock
- works the same as scrlock
0 – 255
- As an additional helper, if you *happen* to know the virtual key value,
you can put it between square brackets and it will be used. For instance, the virtual key
value for the, ‘A’ key is 65, ‘B’ is 66 and ‘C’ is 67. If you put
[SHIFTDOWN][65][66][67][SHIFTUP] in Quick Input, ‘ABC’ will be typed out (note the
uppercase characters). Note that you don’t save any time by using this… it’s just used
behind the scenes in other ways and is exposed in this way for you to use ;)
Quick Input inline functions
[PAUSE:seconds] - Using this indicator will allow you to insert a pause between
characters. Simply use the term, ‘PAUSE’, followed by a colon, then the amount of time in
seconds that you would like to pause. For example, A[PAUSE:2.5]B[PAUSE:0.5]C will
press, ‘A’, then pause 2.5 seconds, then press, ‘B’, pause one half second, then press, ‘C’.
Key State Token Parameter Values
Key state token parameters are used with the {STATE_KEYSTATE:key} token. The, 'key'
parameter can be any key you can type into a token (A, B, C, #, @, etc). For keys that you
can't type into a token, use the items from the list below. For instance, if you wanted to see
if the F10 key is down, simply use the following token: {STATE_KEYSTATE:F10}.
See the section on tokens elsewhere in this document for more info.
ENTER
TAB
ESC
ESCAPE
BACK
BACKSPACE
SPACE
DEAD
- The, ‘dead’ key that is available on German keyboards (located next to the
‘1’ key) and various French keyboards (located next to the ‘P’ key).
LCTRL
CTRL
RCTRL
- Left control key
- Same as left control key
- Right control key
LALT
ALT
RALT
- Left ALT key
- Same as left ALT key
- Right ALT key
LSHIFT
SHIFT
RSHIFT
- Left shift key
- Same as left shift key
- Right shift key
LWIN
WIN
RWIN
- Left Windows key
- Same as left Windows key
- Right Windows key
NUM0
NUM1
NUM2
NUM3
NUM4
NUM5
NUM6
NUM7
NUM8
NUM9
- numeric pad 0-9
NUM*
NUM+
- numeric pad *
- numeric pad +
NUMNUM.
NUM/
NUMENTER
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
F21
F22
F23
F24
- numeric pad - numeric pad .
- numeric pad /
- numeric pad enter
- F1-F24
ARROWD
- arrow down
ARROWL
- arrow left
ARROWR
- arrow right
ARROWU
- arrow up
CAPSLOCK
- caps lock
DEL
- delete key
DELETE
- works the same as del
END
- end key
HOME
- home key
INS
- insert key
INSERT
- works the same as ins
NUMLOCK
- numlock
PAGEUP
-page up
PAGEDOWN
- page down
PAUSE
-pause/break button
PRINTSCREEN - printscreen button
SCRLOCK
- scroll lock
SCROLLLOCK - works the same as scrlock
VoiceAttack Plugins (for the truly mad)
A VoiceAttack plugin is code that resides in a dynamic-link library (.dll) that VoiceAttack can
call at any point in a command. The plugin can be code that you (or somebody else) can
write to enhance the capabilities of VoiceAttack. A plugin will allow you to pass information
from VoiceAttack into your code, execute whatever features you want, then allow your code
to interact with VoiceAttack or pass information back to VoiceAttack for further processing
within your commands.
This is an experimental part of VoiceAttack and is really not intended for everyone (that's
why the documentation is all the way down here near the end). This is a means to be able
to make VoiceAttack do pretty much whatever we want it to do without affecting its core
functionality. The interface for the plugins will be available to anybody that wants to jump
in, and I am hoping that what is provided will be easy to understand. Please note that this
is an evolving endeavor, and not every aspect of this feature is (or will be) explained here.
More aspects will be uncovered/discovered as (or if) more people decide to use this
feature. This documentation may or may not be accurate or up to date, depending on the
version of VoiceAttack you are using. This document covers version 4 of the plugin
interface. To read about previous versions of this interface, you will need to obtain an
earlier version of VoiceAttack, or post a request in the forum as somebody may have a
copy lying around.
Setup
If you have the right tools, a VoiceAttack plugin should be fairly easy to construct. The only
rub is that there is an interface that you must adhere to (more later). Sample code will be
placed in a folder called, 'Plugin Samples' in the VoiceAttack installation directory.
Basically, all you will need at this point in time is a version of Visual Studio that supports at
least .Net Framework 4.0 (you pick the language). If you do not have this, you can go to
Microsoft's site and download an Express edition for free. I won't go into any more detail
about that here, since if you've gotten this far without your eyes glazing over, you're being
told something you probably already know :)
If you are planning on sharing your plugin with others, it is suggested that you compile your
.dll using the, 'Any CPU' platform target so that your plugin will work with both 32 and 64 bit
versions of Windows. Also, you may even want to consider making your plugins opensource, due to trust/security concerns. Some people will not run a compiled .dll unless
they know that the source is trusted and/or know what the code looks like (I am one of
those people).
Turning on plugin support in VoiceAttack
To turn on plugin support in VoiceAttack, you need to go into the options screen and check
the, 'Enable Plugin Support' checkbox. A nice warning message will come up and advise
you of the dangers of using plugins that somebody else creates. If you accept and
continue, you'll get another box that indicates that VoiceAttack will need to be restarted to
initialize any plugins. When you run VoiceAttack with plugin support enabled, you will see
log messages indicating the state of each plugin that was found and validated.
Turning off plugin support
There are two ways to disable plugin support. You can deselect the box described above,
or, you can launch VoiceAttack with the control and shift buttons pressed at the same time.
This is a way to catch VoiceAttack before the plugin initializers can be called (in case of
danger o_O). You can always just wipe your apps directory if you REALLY want to make
sure nothing is going to happen ;)
Running a plugin from within VoiceAttack
To invoke a VoiceAttack plugin, you will need to put an, 'Execute an External Plugin
Function' (long name... might change... lol) command action in your command:
On this screen, you will pick the plugin that you want to use and any condition or text
values you want passed in. You can also indicate a context value and indicate whether or
not you want VoiceAttack to wait for the plugin function to return.
NOTE: Any reference below this point regarding the variable input boxes (Small
Integer, Text, Integer, Decimal and Boolean) are there for backward compatibility
prior to version 4 of the plugin interface. They are not necessary for use after
version 4 (VoiceAttack version 1.6+), as you will be able to directly access variables
from within your plugin.
**************************************************************************************************
When the command action is executed, the plugin context value, any small integer
variables (indicated by name in a semicolon-delimited list), any text, integer, decimal,
Boolean or date/time variables (indicated the same way), and plugin state are passed to
the plugin's invoke function (currently, 'VA_Invoke1').
At this point, this is where most of the business will (should) occur. The plugin context that
is passed to the plugin can be any string value that you want it to be or any combination of
tokens (fairly simple). Small integer (formerly, 'Condition') variables that are passed in can
be altered within the plugin or you can add more small integer values (setting a small
integer value to null will remove the small integer on return). Same goes for the other
variable types (text, integer, decimal, Boolean, date/time). Small integer, text, integer,
decimal, Boolean and date/time variables are global and available to all plugins, so play
nice. The dictionary that contains state values can be modified however you want it. It's
private to your plugin (no other plugin has access to it, and only your plugin can modify it).
Since your plugin class is using static functions, this is provided to simply maintain state
privately if you need it. I'm sure you can come up with all kinds of ways to persist state
between calls, but this might make things a little bit easier.
After your code goes out of scope and control returns to VoiceAttack, VoiceAttack will
update its copy of your plugin state, update any variables you altered and remove any
variables set to null.
If you did not check the, 'wait until function returns' checkbox, the call to the plugin will
be tossed into another thread and VoiceAttack will continue processing actions
immediately.
If you do check the, 'wait until function returns' checkbox, VoiceAttack will do just that...
wait until your code finishes before continuing. At this point you have a chance to work
with any of the values you had modified/added in subsequent actions within the command.
For instance, maybe your plugin goes out to the internet to retrieve information. Your
plugin can set that information to a value that is passed back to VoiceAttack and then
VoiceAttack can use that value (for TTS or for conditional flow).
VoiceAttack Plugin Requirements and Interface (this will be reorganized properly at
some point)
The code that you compile must be a .net framework 4.0+ .dll.
The .dll must be in a specific location.
The VoiceAttack Apps directory is located (by default) in the VoiceAttack installation
directory (this location can be changed in the Options page). I called it, 'Apps' because it's
not just for plugins. It can be for your out-of-process (.exe) stuff as well... just thought you
should know that for some reason o_O.
VoiceAttack will crawl all subdirectories of the Apps directory. VoiceAttack will ONLY
crawl subdirectories of the Apps directory, and not the Apps directory itself (that means that
any .dll files that are just sitting in the Apps directory will be skipped... this is for
housekeeping reasons... your plugins need to be in their own directories). Again... The
compiled plugin .dll must reside IN A SUBDIRECTORY of the VoiceAttack Apps
directory.
Ex: “C:\Program Files (x86)\VoiceAttack\Apps\myPlugin.dll” will be skipped.
“C:\Program Files (x86)\VoiceAttack\Apps\MyPluginDirectory\myPlugin.dll” will be picked
up.
When VoiceAttack discovers a .dll, it interrogates it and sees if it is compatible with the
current version of VoiceAttack. If it is not, you will see a log entry indicating this.
Functions your plugin must provide...
VoiceAttack will not be instantiating any objects in your plugins, so all the required
functions must be static. If you have objects that need to be instantiated, feel free to do
that from within the static functions. You can call your classes anything you want.
VoiceAttack will find all the classes in your .dll that meet the criteria and reference each
class as a separate plugin (this way if you have multiple plugins per assembly (.dll)).
As stated above, your class must contain static functions. For version 4 (the current
version), seven of them are currently necessary. The functions are for display name,
plugin id, extended display info, initialization, invoke and application exit, and command
stop. Each of the functions must have a specific set of parameters to work.
The first required plugin function is called VA_Id. This returns a Guid to VoiceAttack and
uniquely identifies your plugin so that it can actually be called when needed.
This is a Guid that must be generated by you. Please find a proper tool (Visual Studio
has one built in) that will generate the value for you. Note that if your project has multiple
classes that present themselves as plugins, the Guid must be different for each class.
The next plugin function is called, VA_DisplayName. This returns a string value and is
what VoiceAttack will display when referring to your plugin. You will see this value in the
selection lists and log entries.
The third plugin function is called, VA_DisplayInfo. This is another simple string value that
can be used to display extra information about your plugin (such as the author or helpful
info regarding the plugin). Make sure the string that is returned contains proper formatting.
This function can return an empty string.
The fourth function is VA_Init1 (UPDATED IN VERSION 4). This function gets called when
VoiceAttack starts, before the main screen form is loaded. This function does not return a
value (void), however, it has a single dynamic parameter called, ‘vaProxy’. This parameter
takes the place of the eight parameters that were used before version 4. Note that this
function is called asynchronously and there is no guarantee of the order that plugins will be
initialized. Note that through the vaProxy variable, you can access the state values, any
VoiceAttack variables as well as be able to execute commands or change profiles (and lots
more… more about vaProxy later).
The fifth function is VA_Exit1 (UPDATED IN VERSION 4). This function gets called when
VoiceAttack closes. This will give you an opportunity to clean up anything that you want to
upon application exit. This function does not return a value (void), however, it has a single
dynamic parameter called, ‘vaProxy’. This parameter takes the place of the state
dictionary that was used before version 4. You can use the vaProxy variable to access the
state information that is passed back and forth to VoiceAttack (again, more about vaProxy
later). This function is called asynchronously and there is no guarantee of the order that
plugins will be called on exit.
Note: The, ‘vaProxy’ that is available in VA_Exit1 is limited to being only able to get state
information. Any other use of vaProxy in VA_Exit1 may result in an exception being raised
and VoiceAttack becoming hung on exit (possibly requiring you to terminate VoiceAttack
via the Task Manager).
The sixth required static function is VA_StopCommand (NEW IN VERSION 4). This
function takes no parameters and is called any time the user executes a, ‘stop all
commands’ action or clicks on the, ‘stop all commands’ button on the main screen. This
function’s purpose is to provide a means for the plugin to know that this event as occurred.
Again, this will be called asynchronously and there is no guarantee that of the order that
plugins will be called.
The seventh required function is VA_Invoke1 (UPDATED IN VERSION 4). This function
gets called via a special command action in VoiceAttack ('Execute external plugin
function'). The VA_Invoke1 function does not have a return value (void). This function has
a single dynamic parameter called, ‘vaProxy’. This parameter is the context parameter.
This value is a string and can be whatever you want it to be as long as it is at most 32,767
characters. This value is passed in through the command action. The other seven
parameters are the same as what is in VA_Init1 (state, small integer variables, text
variables, integer variables, decimal variables, Boolean variables, date/time variables,
extended). The difference here is that you can specify what variables to pass into this
function from the command action in VoiceAttack (you specify what variables to pass in
semicolon-delimited lists). The state parameter will be filled with everything you have put
into it. Everything you do to the state dictionary in here will be reflected inside of
VoiceAttack. The small integer, text, integer, decimal, Boolean and date/time dictionaries
are filled with whatever you had indicated in the command action. Any values you modify
or add to the variable dictionaries will be copied once returned to VoiceAttack (any
variables set to null will be removed).
Plugin parameter notes
Note that this section is now in two parts: version 4 and above and version 3 and
below.
Version 4 and above plugin parameter notes
vaProxy
Version 4 of the plugin interface brings an attempt to simplify things somewhat by
eliminating an ever-growing list of parameters for each function. In version 3 and versions
prior, there was a parameter for the context, the state and each and every data type to be
passed in (see v3 notes below on how to access vaProxy in v3 and prior). In this version,
we have the single dynamic parameter called, ‘vaProxy’. It’s not as easy to see what is
going on with this approach, but it will make things far more flexible going forward. That is,
the vaProxy’s capabilities can expand indefinitely without having to rework this interface
every time there is a change. Below is an outline of the properties and methods available
to vaProxy with a description of how to use each one. Also, if the property or method
relates to functionality available in previous versions of the interface you will find notes on
that as well.
To use the vaProxy variable, simply access its attributes just as you would any other class.
It will be a little awkward at first, as the type of vaProxy is, ‘dynamic’. That means that the
attributes are not available until runtime (also known as, ‘late bound’) and you will not have
the assistance of Intellisense. You will generally not receive compiler errors when using
dynamic variables. If something is wrong, you will receive a runtime error when that line is
hit. Again, if you are down here reading this, I am most likely telling you stuff you already
know. Rock on ;)
vaProxy Attributes
Context - This is a read-only string property which is set via the, ‘Plugin Context’ input box
on the, ‘Execute External Plugin Function’ screen. This property is only available when you
are using VA_Invoke1 (it is not accessible in any other function).
Since there is only one function (VA_Invoke1) that is accessed by commands, you need a
way to differentiate between different types of requests. This is just a simple way to get
information to your plugin without having to assign a variable. You will probably use this
property the most.
public static void VA_Invoke1(dynamic vaProxy)
{
if (vaProxy.Context == “lights on”)
//do some stuff here
else if (vaProxy.Context == “lights off”)
//do something different
}
This property will be available in VA_Invoke1 only and will be null if accessed elsewhere
(including inline functions (see, ‘Execute an Inline Function’ section earlier in this
document)).
The Context property takes the place of the Context parameter that was available in
VA_Invoke1 for version 3 and before.
SessionState – this is a read/write Dictionary of (String, Object). This property is
accessible through VA_Init1, VA_Invoke1 and VA_Exit1. This property is for your own
private use within the plugin you create. No other plugin has access to the values. It
serves as a kind of session, so that you can easily maintain information between calls
without having to do any kind of persistence. The dictionary is (String, Object) so you can
name your values whatever you want, as well as store any kind of value type. Whatever
you do to this dictionary will be reflected in VoiceAttack upon return (VA_Invoke1 and
VA_Init1 only). So, if you empty this dictionary, VoiceAttack's copy of this dictionary will be
emptied. Null values will not be cleaned out. Note: When the state dictionary is initialized
for a plugin, there are three key/value pairs that are included for use. The keys are below
(the key names are the same as the token values used elsewhere):
VA_DIR : The installation directory of VoiceAttack.
VA_APPS : VoiceAttack apps/plugins directory.
VA_SOUNDS : VoiceAttack sounds directory.
Again, these values can be erased and manipulated however you want.
public static void VA_Init1(dynamic vaProxy)
{
vaProxy.SessionState.Add("new state value", 369);
vaProxy.SessionState.Add("second new state value", "hello");
String sValue = vaProxy.SessionState[“new state value”];
}
The SessionState property takes the place of the State parameter that was available for
each function in version 3 and before.
NOTE: This property should only be used with plugins, as the values are not maintained
between calls using inline functions.
SetSmallInt(string VariableName, short? Value) – this method allows you to set a
VoiceAttack short integer variable indicated by VariableName to a value specified by Value.
Short integers were referred to as, ‘Conditions’ in earlier versions of VoiceAttack. Note that
the Value can be null which will clear out the named variable.
public static void VA_Invoke1(dynamic vaProxy)
{
vaProxy.SetSmallInt(“mySmallInt”, 55);
}
Small integers are public and can be accessed from any plugin or any command within the
VoiceAttack user interface. That means that anybody can view or modify these values.
You can access the values in conditions using the {SMALL:variableName}
({COND:conditionName} remains for backward compatibility) token in various places in
VoiceAttack.
SetSmallInt takes partial place of the SmallIntegerValues parameter (dictionary of (String,
short)) in version 3 and before.
GetSmallInt(string VariableName) – this function will return a short integer value if the
variable indicated by VariableName exists, or null if the variable does not exist. Note that
you will always want to check to see if the value is null:
public static void VA_Invoke1(dynamic vaProxy)
{
short? myShort = vaProxy.GetSmallInt(“mySmallInt”);
if (myShort.HasValue)
{
//do some stuff
}
}
GetSmallInt takes partial place of the SmallIntegerValues parameter (dictionary of (String,
short)) in version 3 and before.
The functionality you see in GetSmallInt and SetSmallInt is repeated for the following
functions with their corresponding data types. Note that each replaces their corresponding
dictionary parameter in version 3 and before:
SetInt(string VariableName, int? Value) – Set a nullable integer value
GetInt(string VariableName) – Returns a nullable integer value
SetText(string VariableName, string Value) – Set a string value
GetText(string VariableName) – Returns a string value
SetDecimal(string VariableName, decimal? Value) – Set a nullable decimal value
GetDecimal(string VariableName) – Returns a nullable decimal value
SetBoolean(string VariableName, Boolean? Value) – Set a nullable Boolean value
GetBoolean(string VariableName) – Returns a nullable Boolean value
SetDate(string VariableName, DateTime? Value) – Set a nullable DateTime value
GetDate(string VariableName) – Returns a nullable DateTime value
Version 4 now brings two-way interaction between your plugin and VoiceAttack. You can
now do things like execute commands, change profiles or write values to the log. This
functionality will continue to grow over time. Below are some properties and methods you
may find useful:
ExecuteCommand(string CommandName, optional Boolean WaitForReturn) – This
method will execute a VoiceAttack command in the active profile by the name indicated in
CommandName. The flow of execution will continue immediately if you pass in false (the
default) for WaitForReturn. If you want the flow of execution to wait until the command
completes, pass in true. If the command does not exist, the log will display an alert.
vaProxy.ExecuteCommand(“fire weapons”); //continues immediately (asynchronous)
vaProxy.ExecuteCommand(“fire weapons”, true); //waits until the command completes
CommandExists(string CommandName) – This Boolean function returns true if a
command exists in the active profile with the name specified in CommandName.
if (vaProxy.CommandExists(“fire weapons”))
{
vaProxy.ExecuteCommand(“fire weapons”);
}
GetProfileName() – This function returns the name of the active profile.
WriteToLog(String Value, String Color) – This is a simple way to get some information to
the VoiceAttack log. This could be for your own debugging reasons or it could be
information for the user. The text indicated in Value will be written, with a status icon of the
color you choose. The choices are: “red”, “blue”, “green”, “yellow”, “orange”, “purple”,
“blank”, “black”, “gray”, “pink”.
vaProxy.WriteToLog(“What is love?”, "red");
ParseTokens(String Value) – This is just a shortcut to getting values from any of the
available tokens.
String s = vaProxy.ParseTokens(“{ACTIVEWINDOWTITLE}”);
ProxyVersion() – This will return a System.Version object to indicate the version of the
proxy interface. This will help you determine whether or not the installed interface is
compatible with your plugin.
System.Version v = vaProxy.ProxyVersion();
VAVersion() – This will return a System.Version object to indicate the version of
VoiceAttack currently in use. This will help you determine whether or not the user can use
your plugin.
System.Version v = vaProxy.VAVersion();
PluginPath() - This will return a string that contains the full path of the executing plugin.
This function is not applicable when using the proxy object within inline functions (see,
‘Execute an Inline Function’ section earlier in this document).
String s = vaProxy.PluginPath();
Stopped - This will return true if the user has clicked the, ‘stop all commands’ button on the
main screen or a, ‘Stop all commands’ action has been issued. This property was created
mainly for use within inline functions (see, ‘Execute an Inline Function’ section earlier in this
document), but works just as well within plugins.
Boolean b = vaProxy.Stopped;
ResetStopFlag() - This function will reset the flag used to check if the, ‘Stop all commands’
button has been pressed, or a, ‘Stop all commands’ action has been issued. This function
was created mainly for use within inline functions (see, ‘Inline Functions’ section later in
this document), but works just as well within plugins.
if (vaProxy.Stopped)
{
vaProxy.WriteToLog(“VoiceAttack commands have stopped!”, “Orange”);
vaProxy.ResetStopFlag(); //reset the flag here
}
Remember… if you get stuck, drop by the VoiceAttack user forums and go to the plugin
boards. Help is always around ;)
Notes on testing your plugin
Something I have done to make my plugin test development a little easier was to set up
Visual Studio to output the built .dll straight into a subdirectory of the VoiceAttack Apps
directory. I thought that was worth mentioning even though you probably already know to
do this.
You can output your values using the, ‘WriteToLog’ function with the vaProxy object:
vaProxy.WriteToLog(“some value”, “orange”); The output is token-parsed so you can use
any or all of the tokens in there ( {SMALL:}, {INT:}, {BOOL:}, {DEC:}, various {DATE:} and
{TXT:} ).
Now that the dynamic vaProxy is in place and generic parameters are not being passed,
there will no longer be a test harness project included with the samples.
Version 3 and below plugin parameter notes (this is old stuff but still left here as a
reference. Note that there have been some updates to this interface to allow access
to vaProxy if you still require this interface).
State parameter
The state parameter that is passed in to VA_Invoke1, VA_Exit1 and VA_Init1 is for your
own private use within this plugin. No other plugin has access to the values. It serves as a
kind of session, so that you can easily maintain information between calls without having to
do any kind of persistence. The dictionary is (String, Object) so you can name your values
whatever you want, as well as store any kind of value type. Whatever you do to this
dictionary will be reflected in VoiceAttack upon return (VA_Invoke1 and VA_Init1 only). So,
if you empty this dictionary, VoiceAttack's copy of this dictionary will be emptied. Null
values will not be cleaned out. Note: When the state dictionary is initialized for a plugin,
there are three key/value pairs that are included for use. The keys are below (the key
names are the same as the token values used elsewhere):
VA_DIR : The installation directory of VoiceAttack.
VA_APPS : VoiceAttack apps/plugins directory.
VA_SOUNDS : VoiceAttack sounds directory.
VA_SOUNDS : To allow plugin version v3 and prior to allow access to the new vaProxy
object, the VA_PROXY key was added. You can access the VA_PROXY object like so:
dynamic vaProxy = state[“VA_PROXY”];
See notes above on how to use vaProxy. Note also that VoiceAttack v1.6 or greater will be
needed to be able to use this feature.
Again, these values can be erased and manipulated however you want.
SmallIntegerValues (formerly, 'Conditions') parameter
The small integers parameter is a dictionary of (String, nullable Int16 (or short)). These are
the same small integers (conditions) you find when using them within the VoiceAttack
interface.
To get values from VoiceAttack into the plugin in VA_Invoke1, simply indicate what small
integers to pass in the, 'Small Integer Variables' box in the, 'Execute an External Plugin
Function' screen. For example, if you want to pass in, 'myValue1' and 'myValue5', just put
'myValue1;myValue5' (no quotes) in the box. VoiceAttack will copy the values into a new
list and pass them in to the plugin for you to use. Inside the plugin's function (either
VA_Invoke1 or VA_Init1), you can read 'myValue1' or 'myValue5', alter their values (set to
null to remove) and/or add more values to the small integers dictionary. Any changes will
be reflected in VoiceAttack upon return. To indicate to VoiceAttack that you want to remove
a small integer, simply set its value to null ( smallIntegerValues[“myConditionName”] = null
). On a programming side-note... Since these are dictionaries, it is necessary to check to
see if an item exists before doing anything to it... otherwise things come to a quick halt.
Small integers are public and can be accessed from any plugin or any command within the
VoiceAttack user interface. That means that anybody can view or modify these values.
You can access the values in conditions using the {SMALL:variableName}
({COND:conditionName} remains for backward compatibility) token in various places in
VoiceAttack.
TextValues parameter
The textValues parameter is a dictionary of (String, String). It behaves pretty much exactly
like the smallIntegerValues parameter, except the token to access a text value is
{TXT:textVariableName}, and you pass in values to your plugin via the Text Variables box in
the command action.
(and now for some copy/paste/replace… three times :) )
IntValues parameter
The intValues parameter is a dictionary of (String, int). It behaves pretty much exactly like
the smallIntegerValues parameter, except the token to access a text value is
{INT:variableName}, and you pass in values to your plugin via the Integer Variables box in
the command action.
DecimalValues parameter
The decimalValues parameter is a dictionary of (String, decimal). It behaves pretty much
exactly like the smallIntegerValues parameter, except the token to access a text value is
{DEC:variableName}, and you pass in values to your plugin via the Decimal Variables box
in the command action.
BooleanValues parameter
The booleanValues parameter is a dictionary of (String, Boolean). It behaves pretty much
exactly like the smallIntegerValues parameter, except the token to access a text value is
{BOOL:variableName}, and you pass in values to your plugin via the Boolean Variables box
in the command action.
DateTimeValues parameter
The dateTimeValues parameter is a dictionary of (String, DateTime). It behaves pretty
much exactly like the smallIntegerValues parameter, except the token to access a text
value is {DATE:variableName}, and you pass in values to your plugin via the Date/Time
Variables box in the command action.
Context parameter (VA_Invoke1 only)
This parameter is just a string that can be used to get a value into the plugin. This was
added so that you don't have to go through the legwork of setting a condition or textValue
just to get something simple passed. Convert the string value inside the plugin to whatever
type you need to use. You will probably use this parameter the most.
VoiceAttack Load Options Screen
Sometimes you may need to change a particular setting before VoiceAttack loads. If you
hold down Control + Shift before and during VoiceAttack's launch, you will get the following
screen:
From here, you can disable plugin support (in case you get a rogue plugin that you don't
want launched on startup). Setting this will disable plugin support until you enable it again
in the Options screen.
You can also disable joystick support. This will disable joystick support until you enable it
again.
Disabling profile initialization will prevent any of the commands you have chosen to
execute on profile change from actually executing. Note that this only occurs on the
current running instance of VoiceAttack. If you run VoiceAttack again without this setting,
the profile initialization commands will be enabled again.
‘Reset startup automatic audio device switching’ will reset the options that allow for
playback and recording devices to be automatically set on startup. This will help if
VoiceAttack is experiencing device trouble accessing these devices.
Selecting, 'Show window titles' will display the window title from selected foreground
windows. This is so you can easily see what VoiceAttack sees when deciding how to
choose your target applications for automatic profile switching. Note that this only occurs
on the current running instance of VoiceAttack.
Also Note: This option will only work if the, 'Enable Automatic Profile Switching' option
is turned on in the main Options screen.
Checking the, 'Reset VoiceAttack settings to initial values' box will wipe out your
VoiceAttack user settings (just like clicking the, 'Reset Defaults' button on the Options
screen). Note that your profiles and registration information are preserved.
Once you have made your selections, just click, 'OK' and VoiceAttack will continue to load.
NOTE: This screen will automatically appear if VoiceAttack is not shut down properly
(probably due to a crash). You can choose to not automatically show this screen from the
dialog that pops up prior to the Load Options screen being displayed.
Advanced Variable Control (Scope)
This section is to provide a little bit of guidance on variable, ‘scope’ in VoiceAttack. Initially, all
variables in VoiceAttack were globally-scoped. That means that when a variable is set, it is
available to be read from and written to from any command in any profile. For the most part,
this system works well and will continue to be used. The only gotcha is that global variables
must be named very uniquely in order to not interfere with each other. For example:
You have two profiles: Profile A and Profile B. Profile A has a command that creates a text
variable, ‘myTextVariable’. All of Profile A’s commands can see and modify, ‘myTextVariable’.
Also, when you switch to Profile B, all of Profile B’s commands can see and modify the same,
‘myTextVariable’ variable. In most situations this is alright, but let’s say your friend created
Profile B and your friend also uses a text variable called, ‘myTextVariable’. If you switch
between Profile A and Profile B, you can see where modifying the same variable can be a
problem. Profile A and Profile B would need to be very aware of each other’s variables (and
that’s not much fun).
In v1.6.2, some additional control was introduced to make variables a little more private and
more contained. Variables can now also be scoped to stay within the profile (profile-scoped)
as well as within individual commands (command-scoped).
In order to not triple up the user interfaces for variables, variable names will now have a prefix
associated with them. Profile-scoped variables will be prefixed with the, '>' (greater-than)
character, and command-level variables will be prefixed with, '~' (tilde) character. Global
variables will remain un-prefixed. So, 'myTextVariable' will be globally-scoped,
'>myTextVariable' will be profile-scoped and '~myTextVariable' will be scoped at the command
level.
Using the previous example for profile-scoped variables, if Profile A and Profile B both happen
to have a variable called, ‘>myTextVariable’ (note the, ‘>’ character), each profile will have its
own copy of ‘>myTextVariable’. So, if, ‘>myTextVariable’ in Profile A is set to ‘hello’,
‘>myTextVariable’ in Profile B can be set independently to, ‘world’.
Command-scoped variables work the same way, except that a command-scoped variable is
only available to the command instance in which it is executing. It is not available to any
other executing commands that may be running, even if those commands are additional
instances of the same command. So, if Command A is executing, Command B cannot read
or write any of Command A’s command-scoped variables. Additionally, if Command A is run
several times in parallel (asynchronously), each running instance of Command A will have its
own set of command-scoped variables.
More advanced stuff:
If you are still with me down here, there are two more additional prefixes that you can use.
First, when a profile is switched, the profile-scoped variables are lost. If you want to retain a
profile-scoped variable between profile changes, prefix your variables with two '>' characters.
For example, '>myTextVariable' (single, '>') will be lost on profile switch. '>>myTextVariable'
(note the double '>') will be retained and will be available when you switch back to that profile.
The last prefix (and my favorite) is the command-shared scope prefix. Command-scoped
variable names that are prefixed with two '~' characters are considered command-shared.
That means that the variable will be, 'shared' among commands that are executing in the
same execution chain. Basically, the values are passed from one command to any
subcommands and then back when control is released from the subcommands. Clear as
mud?
Some examples... First, WITHOUT command-shared variables:
Command A sets text variable ~myText to 'hi'. Command A then executes Command B as a
subcommand. Command B reads ~myText and it is, 'Not Set' (null). That is because
~myText is command-scoped (single, ‘~’). It is only available to Command A.
WITH command-shared variables:
Command A sets a shared text variable, '~~myTextVariable' (two, ‘~’) value to 'hello'.
Command A then executes subcommand Command B. Since ~~myTextVariable is shared,
Command B can then read and write ~~myTextVariable. Command B reads
~~myTextVariable as, 'hello' and then decides to set ~~myTextVariable to, 'greetings'. When
Command B completes its execution and control returns to Command A, Command A will
read ~~myTextVariable updated as 'greetings'.
Another example: Command A executes Command B. Command B executes Command C.
Command C initiates the creation of ~~myTextVariable and sets its value to 'welcome'. When
Command C completes, it releases control to Command B. Command B completes and
releases control to Command A. Command A reads ~~myTextVariable as, 'welcome'. The
idea here is that even though the variable was created two levels down from Command A, it is
still accessible to Command A (see note below).
NOTE: All command-shared variables are passed down to subcommands. If you want
updated values to be passed back up to the calling command, the, 'Wait until this command
completes before continuing' option MUST be selected for the subcommand. Scoped
variables are also accessible via plugins and also work when you save variables to the profile
(scope is restored when the variable is retrieved).
What makes this my favorite is that this is kind of an unorthodox way to be able to pass
private information between commands without having to use global variables or establish
parameters or return values. Please make sure to visit the VoiceAttack user forums to talk
more about this if you are stumped ;)
Application Focus (Process Target) Guide
Note: I thought it might be good to consolidate things a bit to get a better picture of what is
going on to illustrate what is now available in regards to process targets. In previous
versions of VoiceAttack, you had less control over process targets or needed to know a
LOT about VoiceAttack in order to change them (like creating sub-commands... bleh).
Hope I don't confuse things even more...
Something you'll notice in Windows is that you need to have a window focused in order for
it to receive input. With VoiceAttack, the two forms of input are by keyboard and by mouse.
In order to type into, say, a comment box in a form or click an, 'OK' button with the mouse,
the containing window needs to be at the top of all other windows (foreground) as well as
selected (active). If the intended window is not in the foreground and active, nothing will
happen. The input that was supposed to go to that window will be occurring in some other
window (the window that is actually selected and in the foreground). In VoiceAttack, the
active window in the foreground is called the, 'process target' (or just, 'target').
With all this focusing that needs to be done, VoiceAttack supplies a few ways to help out.
The first and easiest way is to just use what is called, 'Active Window' as the process
target. You can do this by selecting, 'Active Window' in the, 'Send commands to' box on
the main screen:
When, 'Active Window' is selected as the process target, whatever application window that
is in the foreground and active at the beginning of the executed command will remain
VoiceAttack's target for the duration of the command. So, if Notepad is active in the
foreground and a command is executed, Notepad will become the target and any key
presses or mouse clicks will be sent to it until the command finishes. If you execute the
same command and Wordpad is in the foreground and active, all the same actions will
occur against Wordpad. It's a very simple system and it is what is used by most (it's also
the default setting).
The second way of targeting a window is by selecting the target by name. Targeting by
name will make VoiceAttack seek out the window with the specified name and make it the
target (that is, bring it to the foreground and activate it) before sending any input to it. So, if
you have an application with a window titled, 'My App', you can have VoiceAttack target
the, 'My App' window by simply putting the term, 'My App' in the 'Send commands to' box:
Note that you can freely type in the, 'Send commands to box', as well as select applications
from the list. You'll also be able to select from some recently used items that you have
added.
To keep targeting flexible, either of these methods can be selected from the main screen as
shown (global-level), from the profile options screen of any profile (profile-level) or from a
command within a profile (command-level). The target is selected in a cascading manner:
the command-level target will override anything specified at the profile level and a profilelevel target will override anything at the global level. Maybe you want, 'Active Window' to
be the preferred targeting method at the global level, but you want all the commands in a
certain profile to be directed at a game. For that type of scenario, simply leave 'Active
Window' selected on the Main screen and select the game's window title, 'My Game' from
the 'Send commands to' drop-down on the Profile Options screen:
All profiles will continue to use the, 'Active Window' as the target EXCEPT the profile where
you had specified, 'My Game'.
Let's say in that same profile you want to be able to also type some characters into
Notepad. Since, 'My Game' is the process target for the entire profile, you will need to be
able to specify a process target just for the command. You can do this by putting,
'Notepad' in the, 'Send this command to' box on the Command Screen:
Note: If your window title is the type that changes, you can even specify wildcards in the
process target box to make finding the window a little easier by only using a portion of the
title (search for, 'wildcard' in this document for more information). You can even change the
window's title completely if you need more control (see, 'Perform a Window Function' action
for more info). Also, if you do not have the window title handy, you can indicate the
process name as it is displayed in Windows Task Manager. The wildcards apply here as
well. If the window title and/or process name do not suffice, you can supply the window
class name. This is a super-advanced feature and will require you to know the class name
for the window. You will need a third-party tool such as Spy++ to get this information.
Wildcards do apply for the window class name if you need them. The window title is
searched for first, then the process name and then the window class name.
Advanced targeting
For the most part, the methods above will fill the needs of almost all command macros.
The only drawback is that the targeting is too rigid for some situations. For example, when
targeted by, 'Active Window', a window remains the target throughout the duration of the
command, EVEN IF you manually click another window and make it the foreground window
(VoiceAttack will change the process target window BACK to the foreground, selected
window as it continues through the command). This is so that activities can occur with
other windows, but any input commands (such as pressing keys or typing a message) will
continue to be sent to the indicated process target. Similarly, selecting a target by name
will only seek out the named window for the entire command. Sometimes there is the need
to change the process target even in the middle of a command while it executes. You may
need to have a specified target at the start of a command just to get a handle on it, and
then redirect input to another application. There may also be the need to launch an
application and immediately start sending input to it even if you don't know what it's window
title will be. The good news is that VoiceAttack has some features built in to help you
handle these situations.
The new process target may need to be launched, or the new target may already be
running. If the new target is already running, you can change to this target by using the,
'Display' feature in the, 'Perform a Window Function' action and selecting the, 'Set
command to target this window' option:
What will happen when this action is run is if the target window is found, it will then be set
as the process target for the remaining duration of the command. Note that you can set
how long to wait for the new target to be active, as well as exit the command completely if
the wait time is exceeded (or if the window just simply can't be found).
If the new target needs to be launched, just use the 'Run an Application' action and select
the, 'Wait until launched application is started before continuing' feature with the, 'Set
command to target launched application' option selected:
What will happen is when the application is launched, VoiceAttack will wait until the app is
ready to accept input and then set that application as the new process target for the
remaining duration of the command. Note that you can also specify how long to wait and
to exit if launching the app exceeds the indicated time (or if the launched app fails to
launch).
The last way to set a process target happens automatically whenever VoiceAttack uses the
mouse to, 'click' on a window (including the desktop). Whenever a mouse button down
event occurs (mouse down, click, double-click), the window that is located under the
mouse will become the process target (if it is not already) for the remaining duration of the
command. This is to simulate what happens when a hardware mouse is clicked. To turn
this functionality off and go back to what was in place before, simply select the, 'Bypass
Mouse Targeting' option on the options screen.
Targeting helpers
Commands that are executing are aware of their process target. There are couple of
options to note on the command screen: 'Stop command if target window focus is lost'
and, 'Resume command if focus is regained'. 'Stop command if target window focus is lost'
will stop the command completely if the process target's focus is lost. If you select,
'Resume command if focus is regained', the command will be paused until the process
target is active again.
A related feature that has the potential to change the process target is the automatic profile
switching feature. We won’t go into any detail here about that, but it's worth mentioning.
Troubleshooting Guide
This section is going to be updated frequently, so, check back. Also, if this guide does not
help you, please visit our forums at http://groups.google.com/group/voiceattack
Almost every single issue with VoiceAttack will have to do with VoiceAttack not hearing or
understanding your commands.
Here are some things I've found while using VoiceAttack over the last year or so...
VoiceAttack not listening at all (Level bar on the main screen is not moving):
1) Make sure your microphone is plugged in all the way (this gets me just about every
time).
2) Make sure your microphone switch is on. This is sometimes located on the cord of
your headset.
3) Make sure the volume of your microphone is adequate. Also, make sure that it is not
muted in Windows.
Additional places to look:
If you are using Microsoft Windows Vista/7/8, go into Control Panel & run the 'Sound'
app.
Select the recording tab. Select your input device (will have a green checkmark next to
it).
Go to the levels tab. Make sure the volume is adequate (mine is up all the way). If
there is a balance button, click it. Make sure that the microphone channels are at
adequate levels (mine are both up all the way).
In XP, go to the 'Sounds and Audio Device Properties' app. Click the 'Audio' tab &
make sure the proper device is selected in the drop down list. Click on the 'Volume'
button to make adjustments to the volume.
Even more:
If you are using Microsoft Windows Vista / 7 / 8, go into Control Panel and run the
'Speech Recognition Options' app.
Select the 'Set up microphone' link. Follow the instructions indicated to set up your
microphone.
VoiceAttack is not understanding commands (Level bar is moving, but, VoiceAttack is
not recognizing what I say):
1) Make sure your microphone levels are adequate as outlined above.
2) Make sure that the speech recognition engine is trained to your voice. This sounds a
bit tedious, but, it will make a world of difference in how well VoiceAttack can
understand you & will add levels of fun to your VoiceAttack experience. Seriously... I
can't stress this enough. If you are using Microsoft Windows Vista / 7, go into Control
Panel and run the 'Speech Recognition Options' app. Click on the 'Train your
computer to better understand you' link. I did it three times. I don't know if doing it that
many times was overkill, but, it certainly made things work really well.
3) Check to see if VoiceAttack is 'Listening'. It's a big button on the main screen on the
right side. If it says, 'Not Listening', you need to click it :)
4) Make sure VoiceAttack is not already running a long or huge macro. You will see
indication of this in the recognition log on the main screen (big, white list looking thing).
Click the 'Stop Commands' button to halt your macro if you need to.
5) Are you using the right profile? Sometimes I'll switch to a different profile and forget
that I did. Switch back over to the right profile :) (Note : this is for non-trial version only.
There is only one profile in the trial version.)
6) Is your environment fairly quiet? Sometimes your chatty or noisy house mates will
confuse VoiceAttack.
7) Take a look at the recognition log on the main screen. What does VoiceAttack 'think'
you are saying? You might have to make adjustments to your command (given that
you have trained up the speech recognition engine as outlined above). Just a note...
we have thick accents down here in Texas. Sometimes what I am saying is not
recognizable even by other humans :)
8) Out on a limb... make sure you didn't change to a speech engine that you did not train
up (you'll find this on the options page). Try switching to 'System Default'.
9) Even more out on a limb... Make sure you are not running any kind of voice-altering
software (you know the kinds that make you sound like an alien or an orc or whatever).
Depending on your software, these effects may be passed straight into VoiceAttack,
which, in turn, will probably not recognize what is being said.
VoiceAttack is recognizing what I am saying (commands are showing up in the log),
but, nothing is happening in my game.
Occasionally, you may have to adjust your commands in VoiceAttack to work with certain
games. Here are some things you will want to try:
The most common issue is that VoiceAttack is sending key presses too quickly to your game.
If a game is polling for input at a specific time, and, VoiceAttack's key press does not coincide
with that polling, the game will simply not catch it. To fix this, you need to increase the
amount of time a key is held down before releasing (see, 'Key Press Screen' – 'Hold down for
X seconds' option). A good place to start is 0.10 seconds. Try increasing and decreasing this
number to see what works best.
Another common, frustrating issue is that some games or apps will require VoiceAttack to be
run in Administrator mode to allow interaction. To run VoiceAttack in Administrator mode, do
the following:
Locate the file called, 'VoiceAttack.exe' (usually in C:\Program Files (x86)\VoiceAttack folder).
Right-click on the file and select, 'Properties'. Go to the, 'Compatibility' tab and then check
the, 'Run as Administrator' box. Click, 'OK' and then run VoiceAttack.
One last thing to check is to make sure VoiceAttack is sending input to the right place. Verify
that your commands are being sent to the proper process, or, to the Active Window (see,
'Voice Attack's Main Screen' – 'Send commands to' option).
As always, if none of these methods work, please check out the VoiceAttack user forums :)
For fun... maybe
Welcome to the end of the help document. Thanks for reading my mishmash that´s been
growing for several years :) Some extra things thrown in, just for fun (or not) will be down
here as I add them (or recall that I added them and neglected to document).
Command line parameter, '-toggledark' was added as a test. Puts the main screen in, 'dark
mode'. Calling this from the command line always affects the running process, so, you can
have a shortcut on your desktop that just changes the running instance's color mode.
Command line parameter, '-opacity' was also added as a test. Passing a value of 0 to 100
affects the main screen's opacity level. 100 = not transparent at all, 0 = fully transparent.
Example: -opacity 75 sets the opacity at 75%.
To override the default on/off sounds in VoiceAttack (listening on/off, joysticks on/off, etc), just
add a valid .wav file called, 'sys_on.wav' and/or a file called, 'sys_off.wav' to the same
directory that VoiceAttack.exe is located (usually C:\Program Files (x86)\VoiceAttack). These
must be valid .wav files... if an error is encountered, the sounds are reverted back to the
default sounds.
If you add a file called, 'header.png' to the VoiceAttack.exe folder, the header bar on most
windows will use that image as the background, tiled. Not sure how this will look for you, but I
tried it with an image with 500 pixels and and image with 5 pixels and it seems alright. Your
mileage may vary, of course. Make sure your image jives with the icon colors and header
text...
or you won’t be able to see them (again... this must be a valid .png file, however, I
tried renaming a .jpg file to header.png and it worked... lol). If an error is encountered, it just
reverts to the original black.
Holding down CTRL while double-clicking the gear icon in the top-left of the main screen
changes to, 'camo' mode. My kid liked it... you might too ;) To go back, just do it again.
If you want to back up your VoiceAttack.dat file (the file that holds ALL your profiles), it is
usually located in C:\Users\YOUR_USER_NAME\AppData\Roaming\VoiceAttack.
The, 'Backup' directory located in
C:\Users\YOUR_USER_NAME\AppData\Roaming\VoiceAttack holds up to the last ten
changes made to your VoiceAttack profiles. To roll back to a previous change, simply move
any one of the files out of the Backup directory up into the
C:\Users\YOUR_USER_NAME\AppData\Roaming\VoiceAttack directory and replace the
current VoiceAttack.dat. You'll probably never ever use this, but it's there if you need it ;)
Was this manual useful for you? yes no
Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Download PDF

advertising