This simple speech-enabled call router by LumenVox helps to complete the basic speech demonstration that comes with the Asterisk Speech API. Using an included "directory" grammar, the application prompts a user to speak a name and then routes the caller to that person's extension, as specified in the grammar file.
The application also includes the basic confirmation and error handling that is important for every good speech application. It includes several prompts that must be put into your Asterisk sounds directory, and two grammars that should go into the /etc/asterisk/grammars/ directory (you will need to create that directory if it does not already exist).
This application was originally developed for a talk at Astricon 2007. The zip file which can be downloaded by clicking Download Code below includes a PDF of the slides for that tutorial.
; The confirmation macro will be used when the application receives input
; that has a middling confidence score. It will ask the user to confirm
; what he or she said. To do this, there are three prompts:
; confirm990.gsm, confirm991.gsm, and confirm992.gsm. The macro knows
; which to play based on the CONFIRMPROMPT variable, which is a string
; with the filname in it, made by combining the word "confirm" with
; the recognized extension.
[macro-confirm]
exten => s,1,SpeechLoadGrammar(yesno|/etc/asterisk/grammars/yesno.gram)
exten => s,n,SpeechActivateGrammar(yesno)
exten => s,n,Set(CONFIRMPROMPT=$[confirm${ARG1}])
exten => s,n(PlayConfirm),SpeechBackground(didyouwant&${CONFIRMPROMPT}|5)
exten => s,n,GotoIf($[ ${SPEECH(results)} > 0]?Deactivate)
exten => s,n,Playback(NI)
exten => s,n,Goto(PlayConfirm)
exten => s,n(Deactivate),SpeechDeactivateGrammar(yesno)
; Answer the phone, create a speech port, load our directory grammar, call
; SpeechBackground to perform speech recognition while playing the sayname
; prompt. Then deactivate the grammar.
[speech-callrouter]
exten => s,1,Answer()
exten => s,n,SpeechCreate()
exten => s,n,SpeechLoadGrammar(directory|/etc/asterisk/grammars/directory.gram)
exten => s,n(Sayname),SpeechActivateGrammar(directory)
exten => s,n,SpeechBackground(sayname|10)
exten => s,n,SpeechDeactivateGrammar(directory)
; Check SPEECH(results) to ensure there was at least one result (i.e. we
; actually received spoken input). If not, we play the no input prompt and
; ask the caller to say something.
exten => s,n,GotoIf($[ ${SPEECH(results)} > 0]?InputOK)
exten => s,n,Playback(NI)
exten => s,n,Goto(Sayname)
; Now that we know there was input, we save the recognized extension to the
; variable DIALTHIS (important to do in case we overwrite SPEECH_TEXT with a
; confirmation) and print some log messages to the console. Then we run
; a few checks on the confidence score. If it was really low (below 400), we
; will reject the utterance and have the user repeat what was said.
; If it was between 400 and 700, we launch the confirmation macro, passing in
; the recognized result as the only argument. If the user confirms by saying
; yes, or if the confidence score was above 700, we send the user to the
; specified extension.
exten => s,n(InputOK),Set(DIALTHIS=${SPEECH_TEXT(0)})
exten => s,n,Verbose(1,The recognized extension was ${SPEECH_TEXT(0)})
exten => s,n,Verbose(1,The score was ${SPEECH_SCORE(0)})
exten => s,n,GotoIf($[ ${SPEECH_SCORE(0)} < 400]?BadInput)
exten => s,n,GotoIf($[ ${SPEECH_SCORE(0)} > 700]?Dial)
exten => s,n,Macro(confirm,${SPEECH_TEXT(0)})
exten => s,n,GotoIf($[ "${SPEECH_TEXT(0)}" = "yes"]?Dial:Sayname)
exten => s,n(BadInput),Playback(didnotunderstand)
exten => s,n,Goto(Sayname)
exten => s,n(Dial),SpeechDestroy()
exten => s,n,Goto(${DIALTHIS},1)
exten => 990,1,Verbose(1,You called Tom Smith)
exten => 990,n,Playback(tomsmithgreeting)
exten => 990,n,Hangup()
exten => 991,1,Verbose(1,You called Joe Jones)
exten => 991,n,Playback(joejonesgreeting)
exten => 991,n,Hangup
exten => 992,1,Verbose(1,You called Bob Johnson)
exten => 991,n,Playback(bobjohnsongreeting)
exten => 992,n,Hangup
This is a quarterly contest to find sample application code, grammars, prompts and tools to post in this Asterisk Speech Application Zone. The panel of judges look for uniqueness and usability, and if your submission is chosen, you win free speech recognition software. Not only that, but you will be helping your fellow Asterisk community members speed up their application development process -- and you might find some useful code for yourself!
5 LumenVox Speech Engine Lite licenses.
(a value of $1225)
The deadline to submit your entry is Oct. 15th. The winner will be contacted via email by Oct. 30th. Please send a brief description of your application, along with the sample code, grammars, prompts or tools to News@LumenVox.com. All submissions will be considered public domain, and could potentially be posted on the internet. Please only send original code, commented code preferred. LumenVox can not endorse or be held responsible for the performance of any submission.
Good Luck, and may the best application code win!