Home » Search results for 'allison ivr'

Search Results for: allison ivr

The Most Versatile VoIP Provider: FREE PORTING

Allison Smith: State of the IVR Address

We’re delighted to welcome Allison Smith as our first (and only) Guest Columnist. We had asked Allison to provide us an update on IVR technology, and she was gracious enough to accept our invitation. For most of our readers, Allison is best known for her pioneering work as the Voice of Asterisk®. But her accomplishments as the professional telephone voice for Verizon, Qwest, Cingular, Sprint, and Bell Canada among others are legendary. So… here’s Allison!

We’ve come a long way from the mindset of thirty years ago, where people approached the writing of their IVR prompts with the intention of guiding their callers through this strange, unfamiliar, automated land. Where we needed to point out that this is not an actual, live person speaking. Where we felt it was necessary to point out that if they simply listen to and follow these instructions, they will be rewarded with an answer, obeying an almost Oz-like mission, deciding which attribute best describes what you’re after and selecting the right department which will fulfill your dreams.

We are now so attuned to the idea of encountering an automated “gating” system when calling practically any entity – be they local dry cleaner or multinational – that we are in shock if the call is answered by an actual breathing person. Whereas before, designers of IVR trees were in the position of almost enticing or inviting the caller to “participate” in the exercise of finding the right department which best suits their needs, by now, everyone knows that this is a necessity to get where they want to go; and everyone knows the drill: I need to make a decision as to where my call should go – and it will be a big waste of my time if I choose incorrectly.

We’ve also come a long way towards streamlining and simplifying IVR instructions – through trial and error, we’ve got a clearer idea than ever as to the caller’s capacity for information – and their tolerance for time-wasting nonsense.
Instead of lengthy and complicated instructions on how clients can reach your physical location, I’m frequently voicing the phrase I’ve long campaigned for: “For directions to our facility, program our address into your GPS-enabled device…” Gone are hackneyed requests to “Please listen carefully, as our menu options have recently changed..” or “Please leave a detailed message after the tone…” (Nobody – especially first-time callers – care if your phone tree has changed. Also: people are well aware of what information to leave in a phone message.) And most importantly: I’m seeing a huge awareness in the fact that customers do not have an infinite amount of time or patience; get the callers sorted as efficiently and as quickly as possible, and be done with deluging them with too much information or anything which sounds even remotely like a commercial or sales pitch. They’ve been to your website. They’re sold on you. Now show them – through your phone tree – how effortless and easy it is to transact with you. –Allison Smith


 

Special Thanks to Our Generous Sponsors


FULL DISCLOSURE: ClearlyIP, Skyetel, Vitelity, DigitalOcean, Vultr, VoIP.ms, 3CX, Sangoma, TelecomsXchange and VitalPBX have provided financial support to Nerd Vittles and our open source projects through advertising, referral revenue, and/or merchandise. As an Amazon Associate and Best Buy Affiliate, we also earn from qualifying purchases. We’ve chosen these providers not the other way around. Our decisions are based upon their corporate reputation and the quality of their offerings and pricing. Our recommendations regarding technology are reached without regard to financial compensation except in situations in which comparable products at comparable pricing are available from multiple sources. In this limited case, we support our sponsors because our sponsors support us.

BOGO Bonaza: Enjoy state-of-the-art VoIP service with a $10 credit and half-price SIP service on up to $500 of Skyetel trunking with free number porting when you fund your Skyetel account. No limits on number of simultaneous calls. Quadruple data center redundancy. $25 monthly minimum spend required. Tutorial and sign up details are here.

The lynchpin of Incredible PBX 2020 and beyond is ClearlyIP components which bring management of FreePBX modules and SIP phone integration to a level never before available with any other Asterisk distribution. And now you can configure and reconfigure your new Incredible PBX phones from the convenience of the Incredible PBX GUI.

VitalPBX is perhaps the fastest-growing PBX offering based upon Asterisk with an installed presence in more than 100 countries worldwide. VitalPBX has generously provided a customized White Label version of Incredible PBX tailored for use with all Incredible PBX and VitalPBX custom applications. Follow this link for a free test drive!
 

Special Thanks to Vitelity. Vitelity is now Voyant Communications and has halted new registrations for the time being. Our special thanks to Vitelity for their unwavering financial support over many years and to the many Nerd Vittles readers who continue to enjoy the benefits of their service offerings. We will keep everyone posted on further developments.
 



Originally published: Friday, February 22, 2013



Need help with Asterisk? Visit the PBX in a Flash Forum.

 


Some Recent Nerd Vittles Articles of Interest…

Introducing IVRs in a Flash with Incredible PBX for Wazo

Last week we introduced the all-new, API-driven Admin User Interface for Wazo 17.07. But pretty pictures are only the icing on the cake. It’s what’s under the hood that really matters. And today we want to walk you through the new IVR User Interface with Incredible PBX for Wazo. The Wazo developers heard from many of you that were missing the GUI-driven IVR tools available in other products. And we’re pleased to tell you it’s another Home Run for Wazo. The UI is well-documented, easy to use, and incredibly simple to implement.

We should mention that our focus today is on the mechanics of using the new Wazo IVR Builder. We won’t be covering how to design a good IVR. If you want some great examples of poor IVR design, look no further than the main number of your favorite cellular or cable provider. Insofar as good design tips go, you can’t do better than learning from the master, Allison Smith. Here’s a link to her previous articles on Nerd Vittles.

We’re assuming you followed last week’s tutorial and added the basic components for the Admin user interface after using your browser to login to https://IPaddress/admin/. If not, start there and install the following plugins to begin: Users, Extensions, Contexts, and Devices. Next, add the plugins for Incalls, Outcalls, Trunks, and IVR. The whole setup procedure takes less than a minute. When you’re finished, your Navigation Sidebar should look like what’s shown above.

You’re obviously going to need a SIP or Google Voice trunk to handle incoming IVR calls so start there if you haven’t already set up at least one trunk that can be dedicated to your IVR. For the time being, add an Inbound Route for the Trunk that points to an extension.

Now we’re ready to create your first IVR using the new IVR template in the Admin UI. Using your web browser, log back in to https://IPaddress/admin/ and (1) click IVR in the Navigation bar. Then (2) click + Add to create a new IVR.

Since the pieces already are in place for the hard-coded Demo IVR that comes with Incredible PBX for Wazo, let’s use those components to demonstrate how easy it is to build your own IVR with the new GUI. As you can see from the completed form below, there are two main sections in setting up an IVR. There are some basic settings that handle answering the call, playing the welcome message, and managing error conditions. Then there are IVR options that correspond to the Digit pressed by the caller using a touchtone phone. Each of these options has a destination. Currently, the available options include playing a sound file, ringing an extension, running custom dialplan code, or hanging up a call. There also is the ability to nest IVRs. Once you have built the secondary IVRs, the options list will also include an IVR option.

Since our sample IVR uses custom contexts for each of the Incredible PBX applications, we’ll rely heavily on the Custom option to route calls to extensions that were created when these applications were installed: Call by Name (411), Join Conference (2663), Lenny (53669), Yahoo News (951), and Weather Forecasts by ZIP Code (947). We’ll also show you how to direct a call to an extension using the default WebRTC extension (701). To get things going, simply copy the entries shown below and then Save/Update the template. The Wazo syntax to call a Custom destination looks like this: Dial(Local/951@default).

Before you attempt to build your own IVR, keep in mind that you’ll need at least a greeting message that tells callers which buttons to press. This file should be placed in /var/lib/xivo/sounds/playback. You can also use any of the default sound recordings found in /usr/share/asterisk/sounds/en for error messages and retry alerts.

Once you have your IVR built, the last step is to adjust an incoming route for one of your DIDs so that it points to your newly created IVR. We do this using the Incalls option in the Navigation bar. If you’re adjusting an existing inbound route, just call it up and make the changes as shown below:

You’re good to go now. Call your DID from another phone and try out your first custom IVR.

Enjoy!

Published: Monday, May 22, 2017  


Support Issues. With any application as sophisticated as this one, you’re bound to have questions. Blog comments are a difficult place to address support issues although we welcome general comments about our articles and software. If you have particular support issues, we encourage you to get actively involved in the PBX in a Flash Forum. It’s the best Asterisk tech support site in the business, and it’s all free! Please have a look and post your support questions there. Unlike some forums, the PIAF Forum is extremely friendly and is supported by literally hundreds of Asterisk gurus and thousands of users just like you. You won’t have to wait long for an answer to your question.



Need help with Asterisk? Visit the PBX in a Flash Forum.


 

Special Thanks to Our Generous Sponsors


FULL DISCLOSURE: ClearlyIP, Skyetel, Vitelity, DigitalOcean, Vultr, VoIP.ms, 3CX, Sangoma, TelecomsXchange and VitalPBX have provided financial support to Nerd Vittles and our open source projects through advertising, referral revenue, and/or merchandise. As an Amazon Associate and Best Buy Affiliate, we also earn from qualifying purchases. We’ve chosen these providers not the other way around. Our decisions are based upon their corporate reputation and the quality of their offerings and pricing. Our recommendations regarding technology are reached without regard to financial compensation except in situations in which comparable products at comparable pricing are available from multiple sources. In this limited case, we support our sponsors because our sponsors support us.

BOGO Bonaza: Enjoy state-of-the-art VoIP service with a $10 credit and half-price SIP service on up to $500 of Skyetel trunking with free number porting when you fund your Skyetel account. No limits on number of simultaneous calls. Quadruple data center redundancy. $25 monthly minimum spend required. Tutorial and sign up details are here.

The lynchpin of Incredible PBX 2020 and beyond is ClearlyIP components which bring management of FreePBX modules and SIP phone integration to a level never before available with any other Asterisk distribution. And now you can configure and reconfigure your new Incredible PBX phones from the convenience of the Incredible PBX GUI.

VitalPBX is perhaps the fastest-growing PBX offering based upon Asterisk with an installed presence in more than 100 countries worldwide. VitalPBX has generously provided a customized White Label version of Incredible PBX tailored for use with all Incredible PBX and VitalPBX custom applications. Follow this link for a free test drive!
 

Special Thanks to Vitelity. Vitelity is now Voyant Communications and has halted new registrations for the time being. Our special thanks to Vitelity for their unwavering financial support over many years and to the many Nerd Vittles readers who continue to enjoy the benefits of their service offerings. We will keep everyone posted on further developments.
 



Some Recent Nerd Vittles Articles of Interest…

Mastering XiVO IVR and AutoAttendant Design




Today we want to talk a little about design choices and IVRs. First and foremost, we don’t want to leave anyone behind during our XiVO adventure. XiVO is a platform that adjectives really can’t describe. It’s that good and, frankly, we’re having a hard time believing it’s been around for almost a decade and nobody much talked about it. Leave it to the crazy Americans to only look at stuff from the U.S. of A. Funny thing is that the two major GUIs for Asterisk® now are both Canadian-based.


One of our PIAF Forum readers posted a comment last week that said:

The only downside I see is that XiVO does not have [a] GUI for building IVRs. To build [a] complex, nested IVR system, everything has to be thought about in great detail writing contexts and dial plans to suit your unique requirements. It would be nice if XiVO offered a GUI for building IVRs.

This raises some issues about GUI design and development that are worth addressing. As with any GUI, the development cycle is lengthy and incredibly complex. This is especially true with XiVO where new versions are released every two weeks! In our second XiVO article, we showed how easy the upgrade procedure was. Those coming from other Asterisk platforms will appreciate this little shocker. XiVO doesn’t break stuff with their upgrades. Frankly, the only other company I can say that about is SONOS. If you don’t have their music platform, you’re missing a treat.

Introducing new components into any "main product" can cause all sorts of problems with the pieces that used to work. If you don’t believe it, look at some of the "other forums" and look at the number of message threads complaining that the new X Widget broke the Y widget and now nothing works. While we can’t speak for everyone, I think it’s safe to say nobody that depends upon their phone system wants to see it go up in flames regularly because some developer had a great new idea that didn’t quite do what it was supposed to do.

To their credit, the XiVO developers were smarter than that. They’ve not only built a mighty mousetrap, but they’ve done it in a way that supports outside integration of additional components without breaking the main product. There are numerous "hooks" that allow anyone with any skill set to add missing pieces. Some of these hooks are exclusively for programmers, but many were designed to let anybody integrate almost anything into the XiVO platform.

So, when a user says "I wish XiVO had an IVR Builder in the GUI," our first inclination was to chuckle and respond with "You just don’t appreciate how lucky you are not to have an IVR Builder in the GUI." What the commenter didn’t appreciate is that you don’t need to pre-build components with XiVO before developing an IVR. With the "other" GUI, you first had to create Custom Destinations and Custom Contexts and Miscellaneous Applications and Miscellaneous Destinations and Custom Recordings in the GUI before you could take advantage of the IVR GUI to build much of anything. Think about that for a minute. Yes, there was an IVR builder but, before you could use it, you first had to transform every component to be incorporated into the IVR using a large number of subcomponents to translate all of your Asterisk pieces into the GUI’s special lingo. Think of them as GUI pigeonholes, and you had to decipher which Asterisk square pegs went in which GUI round holes. We can’t count the number of times we’ve begun the IVR creation process only to have to stop and create missing components because the IVR builder simply wouldn’t recognize a feature as being part of our Asterisk dialplan.

Building IVRs and AutoAttendants with XiVO

The anatomy of an IVR in Asterisk could not be more straight-forward. You have a prerecorded message that plays to the caller giving them choices from which to choose from a menu of selections. The caller presses one of the 12 keys on their phone, and the IVR goes off and does some task: calls an extension, plays a recording, runs an Asterisk application, makes an outside call, or kicks off another IVR with another recording and more choices. Some options in the IVR may not be mentioned, and this is commonly referred to as the Stealth AutoAttendant. None of this is rocket science.

To build an IVR, you need these components: (1) a prerecorded message, (2) a list of the choices you want to provide to the caller with the corresponding destinations on the PBX to execute those choices, and (3) a template to follow to create the IVR dialplan code in XiVO.

Trust us when we say the major problem with IVRs is not that they’re difficult to build in XiVO. The real issue with most IVRs is that the person that implemented the IVR spent all their time worrying about the mechanics of PBX implementation and didn’t put sufficient thought into the IVR layout and the caller’s experience when actually interacting with the IVR. If you haven’t heard Allison Smith speak about IVR design, put it on your Bucket List for the next AstriCon or do some reading. That’s a long-winded way of saying that filling in the blanks of an IVR template is just as easy as point-and-click or drag-and-drop except for the eye candy. Just be thankful the XiVO platform gives you the flexibility to do it yourself without having to create imaginary destination hooks and recording linkages before they can be used in the product’s IVR GUI because the developers didn’t have the foresight to think outside their own GUI’s box. Every Windows user can appreciate that problem.

For today, we’re assuming you’ve done your homework and have already sketched out the options you want to incorporate into your IVR or IVRs. No GUI can help with that! So we’ll pick up from there and show you how easy it is to incorporate your IVR design into XiVO.

Adding Prerecorded Messages in XiVO

For openers, you obviously need a recording to greet callers and tell them what their choices are when using your IVR or AutoAttendant. You can build these recordings yourself on the XiVO platform or, for a more professional IVR, you can send the text off to Allison Smith and let her record the voice prompts for you. Digium makes it easy. Visit their web site, type in the text, and you’ll have your recording in a couple of days. No, they’re not free, but they’re not expensive either.

Since we’re just getting started, let’s assume you want to create a recording prototype on your own to work out the kinks in your IVR first. Here’s how. We’re assuming you’ve already read the Nerd Vittles XiVO tutorial and put the Festival TTS platform in place. Next, log into your XiVO server as root. To keep things simple, let’s put the recordings in WAV format in the /var/lib/xivo/sounds/playback directory which is reserved for our custom recordings:

cd /var/lib/xivo/sounds/playback

To actually generate the sound file that Asterisk can play back, execute the command below after placing your text between the quotation marks and giving the sound file a name, e.g. ivr-number1.wav:

echo "Text goes here" | /usr/bin/text2wave -F 8000 -o ivr-number1.wav

Here’s an example:

echo "Thank you for calling. Press 1 for Tom, 2 for Dick, or 3 for Harry. Press 0 to be connected to the operator." | /usr/bin/text2wave -F 8000 -o ivr-number1.wav

Marrying IVR Choices to PBX Destinations

Whether you’re deploying an IVR using FreePBX® or XiVO, you still have to translate your Plain English options into code that the GUI understands so that calls get routed successfully to the intended destinations.

Let’s begin with the FreePBX Way. Our previous IVR tutorial showed how it was done:




As you can see from the above routing procedure, there were interim steps for every single option in this IVR menu except #8. What you may not appreciate is that you first had to create both a Misc Destination AND a Custom Extension before these options could be used in FreePBX. Otherwise, the options simply didn’t appear in the IVR GUI’s pull-down pick lists.




If you wished to incorporate a custom context that wasn’t assigned an extension number on your PBX, there was a different GUI procedure. For something as simple as retrieving the time of day, you had to get the custom context registered with FreePBX before the dialplan code could be used in the IVR. According to the FreePBX developers, this functionality was considered an "advanced feature and should only be used by knowledgeable users."



Our purpose in documenting all of this is to demonstrate that building IVRs even in a GUI is much more than point-and-click. It requires mastery of some fundamental Asterisk dialplan concepts not to mention the GUI’s own labyrinth of secret pigeonholes. Once you’ve had to master all of that, we believe it’s simpler to build IVRs using simple commands rather than jumping through all of the convoluted hoops required just to make your IVR GUI platform happy.

Let’s compare this methodology to the XiVO way of doing things by way of example. Then you can decide for yourself which approach is more complex. Would you know all of these on your own? Probably not. But now you can see how simple it really is. There really are only two words you need to learn: Dial and Goto. 🙂

Call an Extension: Dial(Local/701@default)
Call a Ring Group: Dial(Local/801@default)
Call a PSTN Number: Dial(Local/8005551212@default)
Call a SIP URI: Dial(SIP/2233435945@rentpbx.mundy.org)
Access DISA with permission: Dial(Local/3472@default)
Join a Conference: Dial(Local/2663@default)
Playback Yahoo News: Dial(Local/951@default)
Playback Weather Forecast: Dial(Local/947@default)
Identify IVR Option as Invalid and Repeat Menu: Goto(i,1)
Hangup on Caller for Choosing Invalid Option: Goto(t,1)
Execute Time of Day Custom Context: Goto(new-time,s,1)
Send Caller to a Second IVR and Play Second Recording: Goto(ivr-2,s,3)

Building XiVO IVRs from an IVR Template

We can’t speak for everyone, but we’ve always told folks not to write a book about how to do something. Just give us an example that’s easy to follow and we’ll take it from there. So here you go.

In the XiVO world, IVRs are nothing more than custom contexts. They have a name in [brackets], and they’re stored in config files saved in /etc/asterisk/extensions_extra.d. A config file can include multiple contexts or only one. For IVRs, we recommend you save each one in a single configuration file that houses a single context.

We’re going to give you a template to follow in creating all of the IVRs you can dream up. All you need is a custom recording for each one and your list of choices and destinations for those choices. The examples above tell you everything you need to know to build awesome IVRs.

After downloading the template, we recommend that you not edit it directly. Make a copy with a new file name and change the context name in the template to match your new file name. We also do one other little trick with all of our custom contexts. They always begin and end with comment lines like this using the context name:

;# // BEGIN ivr-template
;# // END ivr-template

The reason for this is it makes it incredibly easy to remove the entire context with a single command:

sed -i '\\:// BEGIN ivr-template:,\\:// END ivr-template:d' ivr-template.conf

This doesn’t matter so much when you only have a single context in a single file. But it is immensely helpful when you’ve stored dozens of contexts within the same file. Some may prefer to store all of the related IVR contexts for their entire IVR tree in a single file. And then you’ll appreciate this tip when it’s time to make major changes in your IVR.

Let’s begin by putting your template in place and then cloning it to ivr-number1:

cd /etc/asterisk/extensions_extra.d
wget http://incrediblepbx.com/ivr-template.tar.gz
tar zxvf ivr-template.tar.gz
rm -f ivr-template.tar.gz
cp -p ivr-template.conf ivr-number1.conf
sed -i 's|ivr-template|ivr-number1|' ivr-number1.conf

The rest of today’s exercise can be performed in the XiVO GUI using its built-in editor. Open the GUI with your browser and navigate to Services -> iPBX -> Configuration files and then open ivr-number1.conf by clicking on the pencil icon beside it.

Anatomy of the XiVO IVR Template

First things first. Change the sound recording in line s,3 to match the recording you made above without the .wav extension: ivr-number1. Leave the directory path just as it is. So your line should now look like this:

exten => s,3(skip),Set(IVR_MSG=/var/lib/xivo/sounds/playback/ivr-number1)

Next, take a look at the structure of the file. You’ll note that there are options labeled exten => 0,1, through exten => 9,1,. These match the numeric keys on a telephone obviously. In the IVR world, it’s called a phone tree. All you need to change is what comes after the second comma on each line. This destination should be one of the XiVO commands we documented above telling XiVO how to process the call. For option 0, let’s assume you wanted to route the call to extension 701. Your 0 branch would look like this:

exten => 0,1,Dial(Local/701@default)

The remaining dial options should be obvious. If you want to designate a particular option to be invalid, make the option look like this:

exten => 9,1,Goto(i,1)

Another alternative is to remove the line entirely; however, we prefer the above approach because it makes it easy to change things down the road if you decide to use option 9 as a call destination.

Two other options warrant a brief explanation. The i option tells XiVO how to process the call if the caller chooses an invalid option. The t option tells XiVO what to do if the 3-second timeout occurs without the caller pressing a key. You can modify these to meet your own requirements. As configured, an invalid option sends the caller back to the recording to start over. And the timeout option hangs up the call.




Finally, phone trees can get quite complex. A GUI can’t fix that either. Pressing option 2 might trigger phone tree 2 while pressing 3 might trigger phone tree 3. Programmers could obviously rewrite the dialplan to handle all of these separate phone trees with their separate branches in one giant, convoluted chunk of dialplan code. But why? Just make each phone tree a separate IVR housed in its own file with its own context. And navigate between the IVRs using simple Goto commands such as Goto(ivr-number2,s,3). To return to the main IVR, do the same thing pointing to the line number to which the call should be redirected, e.g. Goto(ivr-number1,s,3). You obviously don’t need to answer each call but once so skip those lines in the IVR dialplan when choosing the line number to which to redirect processing.

Routing Incoming Calls to Your IVR

If you’ve already set up one or more DIDs on your PBX, then you probably routed those Incoming Calls to a user or ring group. Changing the routing to send the calls to your IVR is easy. Just edit the DID entry for the Incoming Calls you wish to redirect and set the Destination to Customized and the destination Command to the context of your IVR: Goto(ivr-number1,s,1). Save your change and you’re all set. Remember, XiVO is a real-time Asterisk server so all of your changes take effect immediately. There’s no rewriting of the entire Asterisk dialplan. Enjoy!

Letting Callers Dial Extensions Within IVR

Some administrators prefer to let callers dial an extension directly while an IVR is playing. You can easily add this functionality in XiVO. This post on the PIAF Forum showed how. Simply edit /etc/asterisk/extensions_extra.d/ivr-1.conf and modify the code like this. Be sure to change the number of X’s in the last line to match the length of your extension numbers. Then reload your dialplan.

;exten => s,n,ExecIf($["${IVR_MSG}" != ""]?Background(${IVR_MSG}))
;exten => s,n,WaitExten(10,)
exten => s,n,Read(Digits,${IVR_MSG})
exten => s,n,Goto(${Digits},1)
exten => _XXX,1,Dial(Local/${Digits}@default)

Taking Nerd Vittles’ XiVO IVR for a Test Drive

There’s a Demo IVR running at www.pacificnx.com on their XenServer virtualization platform. Scott McCarthy, a leading outside XiVO developer and a principal at PacificNX, tells us they soon will have a $20 a month platform specifically tailored to XiVO. And that’s what you’ll be hearing when you call the Nerd Vittles Demo IVR:

Nerd Vittles Demo IVR Options
1 – Call by Name (say "Delta Airlines" or "American Airlines" to try it out)
2 – MeetMe Conference
3 – Wolfram Alpha (Coming Soon!)
4 – Lenny (The Telemarketer’s Worst Nightmare)
5 – Today’s News Headlines
6 – Weather Forecast (enter a 5-digit ZIP code)
7 – Today in History (Coming Soon!)
8 – Speak to a Real Person (or maybe just Lenny if we’re out)

Published: Thursday, May 26, 2016

UPDATE: The first release of Incredible PBX for XiVO is now available here. Please consider this article as a supplement to the new release.





Need help with Asterisk? Visit the PBX in a Flash Forum.


 

Special Thanks to Our Generous Sponsors


FULL DISCLOSURE: ClearlyIP, Skyetel, Vitelity, DigitalOcean, Vultr, VoIP.ms, 3CX, Sangoma, TelecomsXchange and VitalPBX have provided financial support to Nerd Vittles and our open source projects through advertising, referral revenue, and/or merchandise. As an Amazon Associate and Best Buy Affiliate, we also earn from qualifying purchases. We’ve chosen these providers not the other way around. Our decisions are based upon their corporate reputation and the quality of their offerings and pricing. Our recommendations regarding technology are reached without regard to financial compensation except in situations in which comparable products at comparable pricing are available from multiple sources. In this limited case, we support our sponsors because our sponsors support us.

BOGO Bonaza: Enjoy state-of-the-art VoIP service with a $10 credit and half-price SIP service on up to $500 of Skyetel trunking with free number porting when you fund your Skyetel account. No limits on number of simultaneous calls. Quadruple data center redundancy. $25 monthly minimum spend required. Tutorial and sign up details are here.

The lynchpin of Incredible PBX 2020 and beyond is ClearlyIP components which bring management of FreePBX modules and SIP phone integration to a level never before available with any other Asterisk distribution. And now you can configure and reconfigure your new Incredible PBX phones from the convenience of the Incredible PBX GUI.

VitalPBX is perhaps the fastest-growing PBX offering based upon Asterisk with an installed presence in more than 100 countries worldwide. VitalPBX has generously provided a customized White Label version of Incredible PBX tailored for use with all Incredible PBX and VitalPBX custom applications. Follow this link for a free test drive!
 

Special Thanks to Vitelity. Vitelity is now Voyant Communications and has halted new registrations for the time being. Our special thanks to Vitelity for their unwavering financial support over many years and to the many Nerd Vittles readers who continue to enjoy the benefits of their service offerings. We will keep everyone posted on further developments.
 



Some Recent Nerd Vittles Articles of Interest…

IVR 101: Six Quick Steps to Building Incredible IVRs for Asterisk with FreePBX

As more and more Asterisk® platforms enter the open source community, it seems as if we spend a lot of energy covering the basics of getting those new systems into place, and there’s little time left for tutorials that really make the difference in a great telephony system and one that just makes calls. So our New Year’s Resolution is to try to devote a column every month to smelling the roses and pushing out some information that actually helps newbies in the VoIP community learn something while getting them up to speed on creating important pieces of a PBX themselves.

For today, IVR 101 tackles Interactive Voice Response systems (IVRs) and AutoAttendants. These are the tools that let callers interact with a PBX without assistance from a receptionist. What’s the difference in an IVR and AutoAttendant? Both offer unattended call processing, but an IVR is more sophisticated typically offering much more than a menu tree of connection options to the caller. For example, some of the options in today’s demo IVR let the caller interact directly with the computer to retrieve customized responses. Call by Name lets the caller speak the name of a person or company to dial, Weather by City lets the caller choose the City and State, Province, or Country of a weather forecast to retrieve, and Wolfram Alpha lets the caller ask about almost anything you’d find in your favorite almanac. Twenty years ago, companies were spending $100,000+ to get this functionality from the Bell Sisters and companies like Nortel. Today you can do it with a Raspberry Pi or BeagleBone Black running Incredible PBX for less than $50. Much has been written about IVR Hell and how to build effective IVRs that don’t drive callers crazy. We’ll leave that one for you to explore on your own. But we can’t stress enough how important this really is. It can make or break a company! If you’re unwilling to invest the time in the IVR design, there are companies such as CallFire that will do it for you. For do-it-yourselfers, you’ll want to start with Allison’s 15 Commandments (for ease of reference, we have linked to the individual articles on Digium’s site below) and then do a little Googling on your own. There’s a wealth of information on the topic.

Allison’s 15 Commandments of IVR
 
1. Don’t Overestimate Your Listener’s Attention Span
2. Thou Shalt Not Create Fake Mailboxes
3. Keep Things Simple
4. Always Give Callers an Opt-”In”
5. Front-Load Important Information
6. Understand What Constitutes a “Prompt”
7. Understand The Effects of Proper Punctuation in Concatenation
8. Thou Shalt Not Give Directions To Your Office/Facility
9. Give a Pronunciation Guide for Proper Names and Place Names
10. Name Your Company Something That Needs No Special Instruction
11 Don’t Go Overboard with Niceties
12. Read The Copy Out Loud
13. Be Clear on Your Company’s Vision/Image — And Be Able To Explain That To Me
14. Don’t Front-Load Too Much Information in The Opening Greeting
15. Write in a Conversational Tone

Step #1: Documenting What You Want Your IVR to Do

Our task today is to cover the mechanics of building an effective IVR. That, of course, starts with a pencil and paper. Before you can build anything, you need a blueprint for what you’re trying to accomplish and how we go about getting there. What choices do you want to give callers that dial into your PBX? Do you want all of these options announced to every caller, or should some of them be left hidden (perhaps behind passwords) that let certain users interact with your PBX in ways that casual callers won’t know about. Keep in mind that the bad guys have telephones, too. So, even though an IVR option may not be mentioned, that doesn’t mean that the curious caller won’t push buttons you didn’t describe as available. Unless you have deep pockets, for example, you probably wouldn’t want to make a DISA call-out option available, whether hidden or otherwise, without protecting it with a very secure password. Similarly, an IVR option that lets anybody schedule a reminder to any phone number of their choice is not too smart.

Rule #1: The very first question you need to ask yourself with every IVR option is "Can this function end up costing me money?" If the answer is "yes" then you need a very secure password before any caller can access that feature.

For today, we’re going to build a call tree that shows off some of the features included in Incredible PBX. When a caller dials into a certain number on your PBX, we’ll play a message that describes the available options. Then we’ll let the caller play with the Incredible PBX feature set. You probably would want to set this system up on a phone number that supports unlimited inbound calls at no additional cost. In short, ask yourself: "Do thousands of 30-minute calls to my demo IVR end up costing me money?" If the answer is "yes" then don’t build a non-essential IVR without first securing a DID that doesn’t cost you by the minute. There are lots of choices including Google Voice which happens to still be free and available until May 15, 2014. There’s also IPkall that still gives out free DIDs in the Seattle area to anyone with a SIP URI. If you haven’t already guessed, we’re trying to get you in the mindset of always assuming the worst case from every potential caller. After all, it’s your phone bill.

We started with our pencil and paper and sketched out what we wanted to include in our Demo IVR. And, by the way, you would never want to position "speak to a real person" as the last option in a real IVR unless you just love pissing off your customers. Today’s IVR wasn’t designed to let you speak to a real person… other than Lenny. 😉

Test Drive: Demo IVR with Incredible PBX on the $45 BeagleBone Black RasPBX

Step #2: Recording the Voice Prompt for the Demo IVR

When people call your phone number, they expect someone to answer the call. In the case of an IVR or AutoAttendant, you’ll need a voice prompt to tell callers what options are available. The options need to be concise keeping in mind that the average attention span of callers is about 30 seconds. You don’t want callers hanging up before they’ve even reached the end of your schpeel. You also don’t want callers to have to listen to a dozen options when the option they wanted was #1. We’re going to be using FreePBX® to create the IVR so it will automatically permit callers to interrupt the talking head by pressing a button. If you’re doing this with Asterisk dialplan code, make sure you use the Background function to play your voice prompt rather than Playback which forces callers to listen to the entire recording before making a choice.

In recording voice prompts, you have a number of options. The most professional is to hire Allison to record the prompts for you. Then it matches all of the other prompts on your Asterisk system. You can do this through Digium’s web site, and the cost is quite reasonable. For bigger projects, contact Allison directly through her web site. Another alternative is to record the prompt yourself. This can be done with professional recording equipment or using an ordinary phone with FreePBX: Admin -> System Recordings -> Extension Number. Who knows? You may want to break into the voice-over business yourself.

The other alternatives involve use of a text-to-speech engine to create the voice prompts. A synthesized "Allison voice" is available from Cepstral®; however, due to a change in licensing, you now will need three different licenses in order to record voice prompts. If you want on-the-fly prompts using Cepstral, you also will need additional licenses for each simultaneous caller. Other than in the corporate environment, we can no longer recommend Cepstral. And, even for business use, Allison’s custom recordings are far superior to the TTS renditions in our opinion.

Two free text-to-speech alternatives are available on Incredible PBX platforms. Flite sounds much like Herman Munster. You can understand him. That’s about it. GoogleTTS is a female voice that actually does a good job. For demo projects, we typically use GoogleTTS although you won’t have to today. GoogleTTS voice prompts can be created from the command line by logging in as root. The following command would build an ivr.wav voice prompt for this demo IVR that is suitable for use on all Asterisk-based systems:

googletts-cli.pl -t "Hi: Thank you for calling. To call by name, press 1: To join the conference, press 2: For Wool From Alpha: press three: To speak to Lenny: press four: For today's news headlines, press 5: For today's weather forecast, press 6. For today in history, press 7. Or press 8 for the house phones and speak to a real person." -r 8000 -o ivr.wav

As a Christmas present to all of us, Allison has actually recorded the voice prompt for this demo IVR, and you are more than welcome to download it and use it in building a Demo IVR for your own computer. It provides a great example of the quality of Allison’s recordings. Night and day pretty much sums up the difference between Allison’s recording and the GoogleTTS version, but you can judge that for yourself. Here’s the download link for the ivr-Allison.wav prompt. And here’s the download link for the GoogleTTS ivr.wav prompt. Just import the files into FreePBX as outlined below.

Step #3: Importing the Voice Prompt into FreePBX

Before we actually create our IVR application in FreePBX, we first need to get our two voice prompts from Allison and GoogleTTS imported so that they can be used as part of the FreePBX system. There are two ways to do this. The first is to import a file from your desktop PC using the FreePBX GUI. We’ll use this to grab the Allison prompt you downloaded to your desktop above. Choose Admin -> System Recordings. Then Choose File -> ivr-Allison.wav -> Upload. Now Name the file: ivr-Allison and click Save.

The second option is to create a dummy IVR voice prompt in FreePBX and then replace the dummy ivr.wav file with your actual recording. Let’s create a dummy recording just to show you the procedure to use for GoogleTTS prompts. Choose Admin -> System Recordings. Enter an extension number that is connected to your PBX: 701 then click Go button. Using extension 701, dial *77 and record a few words of gibberish. Press # and hang up. Give the recording the same name as the file we wish to upload (without the extension): ivr. Click the Save button. Finally, from the directory on your Incredible PBX server where you recorded your GoogleTTS ivr.wav file in Step #2 above, move the ivr.wav file to its permanent location: mv ivr.wav /var/lib/asterisk/sounds/custom

Step #4: Creating the IVR in FreePBX

To create the IVR in FreePBX on the Raspberry Pi or BeagleBone Black platform, choose Applications -> IVR -> Add IVR and then fill in the blanks to match this template clicking the + button to add the necessary number of IVR options, SUBMIT your entries, and APPLY CONFIG to reload FreePBX. You will note that, for each of the applications, we already have created a Misc Destination within FreePBX so that it can be used as part of a FreePBX-generated IVR. If you’ve created your own dialplan or AGI applications, you would need to complete this step before creating your IVR. To use Allison’s prompt instead of the GoogleTTS prompt, simply change the top Announcement entry below from ivr to ivr-Allison. Then, Allison’s prompt will play when a call is first answered, and the GoogleTTS version will play for invalid, timeout, and repeat announcements. That makes it easy for you to compare the two alternatives.

Step #5: Linking the IVR to an Incoming DID in FreePBX

Finally, you’ll need a DID that folks can call to reach your IVR. We’ll assume you’ve already set that up on your PBX so all we need to do in FreePBX is create an Inbound Route to pass incoming calls to that phone number. Choose Connectivity -> Inbound Routes -> Add Incoming Route and fill in the blanks using the template below and the actual number of your DID. Click Submit and Apply Config to complete the process.

Step #6: Taking the Demo IVR for a Test Drive

This is a really important final step. ALWAYS try out every option on your IVR immediately after creating it. Be sure you call the IVR twelve times and press every button on your phone to make certain the results match what you expected to create. If not, edit the IVR in FreePBX and then try your calls again. As obvious as this sounds, you probably already know that many "professionally-built" IVR creations seem to have forgotten this step. We couldn’t begin to tell you the number of IVRs we have encountered with dead links, looping menus, and on and on. Do your callers a favor. Test your stuff before you put it in production.

Test Drive: Demo IVR with Incredible PBX on the $45 BeagleBone Black RasPBX


Another Banner Year at Nerd Vittles. As 2013 comes to a close, we want to thank our 500,000+ unique and very special visitors this year from 218 countries around the globe! With an average 5 million page views every month, it’s heartening to see the VoIP story spreading like wildfire. Are you listening VoIP merchants? We wish all of you a very Happy and Prosperous New Year and hope you will join us again in 2014 as the VoIP revolution marches on.

Originally published: Monday, December 30, 2013



Need help with Asterisk? Visit the PBX in a Flash Forum.


whos.amung.us If you’re wondering what your fellow man is reading on Nerd Vittles these days, wonder no more. Visit our whos.amung.us statistical web site and check out what’s happening. It’s a terrific resource both for all of us.


 

Special Thanks to Our Generous Sponsors


FULL DISCLOSURE: ClearlyIP, Skyetel, Vitelity, DigitalOcean, Vultr, VoIP.ms, 3CX, Sangoma, TelecomsXchange and VitalPBX have provided financial support to Nerd Vittles and our open source projects through advertising, referral revenue, and/or merchandise. As an Amazon Associate and Best Buy Affiliate, we also earn from qualifying purchases. We’ve chosen these providers not the other way around. Our decisions are based upon their corporate reputation and the quality of their offerings and pricing. Our recommendations regarding technology are reached without regard to financial compensation except in situations in which comparable products at comparable pricing are available from multiple sources. In this limited case, we support our sponsors because our sponsors support us.

BOGO Bonaza: Enjoy state-of-the-art VoIP service with a $10 credit and half-price SIP service on up to $500 of Skyetel trunking with free number porting when you fund your Skyetel account. No limits on number of simultaneous calls. Quadruple data center redundancy. $25 monthly minimum spend required. Tutorial and sign up details are here.

The lynchpin of Incredible PBX 2020 and beyond is ClearlyIP components which bring management of FreePBX modules and SIP phone integration to a level never before available with any other Asterisk distribution. And now you can configure and reconfigure your new Incredible PBX phones from the convenience of the Incredible PBX GUI.

VitalPBX is perhaps the fastest-growing PBX offering based upon Asterisk with an installed presence in more than 100 countries worldwide. VitalPBX has generously provided a customized White Label version of Incredible PBX tailored for use with all Incredible PBX and VitalPBX custom applications. Follow this link for a free test drive!
 

Special Thanks to Vitelity. Vitelity is now Voyant Communications and has halted new registrations for the time being. Our special thanks to Vitelity for their unwavering financial support over many years and to the many Nerd Vittles readers who continue to enjoy the benefits of their service offerings. We will keep everyone posted on further developments.
 



Some Recent Nerd Vittles Articles of Interest…

Allison’s Text-to-Speech Trifecta: Cepstral, Asterisk 1.4 or 1.6, and FreePBX 2.4

If you've longed for a text-to-speech Asterisk® toolkit that sounds just like the default Allison prompts that ship with Asterisk 1.4, then today is your lucky day. We're going to walk you through installing Cepstral with Asterisk 1.4 or 1.6 and FreePBX 2.4. The icing on the cake is a new Cepstral voice that sounds just like the twin sister of Asterisk's Allison. And guess what? Just like the two Darryl's on the Bob Newhart Show, the twin sister's name is Allison, too. What a coincidence! Well, not really. Allison is actually the first TTS voice created using Cepstral's new VoiceForge™ technology. For the complete history of the development of Allison's voice for Cepstral, you can read all about it here.

Update: For the latest news on Cepstral and app_swift, visit the PBX in a Flash Forums.

Next week, in Part 2, we'll build the Nerd Vittles' Stealth AutoAttendant in FreePBX to answer your incoming calls with a separate IVR to process calls when you're not around. For those new to Nerd Vittles, the Stealth AutoAttendant answers incoming calls with a message like this: "Hi. You've reached Total Telephony Solutions. Please hold a moment while we connect your call to the next available representative." Or, for home users, the message might go something like this: "Hi. You've reached the Mundy's residence. Someone will be right with you." While the greeting message is playing, you can press keys on your phone to transfer to an extension, activate DISA, or retrieve your voicemail messages. Because the options aren't advertised in the greeting, other callers won't know they're available. We'll protect the IVR options with passwords, of course. The NoAnswer or Unavailable IVR will also include options to leave a message, transfer to your cell phone, or drop into an applications AutoAttendant. The difference in the 2008 version of these AutoAttendants is that, this time around, you can customize all of the IVR announcements and options to meet your specific needs in less than a minute. And we'll design, develop, and deploy the entire solution using FreePBX's web interface and no custom code. All of this becomes possible thanks to FreePBX and Cepstral's Allison, who will be on your payroll once we get finished up with this project.

Prerequisites. To get this working won't cost you a dime. But, once you've played with it and like it (and we know you will), you'll need to spring for the $30 to license the Cepstral Allison voice for your Asterisk system. Our advice is simple. Try it first. Then you can buy it. You'll also need a robust Asterisk 1.4 platform with Linux, Apache, SendMail, PHP, and MySQL preconfigured to support text-to-speech applications. Not that we're biased or anything, but may we recommend you give PBX in a Flash a try. You'll find complete installation instructions and the free download here.

And, during the FreePBX Training Seminar in Charleston, we'll walk you through revising the Nerd Vittles weather, news, and email text-to-speech applications to take advantage of the tremendous power that Cepstral and Cepstral's Allision now bring to your Asterisk platform. See what you're missing by not attending the FreePBX Training Seminar. Don't worry!! We'll share all of the code with you anyway, but the seminar participants will get to play with it first.

Installing Cepstral. For today, we're going to walk you through installing Cepstral with the Cepstral Allison voice. But there are numerous other voices. You can check all of them out on the Cepstral demo site. Just be sure to select only the 8kHz voices which are specifically designed to support telephony applications. Once you find the voice you like, you can decipher the download link here. Be sure you choose the correct i386-Linux version for your system. You can't use the 32-bit version on a 64-bit CentOS system, e.g. the new 64-bit ISO of PBX in a Flash 1.2. But the same license key works for both the 32-bit and 64-bit versions of the same voice. Upgrades to the 5.0 Cepstral voices are available here.

CentOS 5.x 32-bit Install. For the 32-bit version of PBX in a Flash 1.1 or 1.2, log into your system as root and enter the following commands:1

cd /root
wget http://downloads.cepstral.com/cepstral/i386-linux/↩
Cepstral_Allison-8kHz_i386-linux_5.1.0.tar.gz
tar -zxvf Cepstral*
cd Cepstral_Allison-8kHz_i386-linux_5.1.0
./install.sh

CentOS 5.1 64-bit Install. For the 64-bit version of PBX in a Flash 1.2, log into your system as root and enter the following commands:

cd /root
wget http://downloads.cepstral.com/cepstral/x86-64-linux/↩
Cepstral_Allison-8kHz_x86-64-linux_5.1.0.tar.gz
tar -zxvf Cepstral*
cd Cepstral_Allison-8kHz_x86-64-linux_5.1.0
./install.sh

After you've read the license, type yes to install the voice on your system, not -yes- as the instructions imply. Don't ask how I know. Accept the default locations for the installation. When the installation completes, issue the following command:

echo /opt/swift/lib > /etc/ld.so.conf.d/cepstral.conf
ldconfig

Now plug some speakers into your PBX in a Flash system, and type: swift "Hello World." If you want to get fancy, try this one:

swift "Hello <break time='200ms' /> World"

You can read up on Cepstral's Speech Synthesis Markup Language (SSML) here. Before we continue, you need to write down the name of the installed voice. You'll need this to register the voice later and to get Asterisk set up properly to use Cepstral. Here's the command to retrieve the voice name(s) that you've installed:

ls /opt/swift/voices

Installing app-swift. There's another important piece in getting Cepstral to play nicely with Asterisk 1.4 or 1.6, apt-swift. In the words of the author, it does four things and does them well:

* Doesn't keep the caller waiting in silence while the app generates the entire TTS output to a temp file
* Doesn't unceremoniously kill off the swift engine when done, upsetting the Cepstral license server and eating a concurrency license
* Has configurable in-memory buffering of the swift output to balance memory usage vs Swift process concurrency
* Responds to user DTMF during the speech by setting a channel variable and optionally doing a goto of the extension entered

Asterisk 1.4 Install. To install apt-swift on your PBX in a Flash/Asterisk 1.4 system:

cd /usr/src
wget http://pbxinaflash.net/source/app_swift/app_swift-1.4.2.tar.gz
tar -zxvf app_swift*
rm *.gz
cd app_swift-1.4.2
make
make install

Asterisk 1.6 Install. If you're using the newer versions of PBX in a Flash with Asterisk 1.6, you will need Darren Session's 1.6-compatible version of app-swift:

cd /usr/src
wget http://pbxinaflash.net/source/app_swift/app_swift-1.6.2.tar.gz
tar -zxvf app_swift-1.6*
rm *.gz
cd app_swift-1.6.2
make
make install
cp swift.conf.sample /etc/asterisk/swift.conf
chown asterisk:asterisk /etc/asterisk/swift.conf

Finally, you need to add a link in your search path for Cepstral and modify /etc/asterisk/swift.conf to tell it which voice you want to use with Asterisk and then restart Asterisk. Assuming you installed Allison-8kHz, here are the commands.

ln -s /opt/swift/bin/swift /usr/bin/swift
sed -i 's|David-8kHz|Allison-8kHz|' /etc/asterisk/swift.conf
amportal restart

Testing Cepstral in Your Dialplan. To be sure that everything is installed and working with Asterisk, issue this command:

asterisk -rx "core show application swift"

You should receive the following response:

-= Info about application 'Swift' =-

[Synopsis]
Speak text through Swift text-to-speech engine.

[Description]
Swift(text) Speaks the given text through the Swift TTS engine.
Returns -1 on hangup or 0 otherwise. User can exit by pressing any key.

If everything is working swimmingly, let's modify your dialplan a bit to give Cepstral a test run. Edit /etc/asterisk/extensions_custom.conf (nano -w filename) and search (Ctrl-W) for 1234. You should then see a string of code that looks something like this:

exten => 1234,1,Playback(demo-congrats)
exten => 1234,2,Hangup()
exten => h,1,Hangup()

Let's modify it so that it looks like this:

;exten => 1234,1,Playback(demo-congrats)
exten => 1234,1,Swift(Congratulations! You have installed Cepstral.)
exten => 1234,2,NoOp(Key pressed: ${SWIFT_DTMF})
exten => 1234,3,Swift(You pressed ${SWIFT_DTMF}. Goodbye.)
exten => 1234,4,Hangup()
exten => h,1,Hangup()

Save your changes (Ctrl-X, then Y, then Enter). And restart Asterisk: amportal restart. Now dial 1-2-3-4 from an extension on your PBX in a Flash system. Presto! Welcome to the World of Cepstral on your Asterisk 1.4 PBX. Should you have problems with the install, kindly post a message on the PBX in a Flash Forum. Enjoy!

Licensing Cepstral Voices. If you've made it this far with no hiccups, it's probably time to cough up your 30 bucks and make the nag messages disappear. (HINT: Read all of the comments, and you might save some money.) Keep in mind that it's $30 per simultaneous connection using Cepstral! If you're an application designer, you probably need to keep this in mind. It doesn't tie up your Cepstral voice very long to read a sentence. But reading a 7-day weather forecast is another matter. For the latter type application, it makes more sense to conserve your voice licenses by quickly generating a .wav file with Cepstral and then releasing the Cepstral engine. The same applies with IVR applications. Using Cepstral is the same PHP syntax as flite except you substitute the swift command, e.g. system("swift -f $inputfile -o $outputfile"). You then can play back the .wav file using other tools within Asterisk. Now go to this link to pay the piper. Be sure you select U.S. English language, Allison-8kHz voice, and Linux platform before you check out, or it's money down the drain. Write down the name, company (optional), and key that is issued once you fill in the blanks. Then it's back to your PBX in a Flash system as root and enter the following command. Note: it's two hyphens before the word reg-voice.

swift --reg-voice

Fill in the blanks with the information you wrote down, and you're all set. Dial 1-2-3-4 from a phone on your system again, and the nag message should be gone.

Your Name: John Q. Public
Company (if applicable): Acme Widgets
Voice: Allison-8kHz
License Key: xx-xxxxxx-xxxxxx-xxxxxx-xxxxxx-xxxxxx


Some Recent Nerd Vittles Articles of Interest...

  1. Join the following line and the original line with no intervening space when you encounter the ↩ character. []

Free Asterisk IVR Prompts While They Last

NOTE: For a more current article on setting up an IVR application with Asterisk®, see this Nerd Vittles article.

In its infinite wisdom, Digium® has discontinued its original voice prompt web site and substituted a new (more expensive) site. Obviously, there aren’t a lot of lawyers on the Digium payroll, or they might have mastered why breaching contracts is not a very smart business move. But, who cares? We love all the guys at Digium and all that they’ve done for the Asterisk community. So we’ve decided to forego our litigious instincts and give away the remaining cache of Nerd Vittles voice prompts which were paid for with the hard-earned dollars of Nerd Vittles readers from around the globe. Footnote: Digium has graciously responded to our whining in a comment below. Thanks for the clarification, Jim.

Here’s the deal. We have several dozen free voice prompts which are up for grabs to anyone who requests one. In fairness to everyone, these will be distributed on a first-come, first-served basis. One per customer, please. Each voice prompt is limited to 20 words or less. Hyphenated words, etc. count as multiple words. If your request exceeds 20 words, you lose your place in line. Decisions of Nerd Uno are final. Email your request together with the text for the voice prompt to NoneLeft at mundy dot org. Before you send the email, look at the comments to this posting to be sure the supply of voice prompts has not been exhausted. Once our supply of voice prompts on the original Digium web site is exhausted, this offer expires whether you’ve sent a request or not. All requests must be processed on or before November 21, 2006. Enjoy!

Sorry, but our supply of voice prompts has been exhausted.

Using Your Digium Voice Prompts. Once you receive your prompt from Digium, be aware that it is not in a format that can be used with Asterisk or TrixBox as delivered. To convert it, you can do one of two things.

First, you can use Digium’s conversion tool to convert the file to a usable GSM or WAV format.

Second, you can convert it yourself by copying it to your Asterisk server and running one of the following commands (substituting the name of your file):

sox yourfile.wav -r 8000 -c 1 yourfile.gsm

If sox is used, it has been recommended that you lower the volume a bit and keep the file in wave format for improved quality. For our samples, 50% sounded just right:

sox inputfile.wav -r 8000 -s -c 1 -v 0.5 -w outputfile.wav resample –ql

Once the file is converted, you again have two options to use it. Either copy the file directly to the /var/lib/asterisk/sounds/custom folder and use it in your dialplan.

Or use freePBX’s built-in sounds file tools by choosing Setup->System Recordings with the remastered .wav file stored on your PC or Mac. Once imported, you then have full access to the sound file in creating Digital Receptionists.

NOTE: After importing with the freePBX tools, if you opted to convert the original file to .gsm format, you can substitute the .gsm converted file for the .wav file in the custom folder once you have converted it using one of the first two methods above. Just remember to remove the original .wav file from the folder, or your prompt won’t play.

Special thanks to Arsene Laurent for the conversion tips.


Some Recent Nerd Vittles Articles of Interest…

AstriCon 10: WOW! What a Coming Out Party for Asterisk 12!

It was the tenth anniversary of AstriCon in Atlanta this week with an SRO crowd, and what a week it was. Comparing Asterisk® 12 to Asterisk 11 and previous iterations would be much like comparing Windows 8 to Windows 3.1. Facelift doesn’t begin to describe the metamorphosis. There’s a brand new (robust) SIP implementation featuring PJSIP, and a new restful interface known as ARI that lets you get at all of the Asterisk internals with a simple web command. You can transfer calls, play sound files, set up conferences and move participants with the click of a button. Here’s the complete slideshow on Asterisk 12. That’s just the tip of iceberg. Features still are being added almost weekly. Unlike previous releases, there’s no feature freeze in Asterisk 12 so long as the additions are germane to the new functionality already incorporated into Asterisk 12. See the Wiki link for details. And the work under the hood really shines. Here’s another shocker. There’s actually documentation. In fact, you can no longer add code to the project without also providing documentation for your code. Yes, this is truly a WOW moment! Think of it more as the Second Coming of Asterisk. Most importantly, the alpha release was relatively stable! And now there’s a beta.

We were so excited by our preliminary look at Asterisk 12-alpha and the new PIAF-Black (we’re running out of colors) preview that we actually set up our Incredible PBX IVR with news, weather, stocks, reminders, and conferencing in our car for the 5-hour trip to Atlanta. Speech to text works. Text to speech works. In fact, with the exception of CDRs, everything worked with the existing FreePBX® 2.11 dialplan code. The CDR transformation will get sorted out in coming weeks/months with the introduction of FreePBX 2.12. Back to our story, with the help of Verizon Wireless 4G LTE tethering, close to a hundred people called into the demo IVR to try things out for themselves. No crashes, no stuttering, high quality VoIP calls. In short, just pure Allison IVR goodness. See if you can find her in the snapshot of your favorite hams.

Monday and Tuesday of AstriCon are primarily devoted to future development goals and objectives. Known as AstriDevCon, the forum is by invitation only to about 50 developers. We were fortunate to be included this year, but the work of the group is no secret. You can review exactly what was said and where we’re headed in this Wiki posting of the meeting. The good news is there will be more meat on the bones of Asterisk 12. And our security recommendations regarding incorporation of Fail2Ban-like functionality directly into Asterisk made the list. This means attacks and vulnerabilities can be identified in real time rather than delaying a response until Fail2Ban has had time to scan your logs for nefarious activity. We also were heartened to see almost a third of AstriCon presentations devoted to beefing up security on Asterisk systems. We’ll have more to say about those discussions as well as some recommendations in coming weeks.


WebRTC also was a big hit at AstriCon 10. This provides the functionality to make and receive phone calls to Asterisk-based systems using nothing more than a web browser. A WebRTC implementation for FreePBX-based systems including PBX in a Flash is just around the corner. Some of you may recall that we released a WebRTC appliance based upon PBX in a Flash last winter. It will run on any Windows, Mac, or Linux desktop so read the tutorial and download away for a quick preview of what’s coming.

We were especially pleased to review Steve Murphy’s new SayScript proposal for Asterisk 13. In a nutshell, this would transform all "say" commands with prerecorded sound files into pluggable modules with translation to any language on the fly. "Language packs" would be developed that include script files, prompts, and SayScript logic to handle almost any speech chore in Asterisk. Think of it as Text-to-Speech on Steroids. Here’s a complete copy of Steve’s presentation in PDF format if you’d like more details.

Last but not least, Schmooze introduced a new fault-tolerant, high availability commercial module for FreePBX that brings complete redundancy to the Asterisk platform for the first time. Until October 15, you can purchase the two-node system for half-price, just $1,500. Be sure to let them know your friends at Nerd Vittles referred you so that we can keep the lights on for another year. And keep us posted during your deployment.

Originally published: Friday, October 11, 2013



Need help with Asterisk? Visit the PBX in a Flash Forum.


 

Special Thanks to Our Generous Sponsors


FULL DISCLOSURE: ClearlyIP, Skyetel, Vitelity, DigitalOcean, Vultr, VoIP.ms, 3CX, Sangoma, TelecomsXchange and VitalPBX have provided financial support to Nerd Vittles and our open source projects through advertising, referral revenue, and/or merchandise. As an Amazon Associate and Best Buy Affiliate, we also earn from qualifying purchases. We’ve chosen these providers not the other way around. Our decisions are based upon their corporate reputation and the quality of their offerings and pricing. Our recommendations regarding technology are reached without regard to financial compensation except in situations in which comparable products at comparable pricing are available from multiple sources. In this limited case, we support our sponsors because our sponsors support us.

BOGO Bonaza: Enjoy state-of-the-art VoIP service with a $10 credit and half-price SIP service on up to $500 of Skyetel trunking with free number porting when you fund your Skyetel account. No limits on number of simultaneous calls. Quadruple data center redundancy. $25 monthly minimum spend required. Tutorial and sign up details are here.

The lynchpin of Incredible PBX 2020 and beyond is ClearlyIP components which bring management of FreePBX modules and SIP phone integration to a level never before available with any other Asterisk distribution. And now you can configure and reconfigure your new Incredible PBX phones from the convenience of the Incredible PBX GUI.

VitalPBX is perhaps the fastest-growing PBX offering based upon Asterisk with an installed presence in more than 100 countries worldwide. VitalPBX has generously provided a customized White Label version of Incredible PBX tailored for use with all Incredible PBX and VitalPBX custom applications. Follow this link for a free test drive!
 

Special Thanks to Vitelity. Vitelity is now Voyant Communications and has halted new registrations for the time being. Our special thanks to Vitelity for their unwavering financial support over many years and to the many Nerd Vittles readers who continue to enjoy the benefits of their service offerings. We will keep everyone posted on further developments.
 



Some Recent Nerd Vittles Articles of Interest…

Introducing Telephone Reminders 2.5: The Free Asterisk Telephone Reminder System

It's free software day again at Nerd Vittles, and today we're updating our Telephone Reminder System for Asterisk@Home 2.5. The system lets you schedule reminders for future events and, when the appointed date and time arrives, Asterisk® will swing into action and place a call to the number you designate to deliver your customized reminder message. Asterisk@Home is bundled with a wakeup call system which lets you schedule one wakeup call per extension for any time during the next 24 hours. It's a great product. However, after using a terrific, web-based email reminder system in the Linux and Mac worlds, we wanted something a bit more flexible and robust for Asterisk that would really show off the platform. The original version of this software got broken with Asterisk@Home 2.4 and later so today we're going to fix it. If you're still running an older version of Asterisk@Home, use our original tutorial and software.

[NOTE: This application has been updated. For the latest article, click here.]

The smarts for this system already have been incorporated into our new TeleYapper 2.5 Voice Messaging System. But that's a real-time system meaning it begins calling immediately after you choose a group of people to call. This system is different in that you can schedule the calls for the near or distant future, you can specify different numbers for the calls, and you can customize the recorded message for each call. In short, it's perfect for appointment reminders, birthday reminders, anniversary reminders, and anything else you want to remember. All it takes is a phone call to set up each reminder. There's no web page to fill in and no database required to manage the reminders. You can schedule as many reminders per phone number as your little fingers care to dial! And did we mention? It's still FREE! Some of your fellow readers chipped in to pay for the Allison IVR prompts so those are included at no cost as well.

Prerequisites. We've tested version 2.5 of Telephone Reminders with an ISO-installed version of Asterisk@Home 2.5 only. If you wish to use it with some other version of Asterisk@Home or with a "pure Asterisk" system, then you're on your own. It won't work with version 1.x of Asterisk@Home, but it'll probably be fine with subsequent releases. Let us know by posting a comment. And the software to schedule reminders is no longer dependent upon the wakeup call system which ships with Asterisk@Home. You should be able to install this project and get everything working in about 30 minutes.


How It Works. The reminder system is actually quite simple to use. You dial extension 1-2-3 on your Asterisk system, enter your password, and then you'll be prompted to record a reminder message. Next you enter the phone number, date, and time for delivery of the reminder message. When the appointed date and time arrives, Asterisk will place the call to the number you specified using your default dialing rules and will play the customized reminder when the call is answered. If the call is not answered, the call will be repeated n number of times with a delay between calls of x minutes before giving up on the call. You'll get an email with the call reminder setup if desired. You also get to configure the number of retries and the delay between calls.

Finally, a word about failed calls. Reminders are important to most folks, or you wouldn't be scheduling them. So failed calls are problematic. On the one hand, you don't want to overburden your phone system placing thousands of reminder calls just because the calls continue to fail. You may have entered an incorrect phone number, for example. So our middle-of-the-road solution to failed calls is this. You can tell the system how many times to repeat the call and how much time to eat up between attempts. If the call still fails, the reminder will be deleted from the system. But the reminder message is preserved. If you look in /var/lib/asterisk/sounds/custom on your system, you will see some custom sound files (such as the reminder prompts which all begin with reminder). In addition, you will see the actual reminder messages for each of your reminders. The naming convention is HourMinute.Date.PhoneNumber.gsm. If you see entries in this directory with dates before today's date, those are failed call reminders. You can play the sound files on most computers by simply double-clicking on the files. You can delete old reminders while logged in as root on your Asterisk system with a command like this:

rm -f /var/lib/asterisk/sounds/custom/*.20060123.*.gsm

Just be sure you don't delete today's reminder messages or messages with a future date, or your entire reminder system will be up in smoke!


Here are the components that make up the complete system:

  • AutoAttendant Contexts to Create Reminder
  • Code Snippet to Answer 1-2-3 Calls
  • Allison Voice Prompts for the Reminder IVR Interface
  • checkdate.php AGI script to Check for Dates in the Past
  • checktime.php AGI script to Check for Times in the Past
  • reminder.php AGI script to Schedule Calls
  • Reminder Call Processing Contexts
  • run_reminders script to Check for Reminders
  • Limitations. There are a few limitations you need to be aware of. First, you can't schedule delivery of a reminder within the first 5 minutes after midnight each night. That's when the reminder system does its housekeeping. Second, you must schedule reminders at least 5 minutes after you place your call to set up the reminder. This gives the system ample time to generate the configuration files it needs and to put them in the right places. Third, the current reminder system does not fully support simultaneous scheduling of multiple reminders. The current system uses unique names to identify sound files generated by multiple simultaneous callers. However, it still is theoretically possible for two different callers to schedule two reminders for the same phone number and the same reminder time and to do so at the exact same time. This would cause one of the reminders to be discarded. We just wanted to alert you to this remote possibility. But we hasten to add that the chance of this happening is pretty small even in a very large Asterisk system with hundreds of users. There's also no present ability to link to a database for scheduling reminders. Nor can you schedule recurring reminders for events such as birthdays and anniversaries. But we'll get to some of these features one day soon.

    License. This software is licensed for your use under a Creative Commons Attribution-ShareAlike 2.5 license. Before using this software, please read the terms of the license. A Plain English version of the license is available here. You may not charge a fee for something we are giving you for free. Finally, we ask that you preserve our copyright notice in any copies of the software you make. The same applies to derivative works. If you do not accept the terms of the license, do not use the software. Even if you accept the terms of the license, keep in mind that BY USING THIS SOFTWARE, YOU ASSUME ALL RISKS OF USE AND NO WARRANTIES EXPRESS OR IMPLIED ARE PROVIDED WITH THIS FREE SOFTWARE INCLUDING FITNESS FOR A PARTICULAR USE AND MERCHANTABILITY. In short, it's up to you to determine, at your own risk, whether this software meets your needs. Don't assume that it will, and don't assume that the code is error-free. It's probably not.


    The Game Plan. To get the Reminder System set up, we're first going to move all of the code into the proper places. This includes the modifications to the dialplan contexts, installation of the new Allison voice prompts, and installation of the PHP/AGI scripts. Then we'll walk you through configuring the system. And finally we'll schedule a reminder to make sure everything went according to plan.

    Modifying Your Dialplan. Step #1 is to cut-and-paste some code into your dialplan. Paste this 2.5 code update to the bottom of the extensions_custom.conf file in the /etc/asterisk directory on your system.

    For Step #2, cut-and-paste the following code snippet into the top section of extensions_custom.conf in the [from-internal-custom] context:

    exten => 123,1,Answer
    exten => 123,2,Wait(1)
    exten => 123,3,Authenticate(12345678)
    exten => 123,4,Goto(reminder,s,1)

    If, for some reason, you already are using extension 1-2-3 on your Asterisk system for some other purpose, then simply adjust the 123 extension in the four lines above to another number that works on your system. This is the number you will dial to schedule reminders. Line 3 is important as well. This is where you set a password for scheduling reminders on your system. Anyone that knows the password can schedule reminders. Simply replace 12345678 with a password that's secure enough for you to sleep well.

    Finally, a head's up. When you do the cut-and-paste, double-check the long lines of code such as h,1 in [reminder9] and be sure all of the text ends up on a single line. Otherwise, things won't work correctly. Once you've added the two sections of code above, save extensions_custom.conf and reload Asterisk.

    Installing Reminder Voice Prompts. As some of you know, we mounted a campaign to raise a little dough to pay for Allison, the Voice of Asterisk, to record custom voice prompts for the original version of the reminder system. To all that contributed, thank you! Whether you contributed to the cause or not, those voice prompts are free for the taking subject to the terms of the license agreement, and they all still work for version 2.5. Just log into your Asterisk server as root and enter the following commands:

    cd /var/lib/asterisk/sounds/custom
    wget http://nerdvittles.com/reminder_voice.zip
    unzip reminder_voice.zip
    rm reminder_voice.zip
    chmod 664 reminder*.gsm
    chown asterisk:asterisk reminder*.gsm


    Installing the Reminder PHP/AGI Scripts. Now we're getting to the new code for version 2.5. While you're still logged in as root, let's install the final pieces of code that you'll need to get things working. Just execute the commands below:

    cd /var/lib/asterisk/agi-bin
    wget http://nerdvittles.com/aah2/reminder25.zip
    unzip reminder25.zip
    rm reminder25.zip
    chmod 775 reminder.php
    chown asterisk:asterisk reminder.php
    chmod 775 check*.php
    chown asterisk:asterisk check*.php
    chmod 777 run_reminders
    chown asterisk:asterisk run_reminders

    Update: For those using Asterisk@Home 2.7 and those who have applied a yum update after early April 2006 which loaded a new Linux kernel, a problem has been reported by a couple of folks indicating that the reminders fail because the time stamps don't get properly preserved when a reminder is moved to Asterisk's outgoing directory. We haven't seen the problem on our test system but, if you experience the problem with reminders not reminding when they're supposed to, use the following code instead of the above. Our special thanks to Wolf Paul for the fixes including an all-new run_reminders Perl script.

    cd /var/lib/asterisk/agi-bin
    wget http://nerdvittles.com/aah2/reminder27.zip
    unzip reminder27.zip
    rm reminder27.zip
    chmod 775 reminder.php
    chown asterisk:asterisk reminder.php
    chmod 775 check*.php
    chown asterisk:asterisk check*.php
    chmod 777 run_reminders
    chown asterisk:asterisk run_reminders

    Creating Reminders Directory. While you're still logged in as root, create the directory to store your reminders until the day arrives to execute them. Just issue the following commands:

    su asterisk
    cd /var/spool/asterisk
    mkdir reminders
    exit

    Setting Up the Reminder Crontab Entry. Now we need to set up the cron job to actually move reminders into the Asterisk call processing directory on the day they are scheduled to run. While logged in as root, edit the crontab file: nano -w /etc/crontab. Be sure you typed the exit command in the last step, or you'll be logged in as asterisk instead of root. And you won't be able to edit the file! Now cut-and-paste the following command to the very bottom of the crontab file. It should go on its own line. There is no longer an entry for wakeup calls (if you read the original tutorial).

    0 0 * * * root /var/lib/asterisk/agi-bin/run_reminders >/dev/null 2>&1

    Once you've added the line, save your changes: Ctrl-X, Y, then press Enter. Whew! That's it for the Reminder code. Now let's configure the system, and you'll be all set.


    Configuring the Reminder System. To configure the reminder system, you'll need to edit the reminder.php script while logged in as root: nano -w /var/lib/asterisk/agi-bin/reminder.php. You'll notice a section of variables at the top of the file that looks like this:

    $extensionmaxdigits=4 ;
    $debug = 1;
    $newlogeachdebug = 1;
    $emaildebuglog = 0;
    $email = "yourname@yourdomain" ;
    $trunk = "local" ;
    $callerid = "6781234567" ;
    $numcallattempts=6 ;
    $calldelaybetweenruns=300 ;
    $timetoring=40 ;
    $acctcode= "Reminder" ;

    This is the only section of code you ought to mess with. When we update the code in coming months to add features, we'll assume everything else has been left intact. Be very careful when editing this file. Don't remove any semicolons or quotation marks, or nothing will work! Here's a quick run-down on what each of the above variables does:

  • $extensionmaxdigits=4 ... Sets the maximum number of digits for treating outbound calls as calls to local extensions.
  • $debug = 1 ... If set to 1, then a debug log is created in /var/log/asterisk/reminder.txt. Instructions for deleting reminders are in the log.
  • $newlogeachdebug = 1 ... If set to 1, then a new debug log is created each time a reminder is scheduled. Otherwise, file grows and grows.
  • $emaildebuglog = 0 ... If set to 1, the debug log is emailed to the email address set below when each reminder is scheduled.
  • $email = "yourname@yourdomain" ... Enter your actual email address between the quotation marks. Only works if line above is set to 1.
  • $trunk = "local" ... If set to "local", calls are routed using your default dialplan rules. Otherwise, specify a trunk to use, e.g. "sip/telasip-gw".
  • $callerid = "6781234567" ... Specify your caller ID number. Only used if $trunk is not set to "local" above.
  • $numcallattempts=6 ... If there is no answer on the Reminder call, how many times should Asterisk attempt to deliver the reminder?
  • $calldelaybetweenruns=300 ... How many seconds delay should there be between failed call attempts to deliver a reminder?
  • $timetoring=40 ... How many seconds should the call ring when attempting to deliver a reminder?
  • $acctcode= "Reminder" ... What accouting code should be used for reminder calls?
  • Once you've configured the Reminder System to meet your needs, save your changes: Ctrl-X, Y, then press Enter. HINT: You may want to start with the defaults which will work well for most folks.


    Scheduling A Reminder. We're ready to take the Reminder System for a trial run at this juncture. Make sure you've reloaded your Asterisk system, and then dial 123 from an extension on your system. Enter the password you set up for your system and then press the pound key.

    Entering a Reminder Message. You'll first be prompted to record a reminder message. This is the message that will be played when someone answers the reminder call. If you're not scheduling this reminder for yourself, then the message ought to explain who's calling and what the purpose of the call is. Once you've recorded your message, press the pound key to end the recording. You can replay or rerecord the reminder if desired while you're in this step of the reminder creation process.

    Entering the Callback Number. When prompted for the reminder callback number, there are a couple of things to keep in mind. First, if you've specified "local" as the trunk to use for reminders in the reminder.php script, then the phone numbers can be entered in any format supported by your dialplan. Press the pound key after entering the appropriate number. The calls will be placed using the trunks specified in your dialplan rules. The one exception is extensions on your local Asterisk system since these can't be routed by Asterisk@Home using your outbound calls dialplan rules. The way we handle extensions is by examining the length of the phone number. At the top of reminder.php, you can specify the maximum number of digits for local extensions by setting $extensionmaxdigits. So long as the callback number is less than or equal to this number of digits, the system has the smarts to correctly route the call to a local extension.

    If you have designated a particular trunk for placement of reminder calls, then you'll need to make certain that the format of the phone numbers entered for reminders on your system matches a dial string supported for this outbound trunk in your dialplan. For example, if this trunk requires that calls be entered with a 1 and then an area code and 7-digit number, then that is the only format that should be used for entering callback numbers in your reminder system. Again, the one exception is calls to local extensions. So long as the number of a local extension is entered with less than or equal the number of digits set for the $extensionmaxdigits variable in reminder.php, the call will be routed properly to the local extension regardless of the trunk setting.

    Finally, here's a shortcut that can be used if the phone you're using to schedule the reminder is the same one on which you want to get the reminder callback. In this case, just press the pound key when prompted for the number to which to deliver the reminder message. This will set the callback number as the caller ID of the phone you used to schedule the call. If it's a local extension, then the caller ID will be set to the local extension number of the phone from which you placed the reminder scheduling call. Just be sure your $extensionmaxdigits is set correctly or calls to local extensions will fail.

    Entering the Date of the Reminder. Once you accept the reminder message, you'll be prompted to enter the date on which this reminder will be delivered. Dates are entered using a four-digit year, then a two-digit month, and then a two-digit day using the time zone of the Asterisk system running the Telephone Reminders System. There is some error correction but not much. You obviously can't schedule reminders in the past! And you don't need to press the pound key after entering the eight digits. An enhancement in version 2.5 is that you now can press the pound key (#) instead of entering an 8-digit date, and the system will set the reminder date to today. Once you've entered a date, the system will tell you what date you entered including the day of the week. If the entry is correct, just press 1 to move on.

    Entering the Time of the Reminder. Now you'll be prompted to enter the delivery time for your reminder. Times are entered as a two-digit hour and two-digit minute using the time zone of the Asterisk system running the Telephone Reminders System. For times less than 1200, you will be prompted whether you meant AM or PM. For those that understand military time, you can avoid this step by entering times using the format: 1345 which means 1:45 p.m. You don't need to press the pound key after entering the four-digit time for delivery of your reminder. Keep in mind that you cannot schedule a reminder for delivery in the first five minutes after midnight. Other times "in the midnight hour" should be entered in the format: 0045 which means 12:45 a.m. Keep in mind that reminder times always must be at least 5 minutes in the future. Finally, you cannot schedule two reminders for the exact same date and time for delivery to the same phone number. Once you enter a delivery time, the system will play back both the date and time for the reminder as a precaution. Press 1 to accept your entries and store the reminder to disk.


    Where Reminders Are Stored. There are actually two files that make up each reminder: the .call file which places the actual call and the .gsm file which is the reminder message itself. The file naming convention is HourMinute.Date.PhoneNumber with either a .call or .gsm extension. The sound files are all stored in /var/lib/asterisk/sounds/custom. Prior to the delivery date of the reminder message, the .call file is stored in /var/spool/asterisk/reminders. Then, at midnight on the date the reminder is scheduled for delivery, the run_reminders script in /var/lib/asterisk/agi-bin moves the affected .call files to /var/spool/asterisk/outgoing. The .call files in the outgoing directory are reviewed every minute of the day by Asterisk. By examining the time stamp of the file, Asterisk looks for a match with the current hour and minute of the day. Once the time for the call arrives, Asterisk processes the .call script and places the call. All dialing retries are handled internally by Asterisk with no user or program control so it's important to set your default values correctly in the reminder.php script as explained above. Once the .call file is processed, Asterisk discards the file whether the call was successful or not. As noted above, the reminder message file is only discarded if the call is completed successfully. So, from time to time, you do need to review the contents of /var/lib/asterisk/sounds/custom and discard reminder messages, if any, with dates in the past. Note also that, if you begin scheduling a reminder and change your mind and hang up after recording a reminder message, that message will still exist in /var/lib/asterisk/sounds/custom.

    Finally, a word of caution about the reminder message files: be very careful in deleting these files. The message files and .call files are linked by filename only, and there is no error detection or correction if the message file gets discarded before the time for the reminder call arrives. What would happen in such a situation is the call would be placed, someone would answer, Allison would say "please hold for an important reminder," and then there would be a brief silence followed by Allison saying "to repeat this reminder, press 1; otherwise, press 2" which is not entirely helpful.

    Reminder and Wakeup Call Processing. It has been documented that flooding Asterisk with a bunch of .call scripts simultaneously can cause some of the scripts to be discarded without being executed. We hope this has been resolved in Asterisk 1.2.4, but just be alert to the possibility of a problem if multiple calls are scheduled at exactly the same time to different numbers.

    When you're first getting started with the reminder system, it's probably a good idea to fire up Asterisk's Command Line Interface (CLI): asterisk -r. Then you can watch as the reminders are scheduled and reminder calls are placed. Just schedule a reminder for five minutes from the time you begin the reminder call, and you'll be all set to give it a whirl.

    For Programmers Only. If you're just getting into PHP and AGI programming with Asterisk, then have a second look at reminder.php. In particular, take a look at the section of code that begins with parse agi headers into array. As best we can tell, our initial tutorial on Telephone Reminders was the first version of this subroutine written in PHP that actually worked. We've tried to repeat our success here. If you review the log file (reminder.txt), you will see a listing of all the AGI headers which are passed by Asterisk to PHP. But this is the first code we've seen that correctly reads the headers into variables where you can actually retrieve the content. We call it a feature. For example, the commented out line ($tmp = $agi['dnid']) shows the syntax to retrieve the DNID value from Asterisk. Just make a mental note that the parse AGI headers code in reminder.php actually works. Some of our previous code inherited the mistakes of others, but we've now taken the time to get this functioning properly because we needed it for something else. Here's the complete list of AGI headers that can be saved to variables in your PHP code should the need ever arise:

    read: agi_request: reminder.php
    read: agi_channel: SIP/204-6a1a
    read: agi_language: en
    read: agi_type: SIP
    read: agi_uniqueid: 1138010325.1367
    read: agi_callerid: "Line2" <204>
    read: agi_dnid: 123
    read: agi_rdnis: unknown
    read: agi_context: reminder9
    read: agi_extension: h
    read: agi_priority: 2
    read: agi_enhanced: 0.0
    read: agi_accountcode:

    You'll also want to take note of a little quirk in Asterisk (compared to some PBXs). To decipher the extension which actually placed a call, you must parse the agi_channel variable for the data between the slash and hyphen characters since the DNID (dialed number identifier) returns the extension being called (as opposed to the originating extension) when an internal call is placed. Here's one PHP approach to get the answer which in this case happens to be extension 204. Regex wizards could probably save a line of code, but who cares.

    $CallingID = substr(stristr($agi['channel'],"/"),1);
    $CallingID = substr($CallingID,0,strrpos($CallingID,"-"));

    Finally, it appears that Asterisk's outgoing call queue now relies exclusively on the timestamp of files in the directory to determine when to execute each call. In short, Asterisk no longer uses the name of a file to determine when to execute it. Great idea! That, in turn, means that our reliance on a separate folder for reminders on future dates may no longer be necessary. We haven't finished testing this and wanted to get a working application back in circulation for those that were already using version 1 when AAH 2.5 was released. As soon as we can document that this new functionality is 100% reliable, we will revise the code a bit and eliminate the necessity of using a separate cron job and directory to move files around each day. That also will eliminate the slight delay at midnight which is referenced in the existing tutorial.

    Web Interface to Telephone Reminders. We've built a very simple web page that will let you review which reminders are pending on your system. Once installed with the newly enhanced Asterisk@Home Menu System (see below), it can be accessed by going to the IP address of your Asterisk system with a web browser and then choosing the Telephone Reminders button. Or you can access it directly at http://192.168.0.111/reminders/ using the IP address of your Asterisk system. To install the Telephone Reminders web interface, log into your Asterisk system as root and then issue the following commands:

    cd /var/www/html
    mkdir reminders
    cd reminders
    wget http://nerdvittles.com/aah2/webreminder.zip
    unzip webreminder.zip
    rm webreminder.zip

    Be advised that we are just getting started with a web interface to the Telephone Reminders application. Stay tuned for loads of additional features!

    AAH Web Facelift. Last, but not least, the folks at KennonSoft have posted an update to the AAH web interface (see inset). If you like it, here's how to install it. While still logged into your server as root, issue the following commands:

    cd /var/www/html
    wget http://www.kennonsoft.com/community/admin-ui.tar
    wget http://nerdvittles.com/wp-images/asteridex.png
    wget http://nerdvittles.com/wp-images/asterimind.png
    tar -xvf admin-ui.tar
    rm -f admin-ui.tar
    wget http://nerdvittles.com/aah2/index.zip
    unzip index.zip
    rm -f index.zip

    NOTE: It's been reported that there is a display formatting bug with IE 6. Lines 2, 3, 4, and 7 of the code above should all begin with wget. Also be advised that the last three lines of code above get you the third column of icons to support our AsteriDex and Telephone Reminder applications. If you don't want to use these applications, just don't execute the last 3 lines of code above.

    If you'd like to use our AsteriDex RoboDialer, install it from the link in this sentence and the icon will get you there. If you've moved your AsteriDex application to a directory different than asteridex, make the necessary adjustment in the index.html file.

    Security Reminder. If you plan to open the Asterisk web interface on your system to the public Internet, make sure to take security precautions to reduce the risk of a stranger trashing your system or running up your phone bill. Just click here and search for our articles on security to get your system up to speed.

    Wish List? Well, that about covers version 2.5 of our shiny new Reminder System for Asterisk. We have some other bells and whistles we'll be adding over the next few days and weeks so check the bottom of this article from time to time for a New Enhancements section. For example, we plan to add a feature that will let you schedule dates by simply entering the number of days from today and pressing pound. And we want to do something similar for times so that you can enter something like 90# to schedule a reminder for a time slot 90 minutes from now. If you have other enhancement suggestions and recommendations for version 3, we'd love to hear from you. Just post a comment to this topic, and we'll have a look. In the meantime, enjoy!

    Want More Projects? For a complete catalog of all our previous Asterisk projects, click here. For the most recent articles, click here and just scroll down the page. Get your Headline News the easy way: Planet Asterisk, Planet Gadget, Planet Mac, and Planet Daily. Quick read, no fluff.

    Got a PDA or Web-Enabled Smartphone? Check out our new PDAweather.org site and get the latest weather updates and forecasts from the National Weather Service perfectly formatted for quick download and display on your favorite web-enabled PDA, cellphone, or Internet Tablet. And, of course, it's FREE!

    Hot Tip! O'Reilly's must-have book, Asterisk: The Future of Telephony, is still available for free download here under a Creative Commons license. This is a cleaned up version of the original PDF which fixes pagination and compresses the file size to 3.9MB using Acrobat's Reduce File Size tool. Requires at least Acrobat 4 to load. Special thanks to Alexander Burke for all the hard work cleaning this up.

    New Enhancements. Assuming you have email messaging working on your Asterisk system, Telephone Reminders now has the ability to deliver an email copy of reminders to the recipient in addition to a phone call. Be advised that, if the phone call is never completed, the email copy of the reminder will not be delivered. The reason for this is because Asterisk never passes the call to the context which handles delivery of the email message until the call is connected. So ... no connection, no email. However, if the recipient has an answering machine or voice mail, that would trigger delivery of the email message. If you can live with this shortcoming at least for the time being, here's how to activate delivery of email reminders. First, if you downloaded the Telephone Reminders contexts for extensions_custom.conf before 5 p.m. on Thursday, February 23, do it again from here. Then cut-and-replace only the last two contexts with the matching contexts at the bottom of your extensions_custom.conf file: [remindem] and [remindem2]. Save your changes and reload Asterisk.

    Once you've installed the new contexts to support email messaging, step two is registering email addresses for extensions and phone numbers to which you want email reminders delivered. Log in to your Asterisk server as root, and start up the Command Line Interface (CLI): asterisk -r. For each extension and phone number for which you want to activate email reminders, enter a command at the CLI prompt that looks like this: database put EMAIL 6781234567 joe@schmo.com where 6781234567 is the phone number of the reminder recipient and joe@schmo.com is the recipient's email address. You can display all existing EMAIL addresses that have been entered into your Asterisk database with this command: database show EMAIL. If you need to modify an existing entry, simply delete it and reenter it. To delete an existing entry, use the following syntax: database del EMAIL 6781234567.