One of the deliverables of the VOICES project is a meeting organiser web application. With, unsurprisingly, database tables for users, meetings, participants, time slots, etc; nothing a competent hacker couldn’t write in a few days using any web app framework.
Except for one thing: the system has to be accessible to meeting participants through an interactive voice response (IVR) system: they can call, or be called, to hear about the meetings and say if they’re going to attend or not. And it has to work in multiple languages: French, Bambara and other languages from Mali, where the system is currently deployed for Sahel Eco, a local NGO that works to improve the lives of people living in rural areas. That instance of the application has users that speak multiple languages, meetings and announcements that can also be in various languages. Everything has to work so that users (and administrators) can use the system in their favourite language, or at least one they understand.
The application is called Tabale (a popular musical instrument, shown left). Although it uses a lot of different technologies one the web-facing and server sides (I especially liked using RedbeanPHP, Handlebars), the interesting part is the IVR, written in VoiceXML and running on the VoiceGlue+Asterisk setup offered by Orange’s Emerginov Platform. It’s not because phone calls are linear and have low information bandwidth (compared to graphical or textual interfaces) that writing IVR applications is easy. Especially for an audience that has never encountered speech applications before and only use their phone to talk to humans. For instance, the application developer has to keep in mind that timing is essential: the user will be switching from putting the phone to their ear, to listen or speak, and in front of their eyes to type dial tones. They will have to know when to speak to record a message, and how to end the recording. And there are many other rules that, if not followed, will make your IVR very irritating: menus (like “press 1 for listening to the meeting announcements, 2 for leaving a message, …“) shouldn’t be have more than a few items. Or you shouldn’t have your system say “press 1 for …, 2 for …” but instead “for …, press 1. for …, press 2“. Etc.
Language support has to be done right, too. The first time a user calls, they should be asked what language they want to use, and remember that choice for subsequent calls. A meeting announcement should be played in that language, and if it’s not available there should be a fallback language that’s likely to be understood by most. And by far the hardest challenge was debugging the IVR. VoiceGlue’s support for VoiceXML is random and not very well specified, and the Emerginov platform doesn’t provide call logs. Writing unit tests is also very hard, if you want to go beyond simply testing if your PHP-generated VoiceXML files are valid.
As the VOICES project comes to an end and Tabale is pretty much complete, I’m releasing the source on github. I might deploy a test instance somewhere using Evolution for the telephony features, although I wouldn’t want people to use the system to spam others with automated phone calls. But I’m more than happy to help anybody interested in deploying it for themselves or their own organisation.