หน้า 1 จากทั้งหมด 1

วิธีการบันทึกเสียงการโทรด้วย Asterisk Call Recorder

โพสต์โพสต์แล้ว: 08 มี.ค. 2010 16:23
โดย voip4share
ดาวน์โหลดบทความ Asterisk Sound Recording นี้ในรูปแบบไฟล์ pdf

Asterisk Call Recording

ผมมีบทความนี้มาฝากครับ เป็นการสั่ง Asterisk ให้บันทึกเสียงในขณะที่ยูสเซอร์ใช้โทรศัพท์ ทั้งโทรออกและรับสายเข้า ไม่ว่าจะโทรหากันภายใน หรือโทรออกไปภายนอก หรือภายนอกโทรเข้ามาหาก็ตาม

คำสั่งที่ใช้คือ MixMonitor เป็นคำสั่งใน Dialplan ทำให้เราบันทึกเสียงการสนทนาได้ คำสั่งนี้จะแตกต่างจากคำสั่ง Monitor ตรงที่สามารถปรับโวลุ่มเสียงในขณะที่กำลังสนทนาได้ ปรับได้ทั้งเสียงพูดและเสียงที่ได้ยิน หรือเอาเสียงสนทนาไปต่อท้ายเสียงไฟล์เดิมก็ได้ รูปแบบการใช้คำสั่งคือ

MixMonitor(<filename>.<extension>[|<options>[|command>]])

โดยที่
filename เป็นชื่อไฟล์ หรือจะใส่ Path ด้วยก็ได้นะครับ เช่น /tmp/filename หรือจะไม่ระบุชื่อ Path ก็ได้นะครับซึ่งไฟล์จะเก็บที่ไดเร็คตอรี่ /var/spool/asterisk/monitor แต่ถ้าระบุ Path แบบนี้ voip4share/file (ไม่มีเครื่องหมาย / ข้างหน้า voip4share) ไฟล์จะถูกเก็บที่ไดเร็คตอรี่ย่อยชื่อ voip4share ภายในไดเร็คตอรี่ /var/spool/asterisk/monitor
extension เป็นนามสกุลของไฟล์ เช่น .WAV ซึ่งนามสกุลนี้นะครับก็คือรูปแบบไฟล์เสียงที่จะบันทึก ถ้าเราใส่เป็น .wav หรือ .WAV จะเปิดด้วย Windows Media Player ได้ แต่ .WAV จะมีขนาดเล็กกว่า นาทีละ 85 กิโลไบต์ หรือชั่วโมงละประมาณ 5 เม็กเท่านั้น
option เป็นออปชั่นมีให้เลือกดังนี้
a - ถ้ามีไฟล์ชื่อเดียวกันอยู่ในไดเร็คตอรี่ จะเอาเสียงใหม่ไปต่อท้ายเสียงเก่า ไม่เขียนทับ
b - จะบันทึกเสียงเมื่อเสียงเมื่อปลายทางรับสายแล้ว (แชนแนลถูกบริดจ์) ถ้าติดต่อเบอร์ปลายทางไม่ได้ก็จะไม่บันทึกเสียงนะครับ
v(x) - ปรับโวลุ่มเสียงปลายทางพูดหรือเสียงที่เราได้ยิน x - มีค่าจาก -4 ถึง 4
V(x) ปรับโวลุ่มเสียงที่เราพูดหรือเสียงที่ปลายทางได้ยิน x - มีค่าจาก -4 ถึง 4
W(x) ปรับโวลุ่มเสียงที่ได้ยินและเสียงที่พูด x - มีค่าจาก -4 ถึง 4

มาดูตัวอย่างการใช้งานกันครับ ซึ่งผมจะบันทึกเสียงที่โทรไปหาเบอร์ภายใน (อาจจะโทรจากเบอร์ภายใน หรือเบอร์ภายนอกก็ได้) และสายภายในที่โทรหาเบอร์ภายนอก เก็บไฟล์เสียงไว้ในไดเร็คตอรี่ /tmp ชื่อไฟล์มีรูปแบบคือ record-${CALLERID(num)}-${EXTEN}-${STRFTIME(${EPOCH},,%d%m%Y-%H%M%S)}.WAV โดยที่ ${CALLERID(num)} คือเบอร์ต้นทาง, ${EXTEN} คือเบอร์ปลายทาง,${EXTEN}-${STRFTIME(${EPOCH},,%d%m%Y-%H%M%S)} คือ วันที่และเวลา เก็บในรูปแบบ WAV ให้บันทึกเมื่อปลายทางรับสาย และปรับโวลุ่มเสียงไว้ที่ 2 (ดังกว่าปกติ)

1. ไฟล์ extensions.conf

; บันทึเสียงการโทรระหว่างสายใน หรือสายนอกกับสายใน
exten => _1XX,1,MixMonitor(/tmp/record-${CALLERID(num)}-${EXTEN}-${STRFTIME(${EPOCH},,%d%m%Y-%H%M%S)}.WAV|bW(0))
exten => _1XX,2,Dial(SIP/${EXTEN},30,tT)
exten => _1XX,3,Voicemail(u${EXTEN})
exten => _1XX,103,Voicemail(b${EXTEN})
exten => _1XX,104,Hangup

; บันทึกเสียงการโทรระหว่างสายในกับสายนอก (กด 9 โทรออกสายนอก)
exten => _90X.,1,MixMonitor(/tmp/record-${CALLERID(num)}-${EXTEN}-${STRFTIME(${EPOCH},,%d%m%Y-%H%M%S)}.WAV|bW(0))
exten => _90X.,n,Dial(SIP/${EXTEN:1}@trunk1,30,tT)
exten => _90X.,n,Hangup

ถ้าเป็น Asterisk 1.6 ให้ใช้เครื่องหมายคอมม่า , แทนเครื่องหมายไปป์ | นะครับ

2. ไฟล์ sip.conf
สร้าง Trunk ชื่อ trunk1 และสร้าง SIP Clients เหมือนปกติครับ ไม่ได้มีอะไรพิเศษ

3. ทดสอบ
เอาเบอร์ Extension 100 โทรไปหาเบอร์ 028888888 เมื่อวันที่ 8/03/2010 เวลา 15:32:44 เมื่อปลายทางรับสาย คุยธุระจบและวางสาย จะมีไฟล์ชื่อ record-100-9028888888-08032010-153244.WAV อยู่ในไดเร็คตอรี่ /tmp
ดาวน์โหลดไฟล์นี้และใช้ Windows Media Player หรือโปรแกรมอะไรก็ได้ที่เล่นไฟล์เสียงได้ เปิดฟังครับ

Re: วิธีการบันทึกเสียงการโทรด้วย Asterisk Call Recorder

โพสต์โพสต์แล้ว: 02 ก.พ. 2011 14:03
โดย smuchcha
วิธีการนี้สามารถทำใน elastix ได้มั้ยครับ ผมต้องการบันทึกเสียงการใช้โทรศัพท์ใน elastix เหมือน call center นะครับ ผมหาที่ set ไม่เจอครับไม่ทราบว่ากำหนด บันทึกเสียงตรงไหน เจอแต่ voice mail นะครับ ท่านผู้รู้ช่วยตอบด้วยครับ

Re: วิธีการบันทึกเสียงการโทรด้วย Asterisk Call Recorder

โพสต์โพสต์แล้ว: 03 ก.พ. 2011 09:24
โดย nuiz
สวัสดีครับ
เปิดการบันทึกเสียงได้ทั้งที่เบอร์ Extension, และ Queue ครับ มันจะมีให้ติ๊กเลือกอยู่ ถ้าทำที่ Queue ให้เลือกเป็นฟอร์แม็ต wav49 นะครับ ไฟล์ขนาดจะเล็ก และเปิดฟังใน Windows Media Player ได้

ที่แต่ละ Extension ก็จะมีให้เลือกว่าจะบันทึกเฉพาะตอนรับสายเข้า Record Incoming และ/หรือโทรออก Record Outgoing

Elastix ใช้ MixMonitor อยู่แล้วนะครับ อยู่ในไฟล์ /etc/asterisk/extensions.conf อ่ะครับ

[macro-record-enable]
exten => s,1,GotoIf($[${LEN(${BLINDTRANSFER})} > 0]?2:4)
exten => s,2,ResetCDR(w)
exten => s,3,StopMonitor()
exten => s,4,AGI(recordingcheck,${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)},${UNIQUEID})
exten => s,5,Noop(No recording needed)
exten => s,999,MixMonitor(${CALLFILENAME}.wav)

และที่ไฟล์ /var/lib/asterisk/agi-bin/recordingcheck จะมีบอกไว้ว่าชื่อไฟล์จะมีรูปร่างหน้าตายังไง ไฟล์ขึ้นต้นด้วยอะไร

Re: วิธีการบันทึกเสียงการโทรด้วย Asterisk Call Recorder

โพสต์โพสต์แล้ว: 27 มิ.ย. 2011 15:13
โดย smuchcha
ตอนนี้ผมใช้ elastix 1.5.2 และ 1.6 อยุ่ครับ ถ้าต้องการเปลี่ยนชื่อ file เสียงต้องทำอย่างไรครับ
ตรงหน้า Recording Location: อันนี้คือใส่ path ที่จะเก็บ file ที่อันและ Run after record: ใส่ script ที่จะเปลียนชื่อ file ผมลองใส่ script ตามเว็บแล้วชื่อ file ก็ไม่เปลี่ยนนะครับ
ถ้าต้องการเปลี่นชื่อ file จากเดิมที่เป็น
-rw-r--r-- 2 asterisk asterisk 46K Jun 27 15:07 IN-1101-1309161993.14.gsm
ให้ชื่อ file มีเบอร์ต้นทาง ปลายทาง วัน เวลา ต้องทำอย่างไรครับ

Re: วิธีการบันทึกเสียงการโทรด้วย Asterisk Call Recorder

โพสต์โพสต์แล้ว: 30 มิ.ย. 2011 19:32
โดย smuchcha
ผู้ที่ใช้งาน elastix version 2.0 ครับ
วิธีแก้ไข ชื่อ file เสียงที่บันทึกครับ

ที่ file ชื่อ extensions_override_freepbx.conf และ extensions_additional.conf

#edit by pum
#File: extensions_override_freepbx.conf

[macro-record-enable]
include => macro-record-enable-custom
exten => s,1,GotoIf($["${BLINDTRANSFER}" = ""]?check)
exten => s,n,ResetCDR(w)
exten => s,n,StopMixMonitor()
exten => s,n(check),ExecIf($["${ARG1}"=""]?MacroExit())

exten => s,n,GotoIf($["${ARG2}"="Group"]?Group:OUT)
exten => s,n(Group),Set(LOOPCNT=${FIELDQTY(ARG1,-)})
exten => s,n,Set(ITER=1)
exten => s,n(begin),GotoIf($["${CUT(DB(AMPUSER/${CUT(ARG1,-,${ITER})}/recording),=,3)}" != "Always"]?continue)
exten => s,n,Set(TEXTEN=${CUT(ARG1,-,${ITER})})
exten => s,n,Noop(Recording enable for ${TEXTEN})
exten => s,n,Set(CALLFILENAME=g${TEXTEN}-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${UNIQUEID})
exten => s,n,Goto(record)
exten => s,n(continue),Set(ITER=$[${ITER}+1])
exten => s,n,GotoIf($[${ITER}<=${LOOPCNT}]?begin)

exten => s,n(OUT),GotoIf($["${ARG2}"="IN"]?IN)
exten => s,n,ExecIf($["${CUT(DB(AMPUSER/${ARG1}/recording),|,1):4}" != "Always"]?MacroExit())
exten => s,n,Noop(Recording enable for ${ARG1})
;edit by pum
;exten => s,n,Set(CALLFILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${UNIQUEID})
exten => s,n,Set(CALLFILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-From${AMPUSER}-To${ARG4}-${UNIQUEID})
exten => s,n,Goto(record)

exten => s,n(IN),ExecIf($["${CUT(DB(AMPUSER/${ARG1}/recording),|,2):3}" != "Always"]?MacroExit())
exten => s,n,Noop(Recording enable for ${ARG1})
;edit by pum
;exten => s,n,Set(CALLFILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-${UNIQUEID})
exten => s,n,Set(CALLFILENAME=${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}-From${AMPUSER}-To${ARG1}-${UNIQUEID})
exten => s,n(record),MixMonitor(${MIXMON_DIR}${CALLFILENAME}.${MIXMON_FORMAT},,${MIXMON_POST})
exten => s,n,Set(CDR(userfield)=audio:${CALLFILENAME}.${MIXMON_FORMAT})
exten => s,n,MacroExit()


[macro-hangupcall]
include => macro-hangupcall-custom
exten => s,1,GotoIf($["${TOUCH_MONITOR_OUTPUT}" = ""]?noautomon)
;edit by pum
;exten => s,n,Set(CDR(userfield)=audio:${TOUCH_MONITOR_OUTPUT}.${MIXMON_FORMAT})
exten => s,n,Set(CDR(userfield)=audio:${TOUCH_MONITOR_OUTPUT}.wav)
exten => s,n(noautomon),Noop(TOUCH_MONITOR_OUTPUT=${TOUCH_MONITOR_OUTPUT})
exten => s,n(start),GotoIf($["${USE_CONFIRMATION}"="" | "${RINGGROUP_INDEX}"="" | "${CHANNEL}"!="${UNIQCHAN}"]?skiprg)
exten => s,n,Noop(Cleaning Up Confirmation Flag: RG/${RINGGROUP_INDEX}/${CHANNEL})
exten => s,n(delrgi),Noop(Deleting: RG/${RINGGROUP_INDEX}/${CHANNEL} ${DB_DELETE(RG/${RINGGROUP_INDEX}/${CHANNEL})})
exten => s,n(skiprg),GotoIf($["${BLKVM_BASE}"="" | "BLKVM/${BLKVM_BASE}/${CHANNEL}"!="${BLKVM_OVERRIDE}"]?skipblkvm)
exten => s,n,Noop(Cleaning Up Block VM Flag: ${BLKVM_OVERRIDE})
exten => s,n(delblkvm),Noop(Deleting: ${BLKVM_OVERRIDE} ${DB_DELETE(${BLKVM_OVERRIDE})})
exten => s,n(skipblkvm),GotoIf($["${FMGRP}"="" | "${FMUNIQUE}"="" | "${CHANNEL}"!="${FMUNIQUE}"]?theend)
exten => s,n(delfmrgp),Noop(Deleting: FM/DND/${FMGRP}/${CHANNEL} ${DB_DELETE(FM/DND/${FMGRP}/${CHANNEL})})
exten => s,n(theend),Hangup




#edit
nano /etc/asterisk/extensions_additional.conf
# edit in file #
# edit marcor of route outgoing #
[outrt-001-9_PSTN]
include => outrt-001-9_PSTN-custom
exten => _9X.,1,Macro(user-callerid,SKIPTTL,)
exten => _9X.,n,Set(_NODEST=)
;edit by pum
;exten => _9X.,n,Macro(record-enable,${AMPUSER},OUT,)
exten => _9X.,n,Macro(record-enable,${AMPUSER},OUT,,${EXTEN:1})
exten => _9X.,n,Macro(dialout-trunk,2,${EXTEN:1},,)
exten => _9X.,n,Macro(dialout-trunk,1,${EXTEN:1},,)
exten => _9X.,n,Macro(outisbusy,)

; end of [outrt-001-9_PSTN]




ผลที่ได้คือ ชื่อ file เปลี่ยนไปตามนี้ครับ

[root@elastix ~]# ll -ht /var/spool/asterisk/monitor/
total 4.8M
-rw-r--r-- 1 asterisk asterisk 39K Jun 30 17:43 20110630-174308-From1101-To1103-1309430588.32.gsm
-rw-r--r-- 1 asterisk asterisk 1.8K Jun 30 17:42 20110630-174245-From1101-To1103-1309430565.30.gsm
-rw-r--r-- 1 asterisk asterisk 24K Jun 30 17:42 20110630-174227-From1103-To1101-1309430547.28.gsm
-rw-r--r-- 1 asterisk asterisk 28K Jun 30 17:41 20110630-174132-From1101-To1103-1309430492.27.gsm
-rw-r--r-- 1 asterisk asterisk 338K Jun 30 17:38 auto-1309430319-1103-1101.wav
-rw-r--r-- 1 asterisk asterisk 248K Jun 30 17:37 auto-1309430260-1101-1103.wav