Level 3: Advanced Prompts and Responses

As Level 1 or 2 courses get larger, the designer usually notices after a while that they are typing a great many lines that look more or less the same. A Prompt unit may contain many similar Response lines; the problem is that different variants multiply out, for example different ways of asking for something (“I would like”/”Could I have”/”Do you have”) and politeness (“please”/nothing). It is also normal to find that there are many similar Prompt units; a Prompt which tells the student to ask for a coffee is probably going to be very similar to one which tells them to ask for a tea.

Level 3 introduces three methods for addressing these issues: a simple version of regular expressions, templates, and phrases. We’ll look at these in order. We’ll also show how to add audio help files and lesson help files, and how to adjust the system feedback

Regular expressions

Regular expressions allow the course designer to reduce the number of Response lines. For example, the designer can simplify the two lines

Response i would like a coffee
Response i would like a coffee please

to the single line

Response i would like a coffee ?please

where the optional part, please, is tagged with a question-mark. Any phrase can be marked as optional by enclosing it in parentheses; so for example

Response i would like a ?(cup of) coffee ?please

is a short way to write the four responses

Response i would like a coffee
Response i would like a coffee please
Response i would like a cup of coffee
Response i would like a cup of coffee please

Similarly, the three lines

Response could i have a single room
Response do you have a single room
Response i need a single room

can be written as the single line

Response ( could i have | do you have | i need ) a single room

where the alternatives are enclosed inside parentheses and separated by vertical bars.

Templates

If the course contains several similar Prompt units, e.g.

Prompt
Lesson         restaurant
Group          drink
Text/french    Dis : tu voudrais un café
Response       ( i would like | could i have ) a coffee
EndPrompt

Prompt
Lesson         restaurant
Group          drink
Text/french    Dis : tu voudrais un thé
Response       ( i would like | could i have ) a tea
EndPrompt

Prompt
Lesson         restaurant
Group          drink
Text/french    Dis : tu voudrais un coca
Response       ( i would like | could i have ) a coke
EndPrompt

a PromptTemplate allows the desiger to write the part they share once and then reuse it:

PromptTemplate ask_for_drink FRENCH ENGLISH
Lesson         restaurant
Group          drink
Text/french    Dis : tu voudrais FRENCH
Response       ( i would like | could i have ) ENGLISH
EndPromptTemplate

ApplyTemplate ask_for_drink "un café" "a coffee"
ApplyTemplate ask_for_drink "un thé" "a tea"
ApplyTemplate ask_for_drink "un coca" "a coke"

Here, the name of the template is ask_for_drink; the name can be any word which does not include spaces. The two arguments are FRENCH and ENGLISH. A template can have any number of arguments. It is usually advisable (though not required) for the arguments to be written in capital letters. The important thing is that there should be no possibility of confusing an argument with a normal piece of text in the body of the template.

Each of the ApplyTemplate lines consists of the word ApplyTemplate, followed by the word ask_for_drink (the name of the template), followed by two pieces of text enclosed in quotation marks. There has to be one piece of text in quotes for each argument. The meaning of the ApplyTemplate line is “Take the named template, and substitute each of the following pieces of text for the arguments”. So:

ApplyTemplate ask_for_drink "un café" "a coffee"

means “Take the template ask_for_drink, and substitute un café for FRENCH and a coffee for ENGLISH. This gives the result:

Prompt
Lesson         restaurant
Group          drink
Text/french    Dis : tu voudrais un café
Response       ( i would like | could i have ) a coffee
EndPrompt

It is often convenient to put the ApplyTemplate lines immediately after the definition of the template, but there is no requirement to do so.

Systematic use of regular expressions and templates can reduce the size of the course description file a great deal, typically shortening it by a factor of ten or even more for large courses.

Nested templates

Sometimes, you don’t want the pattern described by the template to cover a whole Prompt, or you want to define a pattern which you can use in several PromptTemplate units. In cases like these, you can write a plain Template, which just specifies a number of lines. These lines can be used inside a Prompt, a PromptTemplate or even another Template.

Here is an example. In a substantial English course, there may be a number of PromptTemplate units ìn which the student is told to ask for something. The allowed response syntax will overlap heavily: usually, you will want to allow “I would like X”, “I want X”, “Could I have X”, and so on. For some kinds of request, there may also be other ways of asking that are specific to that request. A nested Template declaration lets us do this in a compact way:

Template  i_want FRENCH GERMAN ENGLISH
Text/french    Demande FRENCH
Text/german    Frag : GERMAN
Response       ENGLISH please
Response       ( can | could ) i have ENGLISH ?please
Response       could you ?please give me ENGLISH
Response       do you have ENGLISH ?please
Response       give me ENGLISH ?please
Response       have you got ENGLISH
Response       i am looking for ENGLISH
Response       i ( need | would like | want | will have | will take ) ENGLISH
EndTemplate

PromptTemplate i_want_a_room_for_period FRENCH GERMAN ENGLISH
Lesson         hotel
Group          room_for_number_of_nights
ApplyTemplate  i_want "une chambre pour FRENCH" "Zimmer für GERMAN" "a room for ENGLISH"
Response       i would like to stay for ENGLISH
EndPromptTemplate

ApplyTemplate i_want_a_room_for_period "1 semaine" "1 Woche" "one week"
ApplyTemplate i_want_a_room_for_period "2 nuits" "2 Nächte" "two nights"
ApplyTemplate i_want_a_room_for_period "3 nuits" "3 Nächte" "three nights"
...

In the above rules, the Template i_want defines a set of generally applicable ways to ask for something, along with generic French and German text prompts. The PromptTemplate i_want_a_room_for_period defines a pattern specifically for prompts where the student is told to ask for a room for a given number of nights. It uses the lines from i_want, and adds the line:

Response       i would like to stay for ENGLISH

which is specific to the case of asking for a hotel room. Finally, the ApplyTemplate lines define the actual Prompt units.

Note

Introduction of nested Template units is a powerful technique that can make your course much more compact. Overuse can however also make it hard to read and maintain, since it may not be straightforward to see how the templates expand out.

Using templates with multiple L1s

A problem that can easily arise in a course with more than one L1 is that certain prompts will not be available for all languages. For example, if Arabic is one of the L1s then the course designer may decide not to include prompts which refer to alcohol.

In order to handle this type of situation in a simple way, the compiler is set to ignore any prompt which contains the special phrase *NULL*. This means that you can write the template so that it by default will produce prompts for all the L1s, and then supply *NULL* as the value for the L1s which are to be omitted. For example, if we extended the example above to support prompts in both French and German but wished to omit the prompt for “coke” in French, we could do it as follows:

PromptTemplate ask_for_drink FRENCH GERMAN ENGLISH
Lesson         restaurant
Group          drink
Text/french    Dis : tu voudrais FRENCH
Text/german    Sag : Sie wollen GERMAN
Response       ( i would like | could i have ) ENGLISH
EndPromptTemplate

ApplyTemplate ask_for_drink "un café" "Kaffee" "a coffee"
ApplyTemplate ask_for_drink "un thé" "Tee" "a tea"
ApplyTemplate ask_for_drink "*NULL*" "eine Cola" "a coke"

Phrases

“Phrases” (technically, context-free grammar rules) make it possible to write large sets of alternatives in a compact way. For example, prompts in conversational lessons, like the ones immediately above, often involve using request phrases. Rather than constantly repeating a regular expression like

( could i have | could you give me | i would like | do you have )

it is possible to define a “phrase”, as follows:

Phrase
PhraseId $ask-for
Response could i have
Response could you give me
Response i would like
Response do you have
EndPhrase

After this, the expression $ask-for can be used to mean “any of the alternatives defined in the Phrase $ask-for”. Phrase names have to start with a dollar sign $.

Phrases are particularly useful for defining incorrect responses; as we saw in the pronunciation course from Level 1, it can often be a good idea to let the system recognise incorrect replies and alert the student to the fact that they are doing something wrong. Since there are, in general, many more ways to answer incorrectly than correctly, it can be necessary to define quite large sets of possible responses.

Coverage

The Coverage unit allows the course designer to specify a set of phrases which the system will be able to recognise; the convention is that all of them will be treated as incorrect responses to every prompt, unless they happen to duplicate responses explicitly marked as correct. So, for example in a lesson about dates, we might have the following Phrase and Coverage units:

Phrase
PhraseId $month
Response january
Response february
...
Response december
EndPhrase

Phrase
PhraseId $day-number
Response first
Response second
...
Response thirty-first
EndPhrase

Coverage
Response $month $day-number
Response the $day-number of $month
EndCoverage

Here, the Coverage unit defines all phrases like “March fifteenth” or “the twenty-second of April”.

Grammar levels

The Prompt and Coverage units define the set of phrases which the speech recogniser is aware of, but it is also necessary to specify just when a given phrase will be available. By default, the rule is that a phrase defined for a given lesson is available for the whole of the course that the lesson belongs to. Sometimes, however, the grammar writer may want to make the vocabulary more restrictive and only have phrases be available for the lesson in which they are defined. This can be done by adding a GrammarLevel line to the relevant Course unit:

GrammarLevel per_lesson

For consistency, if the course designer wishes to make the grammar-level explicit, they can also write:

GrammarLevel per_course

This is equivalent to having no GrammarLevel line.

Audio help files

In most courses, it’s a good idea to include examples of correct pronunciation which the student can imitate. There’s an easy way to do this using audio help files. For each prompt where you want to provide a spoken example, you record one or more audio files, for example using the Windows SoundRecorder tool. You then add a line in the Prompt unit which links to the file in question and gives a transcription (text saying what words you have in the file). The recorded audio help files are put in the course’s multimedia directory along with the other multimedia files. It’s generally a good idea to create a subdirectory under multimedia to hold the audio help files, but this is not obligatory.

For example, if we take a Prompt unit from the level 2 multimedia course, we could add an audio help line like this:

Prompt
Lesson         animals
Group          1
Multimedia     cat.png
Text/english   What is it?
Response       a cat
Response       it's a cat
AudioHelp      help/cat.wma It's a cat
EndPrompt

This says that there is a recorded help file help/cat.wma in the multimedia directory. When the help file is displayed on the screen, it will be shown with the text It's a cat.

The course at the end of this section shows a more elaborate example of adding audio help files.

Specifying the number of audio help examples shown

By default, the system shows one audio help example in response to a Help request. You are able to change this by adding a ShowHelp line to the Course unit. So for example if you add the line

ShowHelp       2

then the student will be shown two audio help examples, if at least two are defined.

If you add the line

ShowHelp       0

then the student will be shown no audio help examples.

If you wish to have different behavior in different lessons, it is possible to add a ShowHelp line in the Lesson unit. The system will take the value from the current lesson if it’s specified there, otherwise from the course.

Systematic recording of audio help files using LiteDevTools

The practical problem with recorded audio help is that keeping track of all the files involved is messy and error-prone, particularly if someone else is recording them for you. There is a way to do this efficiently using resources on the LiteDevTools page. The basic idea is that you don’t specify the names of the audio help files yourself: you just write the text, and then let the system assign the file names for you.

In more detail, here’s an example showing how it works. Let’s say I have a toy course called visual/visual1b with a couple of multimedia prompts which respectively show a picture of a cat and a picture of a dog, and you want to provide audio help. The prompt declarations look like this:

Prompt
Lesson         animals
Group          1
Multimedia     cat.jpg
Text/english   What is it?
Response       ?( it's ) a cat
AudioHelp      It's a cat
EndPrompt

Prompt
Lesson         animals
Group          1
Multimedia     dog.jpg
Text/english   What is it?
Response       ?( it's ) a dog
AudioHelp      It's a dog
EndPrompt

Note that the AudioHelp lines only have text in them - there is no file specified. Now when I upload the course to the server and run the Compile step, at the end of the trace output I see this notification:

--- Written blank audio output file (2 examples, 2 new) to z:/timissco/devel/litecontentcompilation/visual/visual1b/grammars/blank_audio.txt

COPYING BLANK AUDIO FILE TO z:/manny/GeneratedFiles/visual/visual1b/blank

If I look in my FTP directory, using FileZilla or some other FTP client, I can see the file blank_audio.txt sitting in the directory GeneratedFiles/visual/visual1b. I drag and drop it to a directory on my local machine. There isn’t actually any need to look at it, since I’m just going to pass it to LiteDevTools, but out of curiosity let’s see what’s there. As we expect, the contents list the audio files that need to be recorded:

AudioOutput help any_speaker any_file.wav It's a cat MISSING_FILE
AudioOutput help any_speaker any_file.wav It's a dog MISSING_FILE

Now I go to the LiteDevTools page and log in. (If you don’t already have a LiteDevTools account, you’ll need to create one for yourself). I click on Manage tasks under Recording and on the next screen click on Create new recording task. I get a dialogue that looks like this:

_images/NewRecordingScreenshot1.jpg

I browse to the place where I saved the blank audio file and select it, after which the dialogue is:

_images/NewRecordingScreenshot2.jpg

I fill in a name and check Create anonymous task:

_images/NewRecordingScreenshot3.jpg

When I click Save task and get link, the new task appears in the list:

_images/NewRecordingScreenshot4.jpg

I can now pass the link to someone and ask them to connect directly to LiteDevTools and record the audio files. (Because I chose “Create anonymous task”, they won’t need an account to be able to get in). When I visit my dashboard again, I see that the files have appeared:

_images/NewRecordingScreenshot5.jpg

I click on Results, which gives me the following menu:

_images/LDTMenuScreenshot.jpg

The first option lets me review the audio files to see if I like them. If I do, I choose the second option. This copies the audio file to the place where they are needed and lets me download a text file of metadata. (If I also wanted to download the actual audio files, so that I had them available on my own machine, I could have chosen the third option). The metadata file has two lines, which say what the contents of the new audio files are:

AudioOutput help any_speaker help/773_160603124916.wav It's a cat
AudioOutput help any_speaker help/774_160603124920.wav It's a dog

I copy this material to the end of the visual1b grammar file. Finally, I can upload the course again, and now I do indeed have audio help for the two prompts in question.

It is perhaps unnecessary to go through this process in order to record two files for a toy course. In a real course, which may require dozens or even hundreds of audio help files, it is a very efficient way to organize the recording work. The cycle can be repeated at any point, and the recording task will only include the new files that have appeared in the course since the last iteration.

Text help files

Sometimes, you may just want to include text help for a prompt. You do this by adding a TextHelp line. This shows the text in the help window, but does not have any associated audio file. If we wished to rewrite the example immediately above using text help instead of audio help, the result might be as follows:

Prompt
Lesson         animals
Group          1
Multimedia     cat.png
Text/english   What is it?
Response       a cat
Response       it's a cat
TextHelp       Say: It's a cat
EndPrompt

Note

At the moment, the system shows audio help if it is available, and if it is not available shows text help. This behavior may be changed in the future so as to allow the course designer to control the way help is shown to the student.

Lesson help files

Sometimes you may want also to include written content with your lesson, perhaps to explain some grammar or just to clarify how the student is meant to respond to the prompts. You can do this by declaring a help file with the lesson. Help files are HTML files which need to be put in the doc subdirectory for the course. A typical help file declaration looks like this:

Lesson
Name           present_tense
PrintName      Learn the present tense
HelpFile       present.html
EndLesson

Here, the Lesson unit defines a lesson called present_tense and associates it with the help file present.html. The file present.html might have the following content:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">
 <head>
  <link rel="stylesheet" type="text/css" href="style.css" />
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />

  <title>The present tense</title>

 </head>
 <body>
<table width="330" border="0">
  <tr>
    <td>&nbsp;</td>
    <td><h1>The present tense in English</h1>
      <hr/>
      <p>For almost all verbs, the present tense in English has two forms</p>
      <ul>
        <li>The base form</li>
        <li>The third person singular</li>
      </ul>
        <hr/>
      <h2>The base form</h2>
      <p align="justify">The base form is the form used for the first person, the second person and the third person plural, for example <i>run</i>.</p>
      <hr/>
      <h2>The third person singular</h2>
      <p align="justify">The third person singular is different, and adds an <i>s</i> to the base form, for example <i>runs</i>.</p>
</table>
</body>
</html>

Sometimes, you may want to have different versions of the help file for different student languages. You can do it as follows:

Lesson
Name              present_tense
PrintName         Learn the present tense
HelpFile/english  present_english.html
HelpFile/chinese  present_chinese.html
HelpFile/arabic   present_chinese.html
EndLesson

Punctuation in Responses

It’s sometimes convenient to be include punctuation when writing Response lines, in particular if you are copying them from normal text. In these circumstances, you may find the restriction that Responses must be lower-case with no punctuation annoying and time-consuming.

You can include normal text in Responses if you include the line:

Declaration IgnorePunctuationInResponses

somewhere in your course. (You’ll most likely want to put it near the beginning). You can then write Prompts like the following, where the student is asked simply to repeat the prompt text:

Prompt
Lesson         dickens
Group          1
Text/english   It was the best of times, it was the worst of times.
Response       It was the best of times, it was the worst of times.
AudioHelp      It was the best of times, it was the worst of times.
EndPrompt

Since the prompt, response and audio help are all the same in a course of this kind, it is natural to use a Template:

PromptTemplate line LESSON NUMBER LINE
Lesson         LESSON
Group          NUMBER
Text/english   LINE
Response       LINE
AudioHelp      LINE
EndPromptTemplate

ApplyTemplate line "dickens" "1" \
"It was the best of times, it was the worst of times."

Note

The downside of including this declaration is that all punctuation marks are stripped out of the Response by the compiler. This means that you will not for example be able to use the character ? to indicate an optional element.

Adjusting system behaviour

This section describes a few tricks you can use to change the way the system responds.

Changing the type of recognition feedback

You can customize recognition feedback using a RecMessage line. This can be put either in the Course unit, a Lesson unit, or both, with the Lesson unit taking precedence over the Course unit. A typical line might be

RecMessage     I think I heard "RECRESULT"

This means that the system will for example display the text

I think I heard "A cat"

where normally it would have displayed

A cat

If you have an empty RecMessage line, i.e. just

RecMessage

then the system displays no recognition result.

It’s possible to have different messages for accepted and rejected responses. To do this, replace the single RecMessage line with two lines starting RecMessageAccept and RecMessageReject repectively, for example

RecMessageAccept     I think I heard "RECRESULT"... correct
RecMessageReject     I think I heard "RECRESULT"... WRONG!!

If the system would normally have displayed

A cat

it will now display the text

I think I heard "A cat"... correct

for an accepted response, and

I think I heard "A cat"... WRONG!!

for a rejected response.

You may also want to change the casing of the recognition result. By default, the first letter of the result is uppercase and the rest lowercase, but this may not look right if you are using a RecMessage. You can change the casing by adding a RecCase line in the Course unit, as follows:

RecCase       lowercase

puts the recognition result all in lowercase.

RecCase       uppercase

puts the recognition result all in uppercase.

RecCase       initialCapital

capitalises the first letter of the recognition result and leaves the rest in lowercase.

By adding a Feedback line in the Course unit, you can change the type of recognition feedback the system produces. If you use the value

Feedback       colour_highlighting_on_response

the system will try to show words it thinks have been incorrectly recognized in red. The downside is that sometimes it guesses wrong, which can confuse the student, but if it’s accurate enough on your course then it may be very useful. In the opposite direction, if you think that recognition is not very accurate, you may find the empty RecMessage line handy.

If you use the value

Feedback       none

then the system will produce no written recognition feedback, just a blue border. This is useful if you only want to record what the student is saying, perhaps as an introductory evaluation module.

Controlling the way navigation works

By default, the student moves to the next example after a successful attempt or too many unsuccessful attempts. They can also move forward or backwards using the arrow controls. You can change all these behaviors by adding suitable lines in Course or Lesson units. The system will take the value from the current lesson if it’s specified there, otherwise from the course.

If you add the line

AutoAdvance    no

then the system does not automatically advance to the next example on success.

If you add the line

CanMoveForward no

then the student cannot use the forward arrow.

If you add the line

CanMoveBack no

then the student cannot use the back arrow.

Specifying the number of attempts the student can make

By default, the student can attempt each example twice before the system forces them to move to the next one. You are able to change this by adding a MaxTries line to the Course unit. So for example if you add the line

MaxTries       5

then the student can try each example up to five times. If you add

MaxTries       1

then they can only try an example once.

If you wish to have different behavior in different lessons, it is also possible to add a MaxTries line in the Lesson unit. The system will take the value from the current lesson if it’s specified there, otherwise from the course.

Controlling what happens at the end of a lesson

When the student reaches the end of a lesson, the default behavior is to show a popup saying End of lesson and then offer to go to the lesson menu. You can customise this in two ways:

  1. You can specify the message in the popup by adding an EndMessage line, e.g.
EndMessage       Congratulations, you have finished the third lesson!

The EndMessage line can be placed either in the Course unit or in the Lesson unit. As usual, the Lesson unit takes precedence.

  1. You can add a NextLesson line in the Lesson unit, e.g.
NextLesson       lesson4

This makes the system immediately jump to the designated lesson after showing the popup.

If you want to specify that the system should not jump to any lesson or offer to go to the lesson menu, you can write

NextLesson       *none*

If you want to specify explicitly that the system should offer to go to the lesson menu, you can write

NextLesson       *select*

though this is not necessary.

Confidence thresholds

You can force the system to discard recognition results which it thinks are unlikely to be correct by adding a confidence threshold in the Course unit. For example, the declaration:

Threshold      30

means that any recognition result with a confidence score of less than 30 will be discarded and treated as though nothing had been recognised. If you want all the courses in a namespace to have the same confidence threshold, you can save time by writing:

Threshold      30 all_domains

in the Course unit of one course.

Good values for confidence thresholds depend on the grammar. In general, larger grammars will need lower confidence thresholds, and smaller grammars will need higher ones.

A better multimedia course

The following improved version of the simple multimedia course from Level 2 gives a concrete example of how to use the tools introduced at Level 3. We enhance the course in several ways:

  • We use regular expressions to allow a larger range of possible responses.
  • We use templates to avoid unnecessary repetition. This makes it much easier to add new animals and stars if we later want to expand the course.
  • We include Coverage units to tell the recognizer about some other animals and stars that aren’t in the Prompts. This means that it will be able to recognize these phrases too.
  • The fact that the recognizer now knows about many possible incorrect answers let it give more informative feedback than simple rejection.
  • We include audio help files.

The improved course, visual2, looks like this. First, we have as usual a Course unit:

# ---------------------------------------------------
# Course

# One course, 'visual2_course'

Course
Name           visual2_course
Client         multimedia_client
L2             english
Languages      english
Feedback       colour_highlighting_on_response
EndCourse

The difference compared to the Level 2 course is the line

Feedback       colour_highlighting_on_response

which tells the server to show incorrect words it has recognized in red.

Next, we have the two Lesson units, which are just the same as in the previous version:

# ---------------------------------------------------
# Lessons

# Two lessons

Lesson
Name           animals
PrintName      Animals
Description    Identify animals
EndLesson

Lesson
Name           stars
PrintName      Stars
Description    Identify movie stars
EndLesson

The largest changes are in the prompts, which we have rewritten with PromptTemplate and ApplyTemplate units. We have also added audio help file lines. The prompts for the animals lesson now look like this:

# ---------------------------------------------------
# Prompts

# Identify animals

PromptTemplate what_animal PHRASE PICTURE AUDIOHELP TRANSCRIPTION
Lesson         animals
Group          1
Multimedia     PICTURE
Text/english   What is it?
Response       ?( it's | that's | it is | that is ) PHRASE
AudioHelp      help/AUDIOHELP TRANSCRIPTION
EndPromptTemplate

ApplyTemplate what_animal "a cat" "cat.png" "cat.wma" "It's a cat"
ApplyTemplate what_animal "a dog" "dog.png" "dog.wma" "It's a dog"

The idea is to put all the common structure for an “animal” prompt into the template definition; then each new prompt only requires one line.

The Coverage unit, which specifies possible incorrect responses for animals lesson, is shown below. It uses the two Phrases $animal and $he_or_she_or_it_is; the first is an phrase like “a cat” or “a dog”, and the second a phrase like “it’s” or “he is”. The Coverage unit adds responses to the recognizer which are either plain animal phrases, or animal phrases preceded by a phrase like “it’s”.

Coverage
Lesson         animals
Response       $animal
Response       $he_or_she_or_it_is $animal
EndCoverage

The Phrase units themselves are specified as follows: evidently, it is again easy to add more animals if desired.

# ---------------------------------------------------
# Phrases

Phrase
PhraseId       $he_or_she_or_it_is
Response       it's
Response       it is
Response       that's
Response       that is
Response       he's
Response       he is
Response       she's
Response       she is
EndPhrase

Phrase
PhraseId       $animal
Response       a dog
Response       a cat
Response       a horse
Response       a sheep
Response       an aardvark
Response       a dinosaur
EndPhrase

The prompts and coverage units for the stars lesson are just the same, with names of stars replacing names of animals:

# Identify stars

PromptTemplate what_star NAME PRONOUN PICTURE AUDIOHELP TRANSCRIPTION
Lesson         stars
Group          1
Multimedia     PICTURE
Text/english   Who is PRONOUN?
Response       ?( it's | PRONOUN's | that's | it is | PRONOUN is | that is ) NAME
AudioHelp      help/AUDIOHELP TRANSCRIPTION
EndPromptTemplate

ApplyTemplate what_star "brad ?pitt" "he" "brad_pitt.jpg" "brad_pitt.wma" "That's Brad Pitt"
ApplyTemplate what_star "angelina ?jolie" "she" "angelina_jolie.jpg" "angelina_jolie.wma" "That's Angelina Jolie"

Coverage
Lesson         stars
Response       $star
Response       $he_or_she_or_it_is $star
EndCoverage

Phrase
PhraseId       $star
Response       brad ?pitt
Response       angelina ?jolie
Response       george ?clooney
Response       reese ?witherspoon
Response       beyoncé
Response       madonna
EndPhrase

The full course file

# ---------------------------------------------------
# Course

# One course, 'visual2_course'

Course
Name           visual2_course
Client         multimedia_client
L2             english
Languages      english
Feedback       colour_highlighting_on_response
EndCourse

# ---------------------------------------------------
# Lessons

# Two lessons

Lesson
Name           animals
PrintName      Animals
Description    Identify animals
EndLesson

Lesson
Name           stars
PrintName      Stars
Description    Identify movie stars
EndLesson

# ---------------------------------------------------
# Prompts

# Identify animals

PromptTemplate what_animal PHRASE PICTURE AUDIOHELP TRANSCRIPTION
Lesson         animals
Group          1
Multimedia     PICTURE
Text/english   What is it?
Response       ?( it's | that's | it is | that is ) PHRASE
AudioHelp      help/AUDIOHELP TRANSCRIPTION
EndPromptTemplate

ApplyTemplate what_animal "a cat" "cat.png" "cat.wma" "It's a cat"
ApplyTemplate what_animal "a dog" "dog.png" "dog.wma" "It's a dog"

Coverage
Lesson         animals
Response       $animal
Response       $he_or_she_or_it_is $animal
EndCoverage

# Identify stars

PromptTemplate what_star NAME PRONOUN PICTURE AUDIOHELP TRANSCRIPTION
Lesson         stars
Group          1
Multimedia     PICTURE
Text/english   Who is PRONOUN?
Response       ?( it's | PRONOUN's | that's | it is | PRONOUN is | that is ) NAME
AudioHelp      help/AUDIOHELP TRANSCRIPTION
EndPromptTemplate

ApplyTemplate what_star "brad ?pitt" "he" "brad_pitt.jpg" "brad_pitt.wma" "That's Brad Pitt"
ApplyTemplate what_star "angelina ?jolie" "she" "angelina_jolie.jpg" "angelina_jolie.wma" "That's Angelina Jolie"

Coverage
Lesson         stars
Response       $star
Response       $he_or_she_or_it_is $star
EndCoverage

# ---------------------------------------------------
# Phrases

Phrase
PhraseId       $he_or_she_or_it_is
Response       it's
Response       it is
Response       that's
Response       that is
Response       he's
Response       he is
Response       she's
Response       she is
EndPhrase

Phrase
PhraseId       $animal
Response       a dog
Response       a cat
Response       a horse
Response       a sheep
Response       an aardvark
Response       a dinosaur
EndPhrase

Phrase
PhraseId       $star
Response       brad ?pitt
Response       angelina ?jolie
Response       george ?clooney
Response       reese ?witherspoon
Response       brittney ?spears
Response       madonna
EndPhrase