สวัสดีตอนสายๆของเช้าวันเสาร์ครับ
พอดีเมื่อกี้ผมมีปัญหากับไฟล์เสียงของ Asterisk คือว่าผมกำลังเทส ChanSpy อยู่ แต่ปรากฏว่า Asterisk ฟ้องว่าหาไฟล์เสียงบางไฟล์ไม่เจอ ผมก็เลยมาเช็คในไดเร็คตอรี่ /var/lib/asterisk/sounds ดูก็ปรากฏว่าไฟล์นี้ยังไม่ได้ติดตั้งเลย ผมก็เลยคิดว่าอาจจะมีบางท่านที่เจอปัญหาเดียวกับผม ก็เลยเขียนบทความนี้ขึ้นมา
บทความนี้ผมจะแนะนำให้ท่านได้รู้จักกับไฟล์เสียง (Sound Files) ที่ Asterisk เล่นให้เราฟังนะครับ ซึ่งไฟล์เสียงนี้จะเก็บอยู่ที่ไดเร็คตอรี่ /var/lib/asterisk/sounds ครับ ซึ่งดีฟอลท์ Asterisk จะมีไฟล์เสียงอยู่ 4 กลุ่ม ได้แก่
- Asterisk Core Sound
- Asterisk Extra Sound
- Asterisk Music On Hold ซึ่งแบ่งเป็น MOH Freeplay และ MOH Opsound
มีอยู่ 3 ภาษา ได้แก่ English (En), French (Fr) และ Spanish (Es) ถ้าอยากได้ภาษาไทย ต้องอัดเองครับ

การติดตั้งไฟล์เสียงเพิ่มเติม
ดาวน์โหลดไฟล์เสียง สมมติว่าเป็นไฟล์ asterisk-core-sounds-en-g729-current.tar.gz ซึ่งเป็นไฟล์ Core sound ภาษาอังกฤษ รูปแบบ G.729 ก็ให้ติดตั้งแบบนี้ครับ
- โค้ด: เลือกทั้งหมด
tar xzvf asterisk-core-sounds-en-g729-current.tar.gz -C /var/lib/asterisk/sounds
หรือถ้าเรามีการแยกเสียงภาษาอังกฤษให้อยู่ในไดเร็คตอรี่ /var/lib/asterisk/sounds/en ก็พิมพ์คำสั่งแบบนี้
- โค้ด: เลือกทั้งหมด
tar xzvf asterisk-core-sounds-en-g729-current.tar.gz -C /var/lib/asterisk/sounds/en
การเรียกใช้ไฟล์เสียง
เราเรียกใช้ไฟล์เสียงจาก Dialplan ครับ ซึ่งมีอยู่ 2 คำสั่งที่เราใช้เรียกไฟล์เสียงคือ Playback() และ Background() สองคำสั่งนี้ต่างกันตรงที่ คำสั่งแรกต้องรอให้ Asterisk เล่นไฟล์เสียงจบก่อนจึงจะพร้อมรับงานอื่น เราขัดจังหวะมันไม่ได้นะครับ ส่วนคำสั่งที่สองขณะที่ Asterisk เล่นไฟล์เสียงเราขัดจังหวะมันได้โดยกดปุ่มบนแป้นโทรศัพท์ ใช้ในการทำ IVR
ไดเร็คตอรี่เก็บไฟล์เสียง
ผมเคยใช้ Asterisk 1.4 ไฟล์เสียงเก็บไว้ที่ /var/lib/asterisk/sounds มีอยู่เป็นร้อยๆไฟล์กองกันอยู่ในไดเร็คตอรี่นี้ และมีอีกหลายๆไดเร็ตคอรี่ย่อยเช่น digits, fr, es เป็นต้น เสียงภาษาอังกฤษจะอยู่ที่ /var/lib/asterisk/sounds เลย ส่วนเสียงภาษาฝรั่งเศส และเสปนจะอยู่ในไดเร็คตอรี่ย่อย fr และ es ตามลำดับ ส่วนตัวเลขอยู่ที่ไดเร็คตอรี่ย่อย digits ครับ
แต่เราทำอย่างนี้ก็ได้นะครับ สร้างไดเร็คตอรี่ย่อย en ขึ้นมา แล้วย้ายไฟล์ทุกไฟล์ใน /var/lib/asterisk/sounds (ไม่รวมไดเร็คตอรี่นะครับ ไม่ต้องเอามา) เข้าไปไว้ใน en นี้ ก็จะเป็นระเบียบเรียบร้อยดี
ไดเร็คตอรี่ /var/lib/asterisk/sounds
เวลาเราใช้ Playback() หรือ Background() เราต้องระบุชื่อไฟล์เสียงในเครื่องหมาย () ด้วยนะครับ แต่ไม่ต้องระบุนามสกุล ยกตัวอย่างเช่นต้องการเล่นไฟล์เสียง soundfile.gsm ก็ให้ระบุแค่ Background(soundfile) ก็พอ ซึ่ง Asterisk จะมองหาไฟล์ soundfile ในไดเร็คตอรี่ /var/lib/asterisk/sounds ครับ เพราะนี่เป็นไดเร็คตอรี่ดีฟอลท์ของไฟล์เสียง เน้นว่าไฟล์เสียงนะครับไม่ใช่ไฟล์ Music On Hold มันคนละอย่างกัน
ถ้าไฟล์เสียงไม่ได้ติดตั้งอยู่ใน /var/lib/asterisk/sounds มันก็จะหาไม่เจอ แต่ Asterisk จะไปมองหาอีกที่หนึ่งคือในไดเร็คตอรี่ที่ตรงกับ "ภาษา" ที่มันกำลังใช้โต้ตอบกับ User ในขณะนั้น เช่นถ้าเป็นภาษาอังกฤษ (language=en) ก็จะมองหาในไดเร็คตอรี่ /var/lib/asterisk/sounds/en ถ้าหาไม่เจออีกก็ไม่หาต่อแล้วครับ ยูสเซอร์ก็จะไม่ได้ยินเสียงนั้นและAsterisk ก็จะวางสายไปเลย
ถ้าไฟล์เสียงไม่ได้อยู่ที่ไดเร็คตอรี่ดีฟอลท์ เราต้องระบุ Path ของไฟล์เสียงด้วยนะครับ ไม่อย่างนั้น Asterisk จะหาไม่เจอ เช่น ไฟล์ filename.gsm อยู่ที่ไดเร็ตคอรี่ /tmp เราก็ระบุแบบนี้
Background(/tmp/filename)
แต่ถ้าไฟล์เสียงอยู่ไดเร็คตอรี่ /var/lib/asterisk/sounds/myfile ซึ่งจะเห็นว่าไดเร็คตอรี่ myfile เป็นไดเร็คตอรี่ย่อยของไดเร็คตอรี่ดีฟอลท์ เราก็ระบุแบบนี้
Background(myfile/filename)
สังเกตุว่าไม่มีเครื่องหมาย / ข้างหน้า myfile นะครบั
วิธีการเซ็ตภาษา (Language) ให้แก่ Client
ทำได้ 2 ที่ครับคือที่ไฟล์ sip.conf และ extensions.conf
ในไฟล์ sip.conf เราเพิ่มบรรทัด language เข้าไปครับ เช่น language=en โดยอาจจะเพิ่มไว้ภายใต้ [ganeral] ก็ได้ เป็น
[general]
language=en
หรือเพิ่มไว้ในแต่ละ SIP Trunk หรือ SIP Extensions ก็ได้ เช่น
[Trunk-true-net]
language=th
[100]
language=th
ซึ่งก็จะทำให้ Asterisk โต้ตอบกับสายที่โทรเข้ามาทาง Trunk-true-net และเบอร์ Extension 100 ด้วยภาษาไทย (เข้ามาอ่านไฟล์เสียงใน /var/lib/asterisk/sounds/th) ถ้าไม่มีไดเร็คตอรี่นี้อยู่ หรือไม่มีไฟล์เสียงที่ต้องการ มันจะเข้าไปอ่านไฟล์เสียงใน /var/lib/asterisk/sounds/en แทนครับ
ส่วนในไฟล์ Extensions.conf เราเซ็ตเสียงด้วยคำสั่ง Set(CHANNEL(language)=language) ครับ เช่น
[ivr-main]
exten => 028888888,1,Set(CHANNEL(language)=th)
exten => 028888888,n,Answer()
exten => 028888888,n,Background(welcome-to-kbank)
เสียงภาษาต่างๆ
ในเว็บไซต์ http://downloads.asterisk.org/pub/telephony/sounds มีเสียงให้แล้ว 3 ภาษา ได้แก่ English (En), French (Fr) และ Spanish (Es) ซึ่งแต่ละภาษาต้องอยู่คนละไดเร็คตอรี่กันนะครับ เช่น
ภาษาอังกฤษ /var/lib/asterisk/sounds/en
ภาษาฝรั่งเศส /var/lib/asterisk/sounds/fr
ภาษาไทย /var/lib/asterisk/sounds/th
ภาษาจีน /var/lib/asterisk/sounds/cn
ดูตัวย่อ 2 ตัวของประเทศต่างๆในไฟล์ /etc/asterisk/indications.conf นะครับ
เสียงตัวเลข
Asterisk จะเข้ามาอ่านไฟล์เสียงตัวเลขในไดเร็คตอรี่ digits นะครับ เช่น
ตัวเลขภาษาอังกฤษ /var/lib/asterisk/sounds/en/digits
ตัวเลขภาษาฝรั่งเศส /var/lib/asterisk/sounds/fr/digits
ตัวเลขภาษาไทย /var/lib/asterisk/sounds/th/digits
ตัวเลขภาษาจีน /var/lib/asterisk/sounds/cn/digits
ไฟล์เสียงฟอร์แม๊ตต่างๆ
เมื่อ Asterisk เข้ามาหาไฟล์เสียงชื่อ soundfile ในไดเร็คตอรี่ที่เก็บไฟล์เสียง และพบว่าไฟล์เสียงที่มันต้องการมีอยู่แค่ไฟล์เดียว (นามสกุลเดียว) มันก็จะใช้ไฟล์นี้เลย แต่ถ้ามีหลายนามสกุลเช่น soundfile.gsm, soundfile.g729, soundfile.alaw, soundfile.ulaw มันจะมีเทคนิคที่เลือกเองหน่ะครับ เลือกไฟล์ที่มีการสิ้นเปลืองทรัพยากรในเครื่องน้อยที่สุด
จำเป็นมั๊ยว่าเราต้องติดตั้งไฟล์เสียงหลายๆฟอร์แม๊ต
ผมว่าจำเป็นครับ ติดตั้งให้หมดเลย *.gsm, *.g729, *.alaw, *.alaw, *.wav มันไม่เปลือง Harddisk หรอกครับ แต่มีประโยชน์มาก ได้ใช้แน่นอน ยกตัวอย่างเช่น มี Extension เบอร์ 100 ใช้ Codec G.729 โทรเข้ามาเช็ค Voicemail ซึ่ง Asterisk รู้ว่า Extension นี้ใช้ Codec G.729 มันก็จะเลือกไฟล์เสียงที่มีนามสกุลเป็น g729 ให้โดยอัตโนมัติ ข้อดีคือไม่ต้องมีการทำ Codec Transcoding ไม่เปลือง CPU ครับ และมีอีก Extension ใช้ Codec G.711ulaw ก็จะเลือกใช้ไฟล์ .ulaw ครับ ไม่ต้องทำ Codec Transcoding อีกเช่นกัน
อีกกรณีหนึ่ง บางท่านอาจมีเบอร์ DID ด้วย ก็ต้องเชื่อมต่อกับผู้ให้บริการ ซึ่งก็อาจจะใช้ Codec G.729 ถ้าเรามีไฟล์เสียงที่มีทั้งรูปแบบและนามสกุลเป็น g729 ก็ไม่ต้องมีการทำ Transcoding เช่นเดียวกัน
เห็นประโยชน์ของการติดตั้งไฟล์เสียงหลายๆฟอร์แม๊ตหรือยังครับ

การทำ Codec Transcoding
Asterisk มันสามารถทำงานกับ Codec ได้ทั้งแบบ Transcoding และ Transparent ซึ่งการทำงานแบบ Transcoding จะทำให้สิ้นเปลือง CPU ของเครื่องพอสมควร ทำให้ Asterisk รองรับสายได้ปริมาณจำกัด แต่เราก็หลีกเลี่ยงได้ครับ โดยการติดตั้งไฟล์เสียงหลายๆรูปแบบ ดังที่ผมได้กล่าวมาแล้ว
แต่ก็ไม่ใช่ว่าเราจะทำไฟล์เสียงได้ทุกรูปแบบเสมอไปอย่างเช่น เราอาจจะหาโปรแกรมมาแปลงไฟล์เสียงให้เป็นแบบที่เราต้องการไม่ได้ เราก็ต้องจำใจยอมทนให้ Asterisk ทำงานแบบ Transcoding ครับ (น่าสงสาร) ผมขอยกตัวอย่างการทำ Transcoding แบบนี้นะครับ สมมติว่า Extension 100 ใช้ Codec G.723 ซึ่ง Asterisk ก็รองรับ G.723 ด้วยแต่ว่ามันไม่มีไฟล์เสียง .g723 อยู่เลย มีแต่ .gsm, .alaw, .ulaw, .g729 แล้ว Asterisk มันจะเลือกใช้ไฟล์ไหนหล่ะ
Asterisk มันใช้เทคนิคแบบนี้ครับ ตอนที่เราสตาร์ท Asterisk ใหม่ๆ มันจะคำนวณหาค่าเวลาที่มันจะใช้ไปในการ Transcoding ระหว่าง Codec ต่างๆ เช่นจาก GSM ไปเป็น G.723 กี่วินาที แปลงจาก G.729 ไปเป็น G.723 ใช้เวลากี่วินาที ทำทุก Codec ที่มันรองรับเลยครับ แล้วก็จำไว้ เราดูเวลาที่ Asterisk คำนวณได้นี้ได้ด้วยนะครับ ถ้าอยากรู้ เข้า Asterisk Console แล้วพิมพ์คำสั่ง
- โค้ด: เลือกทั้งหมด
core show translation
รูปนี้นะครับเป็นระยะเวลาที่ Asterisk จะใช้ในการแปลงเสียงจาก Codec หนึ่งไปเป็น Codec หนึ่ง โคเด็คที่อยู่แนวนอน (แถว) เป็น Souce ส่วนโคเด็คที่อยู่แนวตั้ง (คอลัมน์) เป็น Destination ส่วนตัวเลขเป็นระยะเวลาที่จะใช้ หน่วยเป็น microsecond (เร็วกว่า 1 วินาที ตั้ง 1 ล้านเท่า) ระยะเวลานี้คำนวณจากการแปลงไฟล์เสียงความยาว 1 วินาที
จากที่ผมยกตัวอย่างไว้ข้างบน Asterisk มันต้องแปลงไฟล์เสียง .gsm, .alaw, .ulaw, .g729 ไปเป็น G.723 มันจะเลือก .ulaw หรือ .alaw ก็ได้ เพราะว่าใช้ระยะเวลาน้อยกว่า
gsm -> g723 ใช้เวลา 5999 microseconds (us)
alaw -> g723 ใช้เวลา 5000 us
ulaw -> g723 ใช้เวลา 5000 us
g729 -> g723 ใช้เวลา 5999 us
ดังนั้นถ้าเรามีไฟล์เสียงครบทุกฟอร์แม๊ตก็จะดีมากเลยครับ
เราจะทำไฟล์ g729 ได้ยังไง
ใช้โปรแกรมที่แปลงไฟล์เสียงได้ ขอขออภัยครับผมยังหาโปรแกรมที่เจ๋งๆไม่ได้เลย เคยใช้บางโปรกรมแปลงเป็น .g729 แล้วปรากฏว่า Asterisk อ่านไม่รู้เรื่อง และผมเคยแปลงผ่านเว็บด้วย เว็บนี้ครับ http://www.asteriskguru.com/tools/audio_conversion.php แปลงได้หลายฟอร์แม๊ต แต่ล่าสุดที่ผมแปลง g729 โปรแกรมนี้มันฟ้องเออเร่อครับ
การแปลงไฟล์ .wav ให้เป็น gsm, g729, ulaw และ alaw
ใช้โปรแกรมแปลงครับ หรือไม่ก็แปลงจากเว็บนี้ก็ได้ http://www.asteriskguru.com/tools/audio_conversion.php
การสร้างไฟล์เสียงใช้เอง
ถ้าเราต้องการไฟล์เสียงที่ Asterisk ไม่มีให้ เช่นเสียงภาษาไทย ก็ต้องอัดเองแล้วแปลงเองครับ อัดให้อยู่ในรูปแบบไฟล์ Windows PCM, 8000 Hz, 16 Bit, Mono แต่งเสียงให้เรียบร้อย แล้วค่อยใช้โปรแกรมแปลงไปเป็น .gsm, .ulaw, .ulaw, .g729, .g723 ครับ
บทความที่เกี่ยวข้อง
ติดตั้ง G.723, G.729 ให้ Asterisk
เทคนิคการเขียน Asterisk Dialplan คำสั่ง Background() และ Playback()
การทำ Codec Transcoding, Transparent ของ Asterisk
ไฟล์เสียง Asterisk Core Sounds
ไฟล์เสียง Asterisk Extra Sounds
เว็บไซต์ Text-to-Speech
เว็บไซต์ Text-to-Speech ภาษาไทย
เทคนิคการใช้โปรแกรม Cool Edit Pro แต่งเสียงก่อนอัพโหลดเข้า Asterisk/Elastix
เทคนิคการทำไฟล์เสียงภาษาไทยด้วย Text To Speech