Lesson 5 -- Alternatives to Inline Grammars

In this tutorial, we have been writing our own inline grammars, and we will continue to do so. When you are writing your own applications in the future, however, there are ways you can avoid the need to write your own grammars.

This lesson explores three alternatives to the inline grammars that we have been using. In addition, a method for testing these alternatives will be presented.

When the grammar you need for a VoiceXML application is very simple, you can elect to not use a grammar at all, but to use <option> elements instead.

When the grammar you need for an application is complex, you can save a lot of development time by using a grammar that has been written, tested, and debugged by someone else. One way you can do this is to use a grammar that has been built into the VoiceXML platform itself. Another way is to use a grammar written by Tellme that can be referenced by the general public.

This lesson includes the following topics:

  • The <option> element

  • Built-in grammars

  • Tellme public grammars

  • A VoiceXML application for testing grammars

The <option> element

You can replace very simple and unambiguous grammars with a set of <option> elements, as is discussed in https://msdn.microsoft.com/en-us/library/ff929038.aspx. When you do this, you do not need to write a grammar at all. For example, if you are asking the caller to choose one of three California destinations, you could use these three statements where you would otherwise have placed a grammar (you can test this by putting these three lines in the test application where it says "your grammar goes here").

   <option value="lax"> Los Angeles </option>
   <option value="san"> San Diego </option>
   <option value="sfo"> San Francisco </option>

The string in the value attribute is assigned to the field variable when a recognition match occurs. To see this, insert this code in the test application below and run the application. If the caller says "San Francisco", sfo is placed in the result variable.

Note

If the value attribute is absent the content of the <option> element (e.g., Los Angeles), stripped of leading and trailing white space, is assigned to the field variable.

DTMF can also be used (with or without voice response):

   <option dtmf="1" value="lax"> Los Angeles </option>
   <option dtmf="2" value="san"> San Diego </option>
   <option dtmf="3" value="sfo"> San Francisco </option>

Now, to return sfo, the caller can either say "San Francisco" or press 3.

It is also possible to use DTMF alone:

   <option dtmf="1" value="lax"/> 
   <option dtmf="2" value="san"/> 
   <option dtmf="3" value="sfo"/> 

Here, lax, san, or sfo is assigned to the field variable when 1, 2, or 3 is pressed.

Another variation is:

   <option dtmf="1"/> 
   <option dtmf="2"/> 
   <option dtmf="3"> 

Here, 1, 2, or 3 is assigned to the field variable.

Note

An accept attribute and the <enumerate> element can be used with <option> elements in the same way they are used with <choice> elements, as was discussed in Lesson 3 - Menus.

Builtin grammars

The VoiceXML 2.x specifications require that the platform provides grammars for a variety of very common situations. There are seven such "builtin" grammars: boolean, date, digits, currency, number, phone, and time. These grammars are activated by including a type attribute for the <field> element. For example,

<field name="result" type="date">

See https://msdn.microsoft.com/en-us/library/ff929046.aspx for further details.

When you use a builtin grammar, you do not need to include an inline or referenced grammar in your form.

Builtin Grammar type Attribute

Expected Utterance

Return String

boolean

Expects an affirmative or negative. DTMF digits 1 and 2 are supported for yes and no.

The result is true or false.

date

Expects a date spoken as month, day, and year by the caller. The caller can also input the date using DTMF in the following format: yyyymmdd.

The result is a fixed-length date string formatted as yyyymmdd. For example, if the caller utters June 18, 1970, the Platform returns "19700618". If a part of the date was not uttered by the caller, it is returned as question marks (?). For example, if the caller utters "June 1970", the date returned is "197006??".

digits

Expects one or more individual digits (0-9) from the caller.

The result is a string of concatenated digits. For example, if the caller utters "1" "5" "0", the Platform returns "150".

currency

Expects a currency. For DTMF input, the star key (*) acts as a decimal point. Amounts are limited to ten million dollars.

The result is a concatenated string prefixed by the standard currency indicator (http://www.id3.org/ISO_4217) if spoken by the caller. For example, if the caller utters "150 US Dollars and 95 cents", the Platform returns "USD150.95".

number

Expects a number. For example, the caller can say "one hundred and fifty", "thirty-nine point five", or "negative twenty-three". For DTMF input, the star key (*) acts as a decimal point.

The result is a string of concatenated digits, optionally including a decimal point.

phone

Valid spoken inputs include phrases that specify a phone number. For DTMF input, the star key (*) acts as an "x" and indicates an extension.

The result is a string containing a telephone number consisting of a string of digits and optionally containing the character "x" to indicate a phone number with an extension. For North America, a result could be "8005551234x789". If the field is subsequently used in <say-as> with the interpret-as value "vxml:phone", it will be spoken as a phone number appropriate to the current language.

time

Expects the time, including hours and optionally minutes, and AM or PM. The caller can input the time using DTMF in the following format: hhmm. DTMF input does not support AM or PM.

The result is a time string formatted as hhmmx where x is "a", "p", "h", or "?" to indicate AM, PM, military, or an ambiguous time. DTMF input does not support AM or PM. If, for example, the caller says "one-thirty p m", the result is "0130p." If the caller types "1300", the result is "1300h." If the caller says "one", the result is "0100".

Important

You should use the test application below to explore a builtin grammar before you use it so that you can determine what it accepts for input and what it returns for each caller utterance. Only then will you know how to write an effective prompt and how to deal with the returned string. For example, if you plan to use type="date" (don't forget to change the <field> element to read <field name="result" type="date">), try various utterances and make a table like this:

Utterance

Returned String

March 15th, 1962

"19620315"

March, 1962

"19620319" (wrong!-interprets as March 19, '62)

3-15-62

"19620315"

March 15th

"????0315"

March

"????03??"

3-15

"????0315"

1962

no result or various nonsense results

You can see from the test that the builtin date grammar is quite flexible. However, it does not work for the year alone or the month and year alone, so you would not want to use it to ask a caller for the month and year (or just the year) of their birth. On the other hand, you can ask for the month and day of birth or the full birth date.

Note

The builtin grammars, which are in compliance with the W3C specifications for VoiceXML 2.x, are somewhat limited. The Tellme public grammars, described below, are more flexible.

Tellme public grammars

Tellme has written and tested a number of frequently needed grammars that can be referenced by the general public.

Name

Description

URI

Confirm

Recognizes responses to "is that correct?"

http://grammar.svc.tellme.com/yesno/amss/v2/confirm.grxml

Confirm (DTMF)

Press 1 for yes, 2 for no.

http://grammar.svc.tellme.com/yesno/confirm-dtmf.grxml

WouldYou

Recognizes responses to "would you .....?" Example: "Would you like to make a reservation now?"

http://grammar.svc.tellme.com/yesno/mss/v1/wouldyou.grxml

AreYou

Recognizes responses to "are you.......?" Example: "Are you the named insured?"

http://grammar.svc.tellme.com/yesno/mss/v1/areyou.grxml

Dunno

Recognizes various forms of "I don’t know."

http://grammar.svc.tellme.com/dunno/mss/v1/dunno.grxml

Date

Recognizes a variety of date formats.

http://grammar.svc.tellme.com/date/mss/v1/date.grxml

Date (DTMF)

Recognizes a variety of date formats.

http://grammar.svc.tellme.com/date/date-dtmf.grxml

Birthdate

Recognizes month, day, and year.

http://grammar.svc.tellme.com/birthdate/mss/v1/birthdate.grxml

Birthdate, month and day only

Recognizes month and day only.

http://grammar.svc.tellme.com/birthdate/mss/v1/monthday.grxml

Natural numbers through 9

Recognizes spoken natural numbers 0 through 9. Other grammars that require numbers (e.g. credit card grammars) use this grammar.

http://grammar.svc.tellme.com/naturalnumber/mss/v1/natural_numbers_thru_9.grxml

Natural numbers through 99

Recognizes spoken natural numbers 0 through 99. Other grammars that require numbers (e.g. currency grammars) use this grammar.

http://grammar.svc.tellme.com/naturalnumber/mss/v1/natural_numbers_thru_99.grxml

Natural numbers through 999

Recognizes spoken natural numbers 0 through 999.

http://grammar.svc.tellme.com/naturalnumber/mss/v1/natural_numbers_thru_999.grxml

Natural numbers through 9999

Recognizes spoken natural numbers 0 through 9999.

http://grammar.svc.tellme.com/naturalnumber/mss/v1/natural_numbers_thru_9999.grxml

SSN

Recognizes a nine-digit social security number.

http://grammar.svc.tellme.com/ssn/mss/v1/ssn.grxml

SSN (DTMF)

Recognizes a nine-digit social security number.

http://grammar.svc.tellme.com/ssn/ssn-dtmf.grxml

Percentage

Recognizes integers or floating point numbers with two decimal places from zero to one hundred.

http://grammar.svc.tellme.com/percentage/mss/v1/percentage.grxml

Time

Recognizes a numeric time, am or pm, time zone, and relative time (morning, afternoon, or evening).

http://grammar.svc.tellme.com/time/mss/v1/time.grxml

Military time (24 hour clock)

Recognizes military time. Passes an h to the am_pm slot to differentiate from regular time.

http://grammar.svc.tellme.com/time/mss/v1/military_time.grxml

Phone number

Recognizes seven or ten digit U.S. telephone numbers.

http://grammar.svc.tellme.com/phonenumber/mss/v2/phonenumber.grxml

-or-

http://grammar.svc.tellme.com/phonenumber/mss/v2/phonenumber.grxml#SevenOrTenDigits

Phone number (DTMF)

Recognizes seven or ten digit U.S. telephone numbers.

http://grammar.svc.tellme.com/phonenumber/phonenumber-dtmf.grxml

Phone number, seven digits

Recognizes seven digit U.S. telephone numbers.

http://grammar.svc.tellme.com/phonenumber/mss/v2/phonenumber.grxml#SevenDigits

Phone number, seven digits (DTMF)

Recognizes seven digit U.S. telephone numbers.

http://grammar.svc.tellme.com/phonenumber/phonenumber-dtmf.grxml#SevenDigits

Phone number, ten digits

Recognizes ten digit U.S. telephone numbers.

http://grammar.svc.tellme.com/phonenumber/mss/v2/phonenumber.grxml#TenDigits

Phone number, ten digits (DTMF)

Recognizes ten digit U.S. telephone numbers.

http://grammar.svc.tellme.com/phonenumber/phonenumber-dtmf.grxml#TenDigits

Street number

Recognizes address numbers assigned to buildings.

http://grammar.svc.tellme.com/streetnumber/mss/v1/streetnumber.grxml

Apartment number

Recognizes additional identifiers, such as apartment, suite, unit, or floor numbers.

http://grammar.svc.tellme.com/apartmentnumber/mss/v1/apartmentnumber.grxml

PO Box number

Recognizes a U.S. post office box number with optional letter identifier.

http://grammar.svc.tellme.com/poboxnumber/mss/v1/poboxnumber.grxml

Zip code

Recognizes a 5-digit U.S. zip code.

http://grammar.svc.tellme.com/zipcode/mss/v1/zipcode.grxml

Zip code (DTMF)

Recognizes a 5-digit U.S. zip code.

http://grammar.svc.tellme.com/zipcode/zipcode-dtmf.grxml

Postal code (Canada)

Recognizes a 6-string alphanumeric Canadian zip code.

http://grammar.svc.tellme.com/postalcode/mss/v1/canadian_postalcode.grxml

Countries

Recognizes all countries. Recognizes both United Kingdom and Great Britain

http://grammar.svc.tellme.com/countries/mss/v1/countries.grxml

Letters in sequence

Recognizes letters of the alphabet, spoken in sequence.

Root rule recognizes an indeterminate number of letters.

Has individual rules for one, two, ......, ten letters.

Also recognizes responses such as "a as in apple, b as in boy, and so forth."

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml#one_letter

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml#two_letters

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml#three_letters

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml#four_letters

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml#five_letters

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml#six_letters

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml#seven_letters

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml#eight_letters

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml#nine_letters

http://grammar.svc.tellme.com/lettersequence/mss/v1/manyletters.grxml#ten_letters

The following table lists typical utterances for the Tellme grammars and the strings that the grammars return for those utterances.

Name

Typical Utterance

Returned String

Confirm

sure

wrong

"yes"

"no"

Confirm (DTMF)

1

2

"yes"

"no"

WouldYou

yes, I would

no, I wouldn't

"yes"

"no"

AreYou

sure

that's not right

"yes"

"no"

Dunno

I don't know

"dunno"

Date

April 15, 2010

"day=^date=15^month=04^year=2010^special_date="

day means day of week

special_date can be last, next, tomorrow, or yesterday

Date (DTMF)

2010 4 15

"year=2010^month=04^date=15"

Birthdate

June third nineteen sixty seven

"06-03-1967"

Birthdate, month and day only

June third

"06-03"

Natural numbers through 9

zero

two

"0"

"2"

Natural numbers through 99

forty two

ninety

"42"

"90"

Natural numbers through 999

two hundred and ten

five hundred

"210"

"500"

Natural numbers through 9999

five thousand, four hundred and twelve

"5412"

SSN

five five five four four three two three two

555443232

SSN (DTMF)

5 5 5 4 4 3 2 3 2

555443232

Percentage

twelve

twelve percent

four point six six

four point nine

four point nine percent

"12"

"12"

"4.66"

"4.9"

"4.9"

Time

two fifteen pm, Pacific Standard Time

nine in the morning

"hour=2^minute=15^am_pm=pm^zone=pacific"

"hour=9^minute=00^special=morning"

Military time (24 hour clock)

fifteen hundred

nineteen hundred ten

"hour=15^minute=00^am_pm=h"

"hour=19^minute=10^am_pm=h"

Phone number

seven oh seven two two four one one seven one

two two four one one seven one

"7072241171"

"2241171"

Phone number (DTMF)

7 0 7 2 2 4 1 1 7 1

2 2 4 1 1 7 1

"7072241171"

"2241171"

Phone number, seven digits

two two four one one seven one

"2241171"

Phone number, seven digits (DTMF)

2 2 4 1 1 7 1

"2241171"

Phone number, ten digits

seven oh seven two two four one one seven one

"7072241171"

Phone number, ten digits (DTMF)

7 0 7 2 2 4 1 1 7 1

"7072241171"

Street number

thirty two forty one

four seven seven eight

"3241"

"4778"

Apartment number

apartment three A

floor two

"apartment:3A"

"floor:2"

PO Box number

thirty two A

one one four B

3496

"32A"

"114B"

"3496"

Zip code

nine four zero four one

oh one oh two five

"94041"

"01025"

Zip code (DTMF)

9 4 0 4 1

0 1 0 2 5

"94041"

"01025"

Postal code (Canada)

K one A zero B one

"K1A0B1"

Countries

Great Britain

United Kingdom

Spain

Trinidad and Tobago

great_britain

united_kingdom

spain

trinidad_and_tobago

Letters in sequence

C-l-a-i-r-e

C as in cat, l as in lemon, a as in apple, I as in igloo r as in rabbit, e as in elephant

"claire"

Important

As with the builtin grammars, you should use the test application to try various utterances for grammars you plan to use, so that you can see what works and what the return values are. If you were testing the date grammar or the birth date grammar, for example, you would find that the recognizer tries to interpret your utterance as a month and day if you say only a year. For utterances of only a year, you need to use another grammar such as "natural numbers through 9999".

A VoiceXML application for testing grammars

Here is a simple VoiceXML application that we can use to test grammars. It is especially useful with builtin and Tellme public grammars where we may not know:

  • exactly what utterances will produce a match.

  • exactly what the return values will be when there is a match.

For example, both the builtin and Tellme public grammars include a date grammar. But what must a caller say to get a match? Here are some possibilities:

  • March 27 1989

  • March 27 89

  • 3 27 1989

  • 3 27 89

  • twenty seventh of march

  • 1989

It is important to know which of these utterances will produce a match. The VoiceXML test application below will allow us to try all of these different utterances (and more) to see which ones work.

It is also important to know what the grammar returns.

The builtin date grammar returns the string "19890327".

The Tellme date grammar returns "day=^date=27^month=03^year=1989^special_date=". Here, day is the day of the week and special_date can be yesterday, tomorrow, last (as in last Wednesday), or next (as in next Tuesday).

The test application is designed to show these return values.

The test application

<?xml version="1.0"?>
<vxml version="2.1" revision="4"
xmlns="http://www.w3.org/2001/06/grammar"
xml:lang="en-US">
<link event="event.onquit">
    <grammar version="1.0" root="top">
      <rule id="top">
        <item>quit</item>
      </rule>
    </grammar>
  </link>
  <catch event="event.onquit">
    <exit/>
  </catch>
<form id="mainDialog">
<field name="result">
<prompt>please say something <break/> or say <break size="small"/>
              quit <break size="small"/> to exit.
      </prompt>
      <!-- your grammar goes here -->

      <catch event="noinput nomatch">
         Sorry. Didn't get that. Please try again.
         <reprompt/>
      </catch>

      <filled>
   <log>raw data = <value expr="result"/></log>
         Thank you.
         <clear namelist="result"/>
      </filled>
      <noinput> I didnt hear you </noinput>
      <nomatch> I didnt get that </nomatch>
</field>
</form>
</vxml>

<option> elements can be inserted where the code says "your grammar goes here."

For builtin grammars—you add a type attribute to the result field. For example: type="date" or type="currency".

Links to external Tellme grammars can be inserted where the code says "your grammar goes here." For example:

<grammar src="http://grammar.svc.tellme.com/date/mss/v1/date.grxml"/>

This short VoiceXML application has some features that have not been discussed previously:

  • <clear namelist="result"/> in the <filled> element causes the form interpretation algorithm (FIA) to revisit the result field again. Every time the result field is revisited, the application will prompt for input again. This means that the application will ask for input again after each match or each failed match, so that you can test a variety of different utterances during one phone call. The FIA and the <clear> element will be explained in Lesson 7.

  • The <link> element and the following <catch> element at the beginning of the application allow the caller to end the connection at any time by saying "quit." This is helpful because the application would continue reprompting otherwise. Of course you can also exit the application by hanging up. The <link> and <catch> elements will be covered in Lesson 10.

  • The <noinput> and <no match> elements allow the application to keep reprompting if there is either no input or there is input that does not produce a match. Both of these elements will be covered in Lesson 10.

  • The <log> element is used to write the match result (which is placed in the variable result) to the debug log so that you can see exactly what was returned for each different utterance you test.

What's next?

In this lesson, we have introduced you to three alternatives to using inline grammars. Two of these alternatives (builtin and Tellme grammars) involve grammars that were created by someone other than yourself.

Lesson 6, which follows, covers some important odds and ends that you need to know about. The following subjects are included:

  • Form items

  • Properties

  • Confirmation prompting

Do you need to read Appendix B?

Many of the builtin and Tellme grammars return strings with concatenated sets of digits. You often need to use JavaScript to retrieve the information you want from these strings. If you are not familiar with JavaScript, and regular expressions in particular, you may want to read Appendix B -- Processing Grammar Returns.

Appendix B shows you how to extract the information you want from the strings that are returned from builtin and Tellme grammars. For example, a date grammar might return the string "19960428" representing April 28, 1996. How do you isolate the year, month, and day from this string? Appendix B will show you how to do it.