800 to 800 Transferring in I...

March 30, 2011

A couple of times on the forum I see a post from an IVR developer mentioning why a transfer isn’t working. The developer mentions that when they transfer to local numbers, the transfer works just fine. However, when attempting to do a transfer to an 800 number, they are unable to connect.

Ah, there’s the problem. The IVR developer is most likely attempting to do a transfer from an 800 number to another 800 number.

US phone companies do not allow transfers to another 800 number from calls that came in on an 800 number. Let’s think about this for a moment.

Let’s say Person A makes a long distance call using a toll-free number to be transferred to another toll-free number. The call hits Phone Company A’s toll-free line and Phone Company A then forwards the call onto Phone Company B’s toll-free line. The problem here is: Who shoulders the cost of when Phone Company A is forwarding on to Phone Company B?

Because of this issue of which phone company takes the burden of this cost, the US phone system has declared 800 to 800 transferring as being not possible.

To get around this, there is the possibility of doing 800 to 800 forwarding. This process involves an 800 number first forwarding to a local number and that local number then forwarding on to an 800 number.

For IVR developers that want to implement this within their code,  please contact your sales representative about this process.

-

3

-

Call for IVR Beta Testers

March 30, 2011

Plum Voice is now accepting requests for beta testers of our new web-based graphical IVR development toolkit called SynApps.  Those with experience developing applications in VoiceXML or IVR GUIs would be preferable.  If you are interested in becoming a beta tester for SynApps, please send an e-mail to synappsbeta@plumgroup.com

-

1

-

Alphanumeric Grammars and IV...

March 30, 2011

Every once in awhile, I see an IVR developer on the forum mention the possibility of building an alphanumeric IVR grammar that will allow users to spell out letters and numbers over the phone.

My response to that is this: Have you ever tried to spell out information to someone over the phone?

For example:

Person A: Hi! Welcome to the Bank of Money. How can I help you today?

Person B: Hi there. I’m having a problem with my account.

Person A: Sure. I can help you with that. Can I have you spell out your first name?

Person B: Valerie. V-a-l-e-r-i-e.

Person A: I’m sorry, I missed some of that. Was it V as in Victor? Or B as in Banana?

Person B: V as in Victor.

Person A: Last name?

Person B: Munn. M-u-n-n.

Person A: M as in Mary. U as in Umbrella. M as in Mary. M as in Mary?

Person B: No. M as in Mary. U as in Umbrella. N as in Nancy. N as in Nancy.

Person A: Ah ok. Sorry for the misunderstanding, ma’am.



You get the point. The problem is that even humans have trouble understanding spelling from other humans over the phone as there can be constant mix-ups between m’s and n’s, b’s and v’s, and f’s and s’s. Also, add to that the possibility of a person having a thick accent while spelling out words.

So, if humans have difficulty spelling out words, you can expect that an IVR speech recognition engine would have a problem capturing a spelling grammar. One possible solution is to implement an IVR grammar that uses the military phonetic alphabet to try to capture these spelling grammars.

For example, some IVR code to demonstrate:

<rule id=”alpha” scope=”private”>
<one-of>
<item>A<tag>SWI_literal=”A”</tag></item>
<item>A as in alpha<tag>SWI_literal=”A”</tag></item>
</one-of>
</rule>

However, even this solution would be difficult as an IVR developer shouldn’t expect general users to know of the military alphabet.

-

3

-

Root Documents In IVR Code (...

March 30, 2011

Another useful feature that root documents offer IVR developers is the ability to transition from a leaf document back to the root document. This ability allows you to send information back to your root document that has been updated through your leaf documents.

The following IVR example demonstrates how you can do this:

root.vxml (root document):

<?xml version=”1.0″?>
<vxml version=”2.0″>
<var name=”foo”/>
<form>
<block>
<prompt bargein=”false”>
The value leaf is set to <value expr=”leaf”/>.
</prompt>
</block>
</form>
</vxml>

Page1.vxml (leaf document):

<?xml version=”1.0″?>
<vxml version=”2.0″ application=”root.vxml”>
<form>
<block>
<assign name=”foo” expr=”‘bar’”/>
<goto next=”Page2.vxml” maxage=”0″ maxstale=”0″/>
</block>
</form>
</vxml>

Page2.vxml (leaf document):

<?xml version=”1.0″?>
<vxml version=”2.0″ application=”root.vxml”>
<var name=”leaf”/>
<form>
<block>
<assign name=”leaf” expr=”‘rab’”/>
<prompt bargein=”false”>
The value foo is set to <value expr=”foo”/>
</prompt>
<goto next=”root.vxml” maxage=”0″ maxstale=”0″/>
</block>
</form>
</vxml>

From this IVR example, when the application, Page1.vxml, is started, it accesses the variable, “foo”, from the root document, root.vxml, and assigns it the value of string, “bar”. Page1.vxml then transitions to Page2.vxml, which creates a new variable, “leaf”, and assigns it the value of string, “rab”. Page2.vxml then returns the prompt, “The value of foo is set to bar.” After the prompt, Page2.vxml transitions to the root document, root.vxml, which references the variable, “leaf”, from Page2.vxml and returns the prompt, “The value leaf is set to rab.” Thus, it is possible for root documents to reference variables from leaf documents as long as the leaf documents reference the root document.

This ends our discussion on the benefits of using root documents within your VoiceXML IVR code. One thing to keep in mind is that you must reference the root document in each of your leaf documents so that your leaf documents can continue to reference the same content. So, if your root document is entitled rootdocument.vxml, then you must reference the name of this root document in the following way for each of your leaf documents:

<vxml version=”2.0″ application=”rootdocument.vxml”>

If your IVR application reaches a leaf document that no longer references the root document, then the root context becomes destroyed. To clarify this point, think of an example where you have initially declared a variable within your root document and when this variable gets updated in a leaf document, the value is preserved through referencing the root document. If an IVR developer, however, forgets to  reference the root document within a leaf document, then the values that get preserved for the variables throughout the leaf document become lost at that point in the application.

-

3

-

IVR for Workforce Automation...

March 30, 2011

IVR improves efficacies and customer service by providing callers with real time access to information, thus saving costs by automating service inquires.  However, IVR is also used by many companies to automate workforce reporting.  Since nearly everyone has a cell phone, companies use IVR to provide field employees with a facility to update reports and work orders, clock in/out, report patient status, or drive nearly any task that involves querying a data source.  For more information about IVR and workforce automation, please visit Plum’s IVR case studies page.

-

1

-

Root Documents In IVR Code (...

March 30, 2011

Have you ever gotten tired of writing the same error handler into your IVR code to ensure that callers listen to the same messages for when they enter no input or when they enter an input that doesn’t match your VoiceXML grammar? This not only makes your code lengthy, but it’s just not needed.

If you know that you’re going to be using the same error handler in parts of your IVR application where you’re not explicitly stating them, then you can set up your error handler to be a global catch handler in your root document.

Also, you can use your root document for setting up global properties such as “interdigittimeout” within your IVR code. This is helpful for when you know that you want users to have the same amount of time when they’re entering digits on their phone keypad.

The following IVR example demonstrates this point:

Root.vxml:

<?xml version=”1.0″?>
<vxml version=”2.0″>
<var name=”username”/>
<var name=”age”/>

<property name=”interdigittimeout” value=”3s”/>

<catch event=”noinput”>
Please enter an input.
</catch>
<catch event=”nomatch”>
Your input does not make sense.
</catch>
</vxml>

Page1.vxml:

<?xml version=”1.0″?>
<vxml version=”2.0″ application=”Root.vxml”>
<form>
<block>
<assign name=”username” expr=”‘Big Dog’”/>
</block>
<field name=”userage” type=”digits”>
<prompt>
<value expr=”username”/>,
please enter the digits of your age.
</prompt>
<filled>
You entered <value expr=”userage”/>.
<assign name=”age” expr=”userage”/>
<goto next=”Page2.vxml”/>
</filled>
</field>
</form>
</vxml>

Page2.vxml:

<?xml version=”1.0″?>
<vxml version=”2.0″ application=”Root.vxml”>
<form>
<block>
<prompt bargein=”false”>
Your name is <value expr=”username”/>.
Your age is <value expr=”age”/>.
</prompt>
</block>
</form>
</vxml>

From this example, the root document, Root.vxml, sets a global default property for “interdigittimeout” to be 3 seconds long. This means that if there are no properties set locally within your IVR application for “interdigittimeout”, the “interdigittimeout” for the user to input digits would be 3 seconds. The root document also sets up global catch handlers for “noinput” and “nomatch” events for your application. This means that if there are no error handlers set for “noinput” and “nomatch” locally, the application would use the “noinput” and “nomatch” catch handlers set in your root document. 2 global variables, “username” and “age”, are set up for this IVR example as well.

When the IVR application starts at Page1.vxml, “username” is assigned the value of string “Big Dog”. The user is then prompted for an age to be inputted. Since there is no property set for “interdigittimeout” within Page1.vxml, the IVR application uses the “interdigittimeout” property from the root document. This means that the user has 3 seconds between the input of each digit before the application begins to process the digits that were entered. Also, if the user does not enter any digits, the application uses the “noinput” catch handler from the root document since there is no error handler set for “noinput” within Page1.vxml. Let’s assume you enter “12″ for your age. Finally, the IVR application transitions to Page2.vxml, which returns a prompt of “Your name is Big Dog. Your age is 12.” Thus, if you have multiple VoiceXML scripts linked together, you can use a root document to store global variables, properties, or catch handlers that would be used by these VoiceXML scripts.

-

3

-

Prosody Behavior for TTS Eng...

March 30, 2011

There have been some forum posts where I’ve seen some developers mention that there is strange behavior going on when testing IVR code (specifically, the <prosody> tag) between each of the different TTS engines: AT&T Natural Voices, Cepstral Swift, and Nuance Realspeak.

For example, here is some sample IVR code testing the <prosody> tag for AT&T Natural Voices:

<?xml version=”1.0″?>
<vxml version=”2.0″>
<form>
<block>
<prompt>
<voice name=”crystal”>
<prosody rate=”150.0″>
<say-as type=”address”>
The Mall Outlet
123 Main St
Chicago, Illinois
</say-as>
</prosody>
</voice>
</prompt>
</block>
</form>
</vxml>

However, if you were to use this same exact code and swap out “crystal” for “Diane” (Cepstral) or “Samantha” (Realspeak), you would end up hearing the prompt spoken back to you extremely quickly. Instead, you would have to adjust your code to look like the following:

<?xml version=”1.0″?>
<vxml version=”2.0″>
<form>
<block>
<prompt>
<voice name=”Samantha”>
<prosody rate=”+5%”>
<say-as type=”address”>
The Mall Outlet
123 Main St
Chicago, Illinois
</say-as>
</prosody>
</voice>
</prompt>
</block>
</form>
</vxml>

Note how the rate in the <prosody> tag was changed to “+5%” instead. These kind of inconsistencies between TTS engine behaviors can make it tough for an IVR developer.

-

3

-

Root Documents In IVR Code (...

March 30, 2011

There have been times on the forum when I have seen developers create a long VoiceXML script with mounds and mounds of IVR code. Scrolling through all this IVR code sure can make it tough on developers for debugging. So, as a general rule of thumb, you should break up your VoiceXML pages to make it easier to debug your code and for better organization.

But how do I maintain variables between the VoiceXML pages?

Ah, that brings us to the point of this blog post. We can use root documents to declare all the variables that we are going to use within our VoiceXML scripts.

But how do these VoiceXML scripts know about this root document?

Simple, by including it in the “application” attribute of the <vxml> tag. Here’s a short example to demonstrate:

root.vxml:

<?xml version=”1.0″?>
<vxml version=”2.0″>
<var name=”foo”/>
</vxml>

page1.vxml:

<?xml version=”1.0″?>
<vxml version=”2.0″ application=”root.vxml”>
<form>
<block>
<assign name=”foo” expr=”‘bar’”/>
<goto next=”page2.vxml”/>
</block>
</form>
</vxml>

page2.vxml:

<?xml version=”1.0″?>
<vxml version=”2.0″ application=”root.vxml”>
<form>
<block>
<prompt bargein=”false”>
The value foo is set to <value expr=”foo”/>
</prompt>
</block>
</form>
</vxml>

From this example, page1.vxml accesses the variable “foo” from the root document root.vxml, assigns it the value, “bar”, and transitions to page2.vxml. Once inside of page2.vxml, the root document is referenced again, which allows page2.vxml to use the variable “foo”. Since the root document preserves the assignment of the variable from page1.vxml, page2.vxml returns a prompt of “The value foo is set to bar.”

Even though this is a simple example, you can see the benefits of using a root document for declaring the variables that you are going to use within your VoiceXML code. Imagine if you had three separate VoiceXML pages; one page for getting input data from the user, another page for verifying the input data from the user, and a final page for processing the data. Sticking this code all into one VoiceXML script would be sloppy and unorganized. But instead, we can use a root document to declare a variable that would hold this input data and use it through each of our VoiceXML pages.

Stay tuned next week for Parts 2 and 3 of The Benefits of Using Root Documents Within Your IVR Code.

-

3

-

Plum Voice Year End Results

March 30, 2011

We just put out a press release detailing Plum’s year in results.  The release can be found on our home page: http://www.plumvoice.com/

We’re proud of all our accomplishments in 2009 and look forward to rolling out new IVR products and services in 2010.  Stay tuned for new product announcements, special offers and services in 2010.

-

1

-

Outbound IVR and Voicemails

March 30, 2011

A common issue that crops up on the forum from time to time is leaving voicemails on an answering machine when an outbound IVR call is not picked up by a human. Many times, developers would write IVR test code to act on a callee type of “answeringmachine” and wonder why a voicemail was not left on their cell phone.

So, we typically suggest to developers to use the following IVR code:

<?php
header(”Content-type: text/xml”);
echo(”<?xml version=\”1.0\”?>\n”);
$calleetype = $_POST['callee_type'];
?>
<vxml version=”2.0″>
<form id=”mainmenu”>
<var name=”callee_type” expr=”‘<?= $calleetype ?>’”/>

<record cond=”callee_type==’answeringmachine’” finalsilence=”2000ms”/>
<block>
<prompt>
Hello! This is a reminder to take your medicine today.
</prompt>
</block>

</form>
</vxml>

From this IVR code, if the callee is an answering machine, the VoiceXML application initially goes to the <record> tag to account for the answering message that gets played at the beginning of a voicemail. Once that message gets played, the VoiceXML application then plays the prompt, “Hello! This is a reminder to take your medicine today”, which is the message that gets left on the voicemail.

However, one thing that IVR developers need to keep in mind is that callee type detection for outbound is 94% accurate. This means that every once in a while, the outbound system will mistake an answering machine for a human and vice versa. The consequence of this behavior is that a voicemail message may get cut off at the beginning or a message may not be left at all.

Thus, for applications that require a voicemail message be left on an answering machine 100% of the time, we suggest that the IVR developer repeat the message numerous times. For example:

<?php
header(”Content-type: text/xml”);
echo(”<?xml version=\”1.0\”?>\n”);
?>
<vxml version=”2.0″>
<property name=”inputmodes” value=”dtmf”/>

<form id=”message”>
<field name=”leavemsg”>
<grammar type=”application/x-jsgf” mode=”dtmf”>(0|1|2|3|4|5|6|7|8|9|”#”|”*”)</grammar>

<prompt>
Hello! This is an application from your hospital. Please press 1 to continue. Please remember to call the phone number listed in your e-mail to reserve your appointment. Hello! This is an application from your hospital. Please press 1 to continue. Please remember to call the phone number listed in your e-mail to reserve your appointment. Hello! This is an application from your hospital. Please press 1 to continue. Please remember to call the phone number listed in your e-mail to reserve your appointment. Hello! This is an application from your hospital. Please press 1 to continue. Please remember to call the phone number listed in your e-mail to reserve your appointment. Hello! This is an application from your hospital. Please press 1 to continue. Please remember to call the phone number listed in your e-mail to reserve your appointment.
</prompt>

<filled>
<prompt>
Here is a different message that should be played to a human.
</prompt>
<goto next=”#confirmtransfer”/>
</filled>

</field>
</form>

<form id=”confirmtransfer”>
<field name=”leavemsg”>
<grammar type=”application/x-jsgf” mode=”dtmf”>1</grammar>

<prompt>
Would you like to be tranferred? Press 1 for yes.
</prompt>

<filled>
<prompt>
Okay, please hold while we transfer you.
</prompt>
<goto next=”#maketransfer”/>
</filled>
</field>
</form>

<form id=”maketransfer”>
<transfer dest=”tel:+1XXXXXXXXXX”/>
</form>

</vxml>

From this IVR example, the outbound IVR call will leave a voicemail that keeps on repeating the prompt, “Hello! This is an application from your hospital. Please press 1 to continue. Please remember to call the phone number listed in your e-mail to reserve your appointment.” if no one picks up and enters 1 on their phone keypad.

If the IVR outbound call is picked up by a human and the human presses 1 on their phone keypad, then a different message will be played and the human will be prompted to enter 1 on their phone keypad if they want to be transferred.

-

3

-