I ran into a strange issue the other day while testing my VXML application on Voxeo Prophecy. Originally this caller input function was tested with Avaya, and as I discovered, was never tested on Voxeo. I have long know that Voxeo is much stricter than Avaya, and this is another case where VXML leniency can create issues with cross browser compatibility.

Symptoms

The main symptom was, when trying to enter a 2 digit input on my dial pad, the input was registered as invalid. This is the rule that worked fine on Avaya. But on Voxeo Prophecy I would continue to get is a NoMatch Error, then transfer out. The actual grammar function was to enter a 2 digit month like this:

    <rule scope="public" id="___ROOT___">
        <one-of>
            <item>
                <item>
                    <ruleref uri="#Months_01_12"/>
                </item>
            </item>
        </one-of>
    </rule>
    <rule id="Months_01_12">
        <ONE-OF>
            <item>01</item>
            <item>02</item>
            <item>03</item>
            <item>04</item>
            <item>05</item>
            <item>06</item>
            <item>07</item>
            <item>08</item>
            <item>09</item>
            <item>10</item>
            <item>11</item>
            <item>12</item>
        </ONE-OF>
    </rule>

Resolution

The issue seems to be that Avaya allows there to be multiple digits in a single rule item which essentially allows for overloading the items function.

According to the VXML 2.1 and Grammar 1.0 specification it seems that you can only use a single digit for your rule item

#ABNF 1.0 ISO-8859-1;

mode dtmf;

$digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
public $pin = $digit &lt;4&gt; "#" | "*" 9;

taken from: http://www.w3.org/TR/speech-grammar/

SO what I had to do was separate the each rule into single digit rule references to create the two month rule grammar like:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<grammar root="___ROOT___" mode="dtmf" lang="en-us" xmlns="http://www.w3.org/2001/06/grammar" version="1.0" xml:>

    <rule scope="public" id="___ROOT___">
        <ONE-OF>
            <item>
                <item>
                    <ruleref uri="#Digits_01" />
                </item>
                <item>
                    <ruleref uri="#Digits_09" />
                </item>
            </item>
        </ONE-OF>
        <ONE-OF>
            <item>
                <item>
                    <ruleref uri="#Digits_03" />
                </item>
                <item>
                    <ruleref uri="#Digits_09" />
                </item>
            </item>
        </ONE-OF>
    </rule>

    <rule id="Digits_01">
        <ONE-OF>
            <item>0</item>
            <item>1</item>
        </ONE-OF>
    </rule>

    <rule id="Digits_03">
        <ONE-OF>
            <item>0</item>
            <item>1</item>
            <item>2</item>
            <item>3</item>
        </ONE-OF>
    </rule>

    <rule id="Digits_09">
        <ONE-OF>
            <item>0</item>
            <item>1</item>
            <item>2</item>
            <item>3</item>
            <item>4</item>
            <item>5</item>
            <item>6</item>
            <item>7</item>
            <item>8</item>
            <item>9</item>
        </ONE-OF>
    </rule>
</grammar>

The new grammar works successfully on Voxeo Prophecy voice browser, and well as on Avaya (AVP).

Conclusion

I use Voxeo Prophecy exclusevly for grammar development and for initial testing before I move to my Avaya integration environment. There just seems to be to many non-standard implementations that Avaya allows the developers to get away with, which makes your VXML code not-portable and currently my application is taking >450,000 calls per day from Avaya, Voice Genie, Voxeo and Holly Connect so portable VXML is possible and I feel is attainable.

Mick Knutson

Java, JavaEE, J2EE, WebLogic, WebSphere, JBoss, Tomcat, Oracle, Spring, Maven, Architecture, Design, Mentoring, Instructor and Agile Consulting. http://www.baselogic.com/blog/resume

View all posts
  • @dnulnets

    Nice to see someone actually doing something in VXML and also cross-platform. I would say that is not so common.

    A couple of years back I was the head of a development team within ericsson that developed a VXML/CCXML browser. I believe that the browsers should be compliant to the standards, which I guess both, in your example, are in some way but I also understand the reason why you want to add features that helps the vxml-developer in his daily life. Which one of your examples are easier to understand ? Unfortunately this also adds cross-platform-incompatibilities. The platform developers should therefore try to feed the "add-on-features" back into the next version of the standards. But in the meantime the developer is then caught in the middle if he requires cross-platform compatibility. I guess a lot of this has to do with VXML being a "sort-of" a young standard as well.

    • It has taken some work to test on all the platforms, but in the end, this has really created an amazing product that is vendor neutral. But the vendors don’t like that 😉

  • @dnulnets

    Yes, vendor-lock-in is good for business … or not … 😉

    Either way I must admit that during the development of our vxml/ccxml broser we also added some non standard functionality to handle things like application controlled SS7-signalling, early media and also being able to do video streaming. But then again you also have to take some responsibility to work on the standard as well. But they should be used in very isolated (maybe not video) areas in your vxml/ccxml app.

    Once again, impressive work to keep it vendor neutral.

    • I am trying to finish a national roll-out to 1.5MIL callers per day. As soon as I get past this hurdle, I have several more VXML blogs to post. Stay tuned

  • @dnulnets

    Sorry I keep pestering you. I find this very interesting – looking forward for the blogs to come. What would the normal peakload be during busy hour and mean call hold time for your roll-out?

    • What do you mean hold-time? Do you mean the time a caller is on hold until a VB process picks up and processes the request?

      • @dnulnets

        Average call holding-time (which I should have written) is the time the call lasts, i.e. from connect to teardown.

Java / JavaEE / Spring Boot Channel

BLiNC Supporters

BLiNC Adsense

Archives

Newsletter