Asterisk IVR แรกของผมครับ

Asterisk Opensource IP Pbx

Asterisk IVR แรกของผมครับ

โพสต์โดย voip4share » 14 มี.ค. 2010 15:44

พอดีมีคนรู้จักกันเขาให้ผมทำ IVR ให้ เขาจะรับสายเข้ามาทางเบอร์ DID ทาง SIP TRUNK ตอนแรกก็มึนๆอยู่เพราะยังไม่เคยเขียนจริงๆจังๆสักที :D โจทย์คือ
- โทรเข้ามาแล้วมีเสียงตอบรับ กด 1 ติดต่อบัญชี กด 2 ติดต่อฝ่ายขาย กด 3 ติดต่อฝ่ายบริการลูกค้า กดเบอร์ Extension ก็ได้ กด 0 หาโอเปอร์เรเตอร์
- ถ้ากดผิดหรือไม่กดอะไรเลยก็ให้วนมาให้กดอีก 3 ครั้ง ค่อยวางสาย
- เบอร์ Extension ฝ่ายบัญชี 100, 101, 102 ฝ่ายขายเบอร์ 200, 201, 202, 203, 204 ฝ่ายบริการเบอร์ 300, 301, 302 ส่วนโอเปอร์เรเตอร์อยู่ที่เบอร์ 400, 401
- กดเบอร์ 1 ให้โอนสายมาที่ฝ่ายบัญชี ให้ดังทุกเครื่องพร้อมกัน กด 2 ให้โทรไปยังฝ่ายขาย ดังทุกเครื่องพร้อมกัน กด 3 ให้โทรไปฝ่ายบริการ ดังทุกเครื่องพร้อมกัน จนกว่าจะมีเครื่องใดเครื่องหนึ่งรับสาย และกด 0 ให้โทรไปที่โอเปอเรเตอร์
- ลูกค้าต้องกดเลือกทำรายการภายใน 10 วินาทีหลังจากพูดจบแล้ว
- ระหว่างการกดตัวเลขเบอร์ภายใน ลูกค้าต้องกดตัวเลขต้อไปภายในเวลา 5 วินาที (interdigit timeout)
- ระหว่างที่ ivr กำลังพูด ลูกค้ากดเลือกได้เลย ถ้าเขาจำได้ว่าต้องกดอะไร

1. ไฟล์ /etc/asterisk/sip.conf
1.1 สร้าง Trunk รับเบอร์ DID เข้ามา
ให้อยู่ใน Context ชื่อ from-trunk ก็ได้ครับ
โค้ด: เลือกทั้งหมด
[trunk-did-in]
host=x.x.x.x
port=5060
incecure=port,invite
disallow=all
allow=g729
allow=ualw
dtmfmode=rfc2833


1.2 สร้าง SIP Accountให้มีเบอร์ Extension ครบตามที่ต้องการ
ให้เบอร์ Extensions อยู่ใน Context ชื่อ from-internal ก็ได้ครับ พร้อมตั้ง callgroup และ pickupgroup ของเบอร์ Extesion ที่อยู่ในแผนกเดียวกันให้อยู่ในกลุ่มเดียวกัน เพื่อจะได้ดึงสายกันได้ ตัวอย่าง
โค้ด: เลือกทั้งหมด
[100]
host=dynamic
port=5060
secret=pass100
disallow=all
allow=g729
allow=alaw
dtmfmod=rfc2833
mailbox=100@default
callgroup=1
pickupgroup=1


2. อัดเสียง
เสียงที่จะอัดก็มีดังต่อไปนี้ ในวงเล็บเป็นชื่อไฟล์นะครับ
(welcome.wav) บริษัท เอบีซีดี ดอทคอม จำกัด สวัสดีค่ะ
(main.wav) กรุณากดหมายเลขที่ต้องการติดต่อ ติดต่อฝ่ายบัญชี กด 1 ติดต่อฝ่ายขาย กด 2 ติดต่อฝ่ายบริการกด 3 หรือกด 0 เพื่อติดต่อโอเปอเรเตอร์
(invalid.wav) ขออภัยค่ะ ท่านกดหมายเลขไม่ถูกต้อง
(timeout.wav) ขออภัยค่ะ ท่านยังไม่ได้ทำรายการ
(operator.wav) รอสักครู่นะคะ กำลังโอนสายของท่านไปยังโอเปอเรเตอร์
(thankyou.wav) ขอบคุณที่ติดต่อเรานะคะ สวัสดีค่ะ

โดยใช้โปรแกรมอัดเสียงทั่วๆไป เช่น Windows Sound Recorder แล้วแปลงไฟล์ให้อยู่ในรูปแบบ Windows PCM, 8 KHz, 16 Bit, Mono

*** หรือใครจะใช้โปรแกรมประเภท Text-to-Speech ทำก็ได้นะครับ เสียงก็พอไหวอยู่ ตามบทความนี้ครับ Text-to-Speech ภาษาไทย ***

3. อัพโหลดไฟล์เสียงเข้า Asterisk
เอาไปไว้ที่ไดเร็คตอรี่ /var/lib/astrisk/sounds/ivr01 เพราะไม่อยากให้ไฟล์ไปปะปนกับไฟล์เสียงอื่นๆของ Asterisk ครับ

4. แปลงไฟล์เสียงจาก .wav เป็น .gsm
ใช้โปรแกรม sox ครับ ถ้ายังไม่ได้ติดตั้งก็ให้ติดตั้ง ใช้สั่งนี้
โค้ด: เลือกทั้งหมด
yum -y install sox

แล้วแปลงไฟล์เสียง ใช้คำสั่งนี้
โค้ด: เลือกทั้งหมด
sox file.wav file.gsm


5. สร้าง Dialplan ไฟล์ extensions.conf
สมมติว่าเบอร์ DID ที่รับเข้ามาคือ 028888888 นะครับ

; ตั้งตัวแปร Glogal สองตัว เพื่อตั้งจำนวนวงรอบที่จะวนถ้าลูกค้ากดตัวเลือกผิด หรือไม่กดอะไรเลย
โค้ด: เลือกทั้งหมด
[globals]
NUMINVALID=3
NUMTIMEOUTS=3


โค้ด: เลือกทั้งหมด
[from-internal]
exten => _1XX,1,Dial(SIP/${EXTEN},30,tT)
exten => _1XX,2,Voicemail(u${EXTEN})
exten => _1XX,102,Voicemail(b${EXTEN})
exten => _1XX,103,Hangup

exten => _2XX,1,Dial(SIP/${EXTEN},30,tT)
exten => _2XX,2,Voicemail(u${EXTEN})
exten => _2XX,102,Voicemail(b${EXTEN})
exten => _2XX,103,Hangup

exten => _3XX,1,Dial(SIP/${EXTEN},30,tT)
exten => _3XX,2,Voicemail(u${EXTEN})
exten => _3XX,102,Voicemail(b${EXTEN})
exten => _3XX,103,Hangup

exten => _4XX,1,Dial(SIP/${EXTEN},30,tT)
exten => _4XX,2,Voicemail(u${EXTEN})
exten => _4XX,102,Voicemail(b${EXTEN})
exten => _4XX,103,Hangup


โค้ด: เลือกทั้งหมด
[from-trunk]
include => ivr01-service

[ivr01-service]

exten => 028888888,1,NoOp(Incoming Call To IVR01 from # ${CALLERID(num)})
exten => 028888888,n,Answer()
exten => 028888888,n,Set(TIMEOUT(digit)=5)
exten => 028888888,n,Set(TIMEOUT(response)=10)
exten => 028888888,n,Background(ivr01/welcome)
exten => 028888888,n(main-menu),Background(ivr01/main)
exten => 028888888,n,WaitExten(10)

; Call to Accounting Department
exten => 1,1,NoOp(# ${CALLERID(num)} Is Calling To Accounting Department)
exten => 1,n,DIAL(SIP/100&SIP/101&SIP/102)
exten => 1,n,Hangup

; Call to Sales Department
exten => 2,1,NoOp(# ${CALLERID(num)} Is Calling To Sales Department)
exten => 1,n,DIAL(SIP/200&SIP/201&SIP/202&SIP/203&SIP/204)
exten => 2,n,Hangup

; Call to Customer Service
exten => 3,1,NoOp(# ${CALLERID(num)} Is Calling To Customer Service)
exten => 3,n,Dial(SIP/300&SIP/301&SIP/302,60,tT)
exten => 3,n,Hangup

; Call to Operator
exten => 0,1,NoOp(# ${CALLERID(num)} Is Calling To Operator)
exten => 0,n,Dial(SIP/400&SIP/401,60,tT)
exten => 0,n,Hangup

; Direct to Internal Extensions
exten => _XXX,1,NoOp(# ${CALLERID(num)} Is Calling To Extension ${EXTEN})
exten => _XXX,n,Goto(from-internal,${EXTEN},1)
exten => _XXX,n,Hangup

exten => i,1,NoOp(# ${CALLERID(num)} Selected Invalid Option. Trying Number #${NUMINVALID})
exten => i,n,Playback(ivr01/invalid)
exten => i,n,NoOp(Number Try for Invalid = ${NUMINVALID})
exten => i,n,GotoIf($[${NUMINVALID} > 0]?:thankyou)
exten => i,n,Set(NUMINVALID=$[${NUMINVALID} - 1])
exten => i,n,Goto(ivr01-service,028888888,main)
exten => i,n(thankyou),Playback(ivr01/bye)
exten => i,n,Hangup

;ผมใช้ NoOp มาแสดงจำนวนครั้งที่ยูสเซอร์ไม่ได้ทำรายการ จริงๆแล้วยูสเซอร์อาจจะกดเลือกทำรายการ แต่ว่า DTMF อาจจะไม่เวอร์ค จึงทำให้ Asterisk ไม่รับรู้ว่ายูสเซอร์กดอะไร เคสนี้เราไม่ควรจะตัดสายลูกค้าทิ้ง เราควรโอนสายไปหา โอเปอเรเตอร์จะดีกว่าครับ โดยเมื่อครบ 3 ครั้งแล้วก็โอนสายไป ผมใช้ GotoIf มาเช็คเงื่อนไขตัวแปร ถ้าตัวแปรยังไม่เป็น 0 ก็จะไปทำบรรทัดต่อไป แต่ถ้าเป็น 0 แล้วก็จะไปบรรทัด operator ซึ่งจะมีเสียงบอกว่ากำลังโดนสายไปยังโอเปอเรเตอร์

โค้ด: เลือกทั้งหมด
exten => t,1,NoOp(# ${CALLERID(num)} Didn't Select Any Option. Trying Number #${NUMTIMEOUTS})
exten => t,n,Playback(ivr01/timeout)
exten => t,n,NoOp(Number Try for Timeout = ${NUMTIMEOUTS})
exten => t,n,GotoIf($[${NUMTIMEOUTS} > 0]?:operator)
exten => t,n,Set(NUMTIMEOUTS=$[${NUMTIMEOUTS} - 1])
exten => t,n,Goto(ivr01-service,028888888,main)
exten => t,n(operator),Playback(ivr01/operator)
exten => t,n,Dial(SIP/400&SIP/401,60,tT)
exten => t,n,Hangup


6. สิ่งที่ต้องทำเพิ่มเติมกับ IVR (เด็กๆนี้)
-ใช้ Queue มาแทนการโทรหาเบอร์ Extension เราะว่าเราสามารถนำลูกเล่นของ Queue มาใช้งานได้ เช่น โทรหาทุกคน โทรหาคนแรก โทรหาแบบสลับคน เป็นต้น
-ควรเช็คช่วงเวลา ถ้าหลังเวลาทำงานก็ต้องบอกว่า เลิกงานแล้ว แล้วอาจจะโอนสายไปโทรศัพท์มือถือของฝ่ายบริการลูกค้า
-อัดเสียงการสนทนาไว้ โดยใช้ Asterisk Call Recorder โดยเฉพาะตอนที่ลูกค้าโทรหาฝ่ายขาย (ถ้าต้องการ)

อย่าลืมติดตามนะครับ

บทความที่เกี่ยวข้อง
เทคนิคการบันทึกเสียงการสนทนาด้วย Asterisk Call Recorder
เทคนิคการเขียน Asteisk Dial Plan
การสร้าง SIP Accounts
voip4share
Administrator
 
โพสต์: 656
ลงทะเบียนเมื่อ: 18 พ.ย. 2009 11:26
ที่อยู่: รามคำแหง กรุงเทพฯ

Re: Asterisk IVR แรกของผมครับ

โพสต์โดย pukpikmiew » 29 ก.ค. 2010 16:00

อยากทราบวิธีการset path อ่ะคะ ว่า เก็บเสียงจากคอมมาไว้ในServer ยังไง
pukpikmiew
 
โพสต์: 2
ลงทะเบียนเมื่อ: 29 ก.ค. 2010 15:58

Re: Asterisk IVR แรกของผมครับ

โพสต์โดย nuiz » 01 ส.ค. 2010 16:52

ลองอ่านบทความนี้เพิ่มเติมนะครับ เป็นบทความเกี่ยวกับ Asterisk Sounds ถ้ายังสงสัยอยู่ ก็โพสต์ถามได้ครับ
Asterisk Sounds
** หากมีปัญหากับอุปกรณ์ที่ซื้อมาเองหรือบริการที่ทำขึ้นมาเอง ให้โพสต์ถามในเว็บบอร์ดนี้นะครับ **
** งานเร่งด่วนติดต่อว่าจ้างที่เบอร์ 08-5161-9439 อีเมล์ iamaladin@gmail.com ไลน์ NuizVoip ครับ **
nuiz
Diamond Member
 
โพสต์: 7069
ลงทะเบียนเมื่อ: 24 มี.ค. 2010 09:33


ย้อนกลับไปยัง Asterisk SIP Server

ผู้ใช้งานขณะนี้

กำลังดูบอร์ดนี้: ไม่มีสมาชิกใหม่ และ บุคคลทั่วไป 10 ท่าน