1. Cyford Technologies

    Server-Room2

  2. Managed Services

    • Managed Services

      Cyford Technologies LLC is a leader among IT Service Companies, we specialize in a mired of managed services and Technical support. Our focus is on small to medium sized business in Metro Atlanta and surrounding cities. We have one of the quickest response times in the industry; we also provide exceptional services because we utilize the latest tools and technologies. Best Practices is the name of our game at Cyford Technologies, our dedicated engineers never take short cuts which better serves our customers by reducing network issues or downtimes. Qualified engineers manage and supply technical support for each of our customs networks nationwide. If your company or department is seeking award winning IT support or related services then give Cyford Technologies LLC a call today!
       

  3. Website Design's

  4. Login

Articles

(3 - user rating)

User Rating: 1 / 5

Star ActiveStar InactiveStar InactiveStar InactiveStar Inactive
 

Asterisk IVR Based Text Messaging

 texting phone woman 27a53

Hi  a little about why i took the route into offering a voice activated text messaging system with asterisk is simply becuase i build telephone system's and calling cards that cater to prisons and mental institutions. These Secure locations do not allow cell phones and internet.  So i build ivr texting so authorized customers can send and recieve text messages.  My unlimited monthly customers will have a option for shared texting..  where they all share the same number and can send messages to there loved ones,  as well as recieve.

In my setup i use asterisk 11 A2billing 2.x  and freepbx on one server,  but i will try to recreate my instructions as basic as possible..  

 

 

Install google tts and speach to text:

 

cd /usr/src
wget https://codeload.github.com/zaf/asterisk-speech-recog/legacy.tar.gz/master ; tar -zxvf master ; cd zaf* ; cp
speech-recog.agi /var/lib/asterisk/agi-bin/speech-recog.agi ; chown asterisk:asterisk /var/lib/asterisk/agi-bin/speech-
recog.agi
wget http://sourceforge.net/projects/mpg123/files/mpg123/1.14.2/mpg123-1.14.2.tar.bz2/download  \; tar -xjvf download \; cd mpg123* \; ./configure \; make \; make install \;  rm -rf  mpg123* \; ln -s /usr/local/bin/mpg123 /usr/bin/mpg123 \; wget https://github.com/downloads/zaf/asterisk-googletts/asterisk-googletts-0.6.tar.gz / \; tar xvfz asterisk-googletts-0.6.tar.gz \; cd asterisk-googletts* \; cp googletts.agi  /var/lib/asterisk/agi-bin/googletts.agi \; wget https://github.com/zaf/asterisk-speech-recog/tarball/master \; tar xvfz master \; cd zaf* \; cp -R * /var/lib/asterisk/agi-bin/ \;  chown -R asterisk:asterisk  /var/lib/asterisk/agi-bin/ \; cpan JSON -y

You would still need to do the following:

  1. load asterisk module format_sln
  2. get google api for speech to text and inter it in /var/lib/asterisk/agi-bin/speech-recog.agi
  3. I had created a folder  /etc/asterisk/MSG/ -  where everything for texting is going

In the MSG folder  i have an VIP file which is used for Authentication.  The file is formated as below:

13564671535353536|Allen Ford|15593549899|
245646788|Alvin Quarles|15593549899|
217743567|William Officer|15593549899|

 

Now it is dialplan time:

; first need handle recieveing incomming text.  (they come in the form as sip messages on my example)
; sip setting also need to have
 
 
[from-incomming-text]
exten => _+X.,1,Goto(${EXTEN:1},100)
exten => _X.,1,Goto(${EXTEN},100)
exten => _X.,100(sms),Verbose(2,Incoming SMS from ${MESSAGE(from):5:11}. Message is "${MESSAGE(body)}".) ; Get Data
exten => _X.,n,MessageSend(sip:${EXTEN},"${CALLERID(name)}"${MESSAGE(from)})   ;  if you wanted to send to a phone ,  i suppose this would be helpfull
exten => _X.,n,System(echo "${MESSAGE(body)}" >> /etc/asterisk/MSG/'${EXTEN}')   ;  in my shared text hosting i save all text to a file nambed by the number it came in on.
 
 
[Main Calling Card  IVR] 
include => General-text-message
exten => _X.,1,SIPDtmfMode(RFC2833) ; forcing dtmf
exten => _X.,n,agi(googletts.agi," Press 1 To Authenticate,  Press 2 For Text Messages,  ",en,any) ; made it simple
exten => _X.,n,WaitExten()
exten => i,1,agi(googletts.agi,"Invalid extension.",en)
exten => i,n,goto(18775743418,1)
exten => t,1,agi(googletts.agi,"Request timed out.",en)
exten => t,n,goto(18775743418,1)
 ; Option 1
exten => 1,1,Wait(2)
exten => 1,n,agi(googletts.agi," Please enter your 10 digit Pin number followed by the Pound button. ",en,)
exten => 1,n,Read(AccessCode,"silence/1",10,)
exten => 1,n,agi(googletts.agi," You entered ${AccessCode} .",en,)
exten => 1,n,GotoIf($[${ISNULL(${SHELL(cat /etc/asterisk/MSG/VIP | grep  "${AccessCode}")})}]?:authenticated)
exten => 1,n,agi(googletts.agi,"Your Authentication has Failed Please try again.",en,)
exten => 1,n,goto(1,1)
exten => 1,n(authenticated),agi(googletts.agi,"Authentication was successful and we will save it for the duration of this call",en,)
exten => 1,n,goto(a2billing-callingcard-options2,18775743418,1)

; Option 2
exten => 2,1,Wait(2)
exten => 2,n,GotoIf($["${AccessCode}" = ""]?Alarm:start)
exten => 2,n(start),agi(googletts.agi," Texting is under Construction and testing - but only available for unlimited customers and customers with paid option ",en,any)
exten => 2,n,goto(General-text-message,18775743418,1)
exten => 2,n(Alarm),agi(googletts.agi," You must be authenticated to come here",en,any)
exten => 2,n,goto(a2billing-callingcard-options2,18775743418,1)
 
[General-text-message]
exten => _X.,1,SIPDtmfMode(RFC2833)

exten => _X.,n,Set(msg="Press Star to send a Text Message.  Press 1 to hear the newest message and 2 though 9 to hear the older messages.  ",en,any)
exten => _X.,n(startmsg),agi(googletts.agi,"${msg} , End of message .. ",en,any)
exten => _X.,n,agi(googletts.agi,"Press your Option Now",en,any)
exten => _X.,n,WaitExten()
exten => i,1,agi(googletts.agi,"Invalid Option.",en)
exten => i,n,goto(18775743418,1)
exten => t,1,agi(googletts.agi,"Request timed out.",en)
exten => t,n,goto(18775743418,1)
exten => 1,1,Wait(2)  
exten => 1,n,Set(text='${SHELL(tail -1 /etc/asterisk/MSG/15593549868 | head -1)}')
exten => 1,n,Set(msg=${text})
exten => 1,n,goto(18775743418,startmsg)
exten => 2,1,Wait(2)
exten => 2,n,Set(text='${SHELL(tail -2 /etc/asterisk/MSG/15593549868 | head -1)}')
exten => 2,n,Set(msg=${text})
exten => 2,n,goto(18775743418,startmsg)
exten => 3,1,Wait(2)
exten => 3,n,Set(text='${SHELL(tail -3 /etc/asterisk/MSG/15593549868 | head -1)}')
exten => 3,n,Set(msg=${text})
exten => 3,n,goto(18775743418,startmsg)
exten => 4,1,Wait(2)
exten => 4,n,Set(text='${SHELL(tail -4 /etc/asterisk/MSG/15593549868 | head -1)}')
exten => 4,n,Set(msg=${text})
exten => 4,n,goto(18775743418,startmsg)
exten => 5,1,Wait(2)
exten => 5,n,Set(text='${SHELL(tail -5 /etc/asterisk/MSG/15593549868 | head -1)}')
exten => 5,n,Set(msg=${text})
exten => 5,n,goto(18775743418,startmsg)
exten => 6,1,Wait(2)
exten => 6,n,Set(text='${SHELL(tail -6 /etc/asterisk/MSG/15593549868 | head -1)}')
exten => 6,n,Set(msg=${text})
exten => 6,n,goto(18775743418,startmsg)
exten => 7,1,Wait(2)
exten => 7,n,Set(text='${SHELL(tail -7 /etc/asterisk/MSG/15593549868 | head -1)}')
exten => 7,n,Set(msg=${text})
exten => 7,n,goto(18775743418,startmsg)
exten => 8,1,Wait(2)
exten => 8,n,Set(text='${SHELL(tail -8 /etc/asterisk/MSG/15593549868 | head -1)}')
exten => 8,n,Set(msg=${text})
exten => 8,n,goto(18775743418,startmsg)
exten => 9,1,Wait(2)
exten => 9,n,Set(text='${SHELL(tail -9 /etc/asterisk/MSG/15593549868 | head -1)}')
exten => 9,n,Set(msg=${text})
exten => 9,n,goto(18775743418,startmsg)
exten => *,1,Wait(2)
exten => *,n,Set(msg='Sending Text Messages is currentlly being worked on..  try again later')
exten => *,n,goto(Sending-text-message,18775743418,1)
 
 
 
 ;  This is the main ivr for sending messages
[Sending-text-message]
exten => _X.,1,SIPDtmfMode(RFC2833)
exten => _X.,n,agi(googletts.agi,"Please press 1 to enter the number you would like to send the text too.  Press 2  to record the message.  Press 3 to send the message",en,any)
exten => _X.,n,WaitExten()
exten => i,1,agi(googletts.agi,"Invalid Option.",en)
exten => i,n,goto(18775743418,1)
exten => t,1,agi(googletts.agi,"Request timed out.",en)
exten => t,n,goto(18775743418,1)
exten => 1,1,Wait(2)
exten => 1,n,goto(Sending-text-Get-number,18775743418,1)
exten => 2,1,Wait(2)
exten => 2,n,goto(Sending-text-Get-message,18775743418,1)

[Sending-text-Get-number]
exten => _X.,1,Wait(2) 
exten => _X.,n,agi(googletts.agi,"Dial the 10 digit number now",en,any)
exten => _X.,n,Read(target-sms-number,"silence/1",10,)
exten => _X.,n,agi(googletts.agi,"You entered ${target-sms-number}.",en,)
exten => _X.,n,agi(googletts.agi,"Press 2 to continue or 1 to re-enter",en,any)
exten => _X.,n,WaitExten()
exten => i,1,agi(googletts.agi,"Invalid Option.",en)
exten => i,n,goto(18775743418,1)
exten => t,1,agi(googletts.agi,"Request timed out.",en)
exten => t,n,goto(18775743418,1)
exten => 1,1,Wait(2)
exten => 1,n,goto(18775743418,1)
exten => 2,1,Wait(2)
exten => 2,n,goto(Sending-text-Get-message,18775743418,1)

[Sending-text-Get-message]
 
exten => _X.,1,agi(googletts.agi,"Please say the text you would like me to send",en,any)
exten => _X.,n(record),agi(speech-recog.agi,en-US)
exten => _X.,n,Verbose(1,Script returned: ${confidence} , ${utterance})
;Check the probability of a successful recognition:
exten => _X.,n(success),GotoIf($["${confidence}" > "0.8"]?playback:retry)
;Retry in case speech recognition wasn't successful:
exten => _X.,n(retry),agi(googletts.agi,"Can you please repeat more clearly?",en)
exten => _X.,n,goto(record)
exten => _X.,n(fail),agi(googletts.agi,"Failed to get speech data.",en)
exten => _X.,n(end),Hangup()

;Playback the text:
exten => _X.,n(playback),agi(googletts.agi,"The text you just said was...",en)
exten => _X.,n,agi(googletts.agi,"${utterance}",en)
exten => _X.,n,agi(googletts.agi,"Press 1 to send and 2 to re-record",en,any)
exten => _X.,n,WaitExten()
exten => i,1,agi(googletts.agi,"Invalid Option.",en)
exten => i,n,goto(18775743418,1)
exten => t,1,agi(googletts.agi,"Request timed out.",en)
exten => t,n,goto(18775743418,startmsg)

exten => 1,1,Wait(2)
exten => 1,n,goto(Sending-text-Get-sending,18775743418,1)

exten => 2,1,Wait(2)
exten => 2,n,goto(Sending-text-Get-message,18775743418,1)

[Sending-text-Get-sending]

exten => _X.,1,Wait(2)
exten => _X.,n,Set(name=${SHELL(cat /etc/asterisk/MSG/VIP | grep -R '${AccessCode}' | cut -d "|" -f2 | tr -d '\n')})
exten => _X.,n,Set(myBandwidthANI=${SHELL(cat /etc/asterisk/MSG/VIP | grep -R '${AccessCode}' | cut -d "|" -f3 | tr -d '\n')})
exten => _X.,n,Set(MESSAGE(from)=15593549869)
exten => _X.,n,NoOp(Message from: ${MESSAGE(from)})
exten => _X.,n,Set(MESSAGE(to)=${target-sms-number})
exten => _X.,n,NoOp(Message to: ${MESSAGE(to)})
exten => _X.,n,Set(MESSAGE(body)="from ${name} @ BMP ${utterance}")
exten => _X.,n,NoOp(Message body: ${MESSAGE(body)})
exten => _X.,n,agi(googletts.agi,"Your Text Message will read as follows",en)
exten => _X.,n,agi(googletts.agi,"from ${name} @ BMP . ${utterance}",en)
exten => _X.,n,agi(googletts.agi,"and be sent too",en)
exten => _X.,n,agi(googletts.agi,"${target-sms-number}",en)
exten => _X.,n,agi(googletts.agi,"press 1 to send now. press 2 to go to the main menu.",en,any)
exten => _X..,n,WaitExten()
exten => i,1,agi(googletts.agi,"Invalid Option.",en)
exten => i,n,goto(18775743418,1)
exten => t,1,agi(googletts.agi,"Request timed out.",en)
exten => t,n,goto(18775743418,1)
exten => 1,1,Wait(2) 
exten => 1,n,MessageSend(sip:1${target-sms-number}@64.136.174.30:5060,<sip:${myBandwidthANI}@166.78.4.183>;)
exten => 1,n,agi(googletts.agi,"Message send status: ${MESSAGE_SEND_STATUS}",en)
exten => 1,n,System(echo "From: ${AccessCode} - ${myBandwidthANI} ${name} , TO: ${target-sms-number} MESSAGE:  ${MESSAGE(body)}" >> /etc/asterisk/MSG/sent-messages)
exten => 1,n,Wait(5)
exten => 1,n,goto(General-text-message,18775743418,1)
 

Tech Blog on Steroids

Key-Technical

Got Something to Say - Bring it to the Blog... 

Sign in And Create You own Nitch !!

Buy From US

Login or Register

Article Menu