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

Asterisk Opensource IP Pbx

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

โพสต์โดย voip4share » 08 มี.ค. 2010 16:23

ดาวน์โหลดบทความ 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 หรือโปรแกรมอะไรก็ได้ที่เล่นไฟล์เสียงได้ เปิดฟังครับ
voip4share
Administrator
 
โพสต์: 656
ลงทะเบียนเมื่อ: 18 พ.ย. 2009 11:26
ที่อยู่: รามคำแหง กรุงเทพฯ

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

โพสต์โดย smuchcha » 02 ก.พ. 2011 14:03

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

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

โพสต์โดย nuiz » 03 ก.พ. 2011 09:24

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

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

โพสต์โดย smuchcha » 27 มิ.ย. 2011 15:13

ตอนนี้ผมใช้ 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 มีเบอร์ต้นทาง ปลายทาง วัน เวลา ต้องทำอย่างไรครับ
smuchcha
Silver Member
 
โพสต์: 43
ลงทะเบียนเมื่อ: 27 ส.ค. 2010 10:36

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

โพสต์โดย smuchcha » 30 มิ.ย. 2011 19:32

ผู้ที่ใช้งาน 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
smuchcha
Silver Member
 
โพสต์: 43
ลงทะเบียนเมื่อ: 27 ส.ค. 2010 10:36


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

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

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

cron