In a machine-directed application, the computer controls all interactions by sequentially executing each form item a single time.
However, VoiceXML also supports mixed-initiative applications in which either the system or the user can direct the conversation. This is done using a combination of form level grammars to control user input and <initial> elements to specify prompts.
Form-level grammars allow a greater flexibility and more natural responses than field-level grammars because the user can fill in the fields in the form in any order and can fill more than one field as a result of a single utterance. For example, the following city/state grammar:
<?xml version="1.0" encoding="ISO-8859-1"?>
<grammar version="1.0" xmlns="http://www.w3.org/2001/06/grammar"
xml:lang="en-US" mode="voice" root="citystate" tag-format="semantics/1.0">
<rule id="citystate">
<one-of>
<item>
<ruleref uri="#cityfirst"/>
<tag>
$.city = $cityfirst.city;
if ( typeof ( $cityfirst.state ) != "undefined" )
$.state = $cityfirst.state;
</tag>
</item>
<item>
<ruleref uri="#statefirst"/>
<tag>
$.state = $statefirst.state;
if ( typeof ( $statefirst.city ) != "undefined" )
$.city = $statefirst.city;
</tag>
</item>
</one-of>
</rule>
<rule id="cityfirst">
<item>
<ruleref uri="#citylist"/> <tag>$.city = $citylist;</tag>
</item>
<item repeat="0-1">
<ruleref uri="#statelist"/> <tag>$.state = $statelist;</tag>
</item>
</rule>
<rule id="statefirst">
<item>
<ruleref uri="#statelist"/><tag>$.state = $statelist;</tag>
</item>
<item repeat="0-1">
<ruleref uri="#citylist"/> <tag>$.city = $citylist;</tag>
</item>
</rule>
<rule id="citylist" scope="public">
<one-of>
<item>San Francisco</item>
<item>New York</item>
<item>Los Angeles</item>
<item>Boca Raton</item>
</one-of>
</rule>
<rule id="statelist" scope="public">
<one-of>
<item>California</item>
<item>New York</item>
<item>Florida</item>
</one-of>
</rule>
</grammar>
can be used with this VoiceXML document:
<?xml version="1.0" encoding="iso-8859-1"?>
<vxml version="2.0" xmlns="http://www.w3.org/2001/vxml" xml:lang="en-US">
<form id="getinfo">
<grammar src="citystate.grxml"/>
<initial name="start">
<prompt>City and state please.</prompt>
<noinput><reprompt/></noinput>
<nomatch count="2">
<prompt>
Sorry, I am having trouble understanding you. Let's try one piece of
information at a time.
</prompt>
<reprompt/>
<assign name="start" expr="true"/>
</nomatch>
</initial>
<field name="city">
<prompt>
Please say the name of a city.
</prompt>
<grammar src="citystate.grxml#citylist"/>
<filled>
<prompt>
The city is <value expr="city"/>
</prompt>
</filled>
</field>
<field name="state">
<prompt>
Please say the name of a state.
</prompt>
<grammar src="citystate.grxml#statelist"/>
<filled>
<prompt>
The state is <value expr="state"/>
</prompt>
</filled>
</field>
<filled>
<prompt>
Thank you. The city and state are <value expr="city"/>,
<value expr="state"/>.
</prompt>
</filled>
</form>
</vxml>