Kr@z7_&_U3vNtv_$>

Xử lý tập tin âm thanh cho Asterisk

Posted in Asterisk by krazv7rvn9 on 06/06/2009

Trên Asterisk, ta có ứng dụng Record để ghi âm tập tin dưới dạng .raw. Đây là định dạng mặc định mà Asterisk sử dụng cho các ứng dụng Playback, Background hay Read.

Tuy nhiên rất hiếm khi ta sử dụng ứng dụng này để ghi âm : phải khai báo quá nhiều trong dialplan, rồi kết nối với SIP phone… Ngoài ra, Asterisk không phải là một chương trình xử lý âm thanh, nên file ghi âm ghi được tuy tương thích với Asterisk, nhưng khó xử lý (thêm hiệu ứng, tăng giảm volume cho phù hợp, lồng nhạc đệm…). Rõ ràng, với những file nhạc hay file lời chào phức tạp, sử dụng Adobe Audition, Jet Audio hay Audacity để xử lý sẽ dễ dàng hơn nhiều.

Đối với mạng điện thoại, dữ liệu truyền đi ở băng thông 0 – 8000 Hz. Tuy nhiên, băng thông thì là vậy, mà dữ liệu tiếng nói thực sự thì chỉ ở khoảng 300 – 3300 Hz (giọng nói của người). Vì vậy, nếu bạn đem một tập tin MP3 128Kbps cho Asterisk phát lại, bạn sẽ hoàn toàn thất vọng vì chất lượng âm thanh rất tệ. Nhiễu tần số thấp, nhiễu tần số cao, méo tiếng. Hơn nữa, MP3 là một định dạng có bản quyền, mà Asterisk lại là Open source. Nên âm thanh phát lại nghe bé tẹo (không thể mong chờ gì hơn – module hỗ trợ MP3 cho Asterisk được lấy từ gói asterisk-addons). Hãy làm một bài test nho nhỏ:

  1. Mở Audacity ra. Nó là Open source. Hỗ trợ MP3 (với gói liblame), WAV, ULAW và OGG.
  2. Dùng SHIFT+CTRL+I hoặc chọn File → Import → Audio. Chọn một tập tin MP3 bạn thích. Audacity nhập nó vào trong cửa sổ chính.
  3. Chọn Track → Stereo to Mono để chuyển chế độ âm thanh từ stereo sang mono.
  4. Chọn Effect → Normalize để tăng tối đa âm lượng cho dải âm thanh, đồng thời cân bằng biên độ âm.
  5. Trong ô Project Sample Rate ở phía dưới của cửa sổ Audacity, hãy chọn 8000 Hz.
  6. Chọn File → Export để xuất dự án ra tập tin âm thanh. Trong ô Save file, ở góc dưới bên phải, ta sẽ thấy ô Format. Hãy lặp lại bước này nhiều lần, để xuất tập tin ra dưới dạng .wav, .mp3 và .ogg
  7. Đóng Audacity. Đổi tên tập tin thành filename, và đưa vào thư mục có tên giống phần mở rộng của tập tin, trong sounds. Ví dụ, /var/lib/asterisk/sounds/testsounds/wav/filename.wav
  8. Chép các tập tin vừa tạo vào các thư mục khác nhau trên máy chủ Asterisk và thực hiện dialplan như sau:

;========= /etc/asterisk/extension.conf ==========

[testsoundfiles]

exten => 1000,1,Answer

exten => 1000,n,Wait(1)

exten => 1000,n,Playback(digits/1)

exten => 1000,n,Playback(testsounds/wav/filename)

exten => 1000,n,Wait(1)

exten => 1000,n,Playback(digits/2)

exten => 1000,n,Playback(testsounds/mp3/filename)

exten => 1000,n,Wait(1)

exten => 1000,n,Playback(digits/3)

exten => 1000,n,Playback(testsounds/ogg/filename)

exten => 1000,n,Hangup

Giờ ta khai 1 tài khoản SIP, hoặc IP Phone với context=testsoundfiles, bấm phím 1000. Đoạn mã trên sẽ phát lần lượt các file âm thanh xuất từ Audacity. Hãy nghe và so sánh chất lượng nhé. Bạn sẽ thấy file wav là tốt nhất.

Tôi đã làm thử với 8 định dạng khác nhau: mp3, wav, sln, gsm, alaw, ulaw, vox, ogg. Kết quả thật bất ngờ: vox là định dạng cho kết quả khả quan nhất. Tuy nhiên, để encode ra vox cũng không phải là chuyện dễ dàng gì…

OK, đi vào vấn đề chính. Làm sao để convert từ 1 tập tin MP3 hoặc WAV (hai định dạng phổ biến nhất hiện nay để lưu trữ các file ghi âm – đơn giản vì hơn 90% người dùng máy tính đều dùng Windows :( ( ). Trên Linux ta có 2 công cụ rất mạnh để làm việc này: FFMPEG và SoX.

Trên cửa sổ dòng lệnh của Asterisk, gõ lệnh

CLI> core show file formats

Format Name Extensions

------ ---- ----------

slin mp3 mp3

gsm wav49 WAV|wav49

slin wav wav

adpcm vox vox

slin16 sln16 sln16

slin sln sln|raw

g722 g722 g722

ulaw au au

alaw alaw alaw|al

ulaw pcm pcm|ulaw|ul|mu

slin ogg_vorbis ogg

ilbc iLBC ilbc

h264 h264 h264

h263 h263 h263

gsm gsm gsm

g729 g729 g729

g726 g726-16 g726-16

g726 g726-24 g726-24

g726 g726-32 g726-32

g726 g726-40 g726-40

g723 g723sf g723|g723sf

Những định dạng được tô đậm ở trên là những định dạng mà FFMPEG và SoX hỗ trợ để convert từ MPEG 3 sang.

Lưu ý là, trên CentOS, RHEL, và thậm chí cả Debian, SoX (có trong repository của RPMForge) không hỗ trợ đọc định dạng MP3. Vì vậy, ta chỉ có thể dùng FFMPEG (cũng trên RPM Forge) để convert từ MP3 sang WAV, sau đó từ WAV sang các định dạng khác bằng SoX. Nhưng FFMPEG lấy mẫu kém hơn nhiều, và không có các effect như SoX (ta sẽ nói về phần này sau).

Chỉ riêng trên Ubuntu, SoX được compile với liblame, nên hỗ trợ định dạng MP3 (bạn phải cài thêm gói libsox-fmt-all để thêm hỗ trợ mp3, gsm, flac, ogg, ao, oss ffmpeg cho SoX). Tuy nhiên hiện giờ, Ubuntu Server chưa được sử dụng nhiều (vì Ubuntu là một distro hướng người dùng cuối?).

Để chuyển MP3 sang WAV với FFMPEG, ta dùng lệnh sau:

ffmpeg -i <filename>.mp3 -ac 1 -ar 8000 -ab 64000 -acodec [adpcm_ms|pcm_alaw|pcm_ulaw] <filename>.wav

Tuy nhiên, FFMPEG không có hiệu ứng resample, nên khi convert từ MP3 128Kbps sang WAV 8Kbps, chất lượng âm thanh bị giảm đáng kể, đồng thời nhiều chỗ bị méo tiếng. Tôi thực sự không khuyên bạn dùng cách này. Nếu chỉ có FFMPEG, bạn buộc phải làm theo cách này. Không còn gì khác.

Nhưng nếu bạn có cả FFMPEG và SoX thì sao? Hãy làm như sau:

  1. Convert từ MP3 sang WAV mono có cùng tần số lấy mẫu và định dạng bit để giữ nguyên chất lượng của file MP3. Nếu đã có WAV rồi thì bỏ qua bước này nhé:
    ffmpeg -i <filename>.mp3 -ac 1 <filename>.wav
  2. Convert tiếp file WAV vừa lấy được bằng SoX để tạo ra định dạng phù hợp, với tần số chuẩn và thêm các hiệu ứng cho tập tin. Bạn có thể chọn 1 trong các định dạng vox hay sln (chất lượng phù hợp nhất cho mạng PSTN), wav (dễ phát lại, tương thích tốt nhất với Windows), ogg hoặc gsm (phù hợp với dân Linux), ulaw, alaw (nếu bạn dùng codec này cho IP Phone hoặc Softphone của mình). Chọn câu lệnh phù hợp với nhu cầu của bạn:
  • VOX: sox <filename>.wav -r 8000 -s -w -c 1 <filename>.vox
  • WAV: sox <filename>.wav -r 8000 -s -w -c 1 <filename>.wav
  • SLN: sox <filename>.wav -r 8000 -s -w -c 1 <filename>.raw
  • GSM: sox <filename>.wav -r 8000 -s -w -c 1 <filename>.gsm
  • ALAW: sox <filename>.wav -r 8000 -s -w -c 1 <filename>.al
  • ULAW: sox <filename>.wav -r 8000 -s -w -c 1 <filename>.au
  • OGG: sox <filename>.wav -r 8000 -s -w -c 1 <filename>.ogg

Với SoX, ngoài việc thay đổi tần số mẫu, số kênh, ta còn có thể áp dụng một số hiệu ứng âm thanh để tinh chỉnh tập tin của mình. Nếu tập tin của bạn là một bài hát 128Kbps, hãy thêm vào cuối dòng lệnh sox ở trên chuỗi sau: resample -ql highpass 300 lowpass 3300. Câu lệnh này yêu cầu SoX loại bỏ các tần số âm thanh dưới 300 Hz và trên 3300 Hz, để phù hợp nhất với âm thoại. Ví dụ, với file .vox, câu lệnh đầy đủ sẽ là:

sox <filename>.wav -r 8000 -s -w -c 1 <filename>.vox resample -ql highpass 300 lowpass 3300

Và cuối cùng, để cài đặt SoX và FFMPEG trên server Linux, ta dùng các lệnh sau:

  • CentOSRHEL: Thêm repository RPM Forge vào. Chạy lệnh sau:
    yum install ffmpeg sox

    • Red Hat Enterprise Linux 5 / i386:
      rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.i386.rpm
    • Red Hat Enterprise Linux 5 / x86_64:
      rpm -Uhv http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS//rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm
    • Red Hat Enterprise Linux 4 / i386:
      rpm -Uhv http://apt.sw.be/redhat/el4/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.el4.rf.i386.rpm
    • Red Hat Enterprise Linux 4 / x86_64:
      rpm -Uhv http://apt.sw.be/redhat/el4/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el4.rf.x86_64.rpm
    • Red Hat Linux 9 / i386:
      rpm -Uhv http://apt.sw.be/redhat/9/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.rh9.rf.i386.rpm
    • Red Hat Linux 7.3 / i386:
      rpm -Uhv http://apt.sw.be/redhat/8.0/en/i386/rpmforge/RPMS/rpmforge-release-0.3.6-1.rh7.rf.i386.rpm
  • UbuntuDebian: Thêm repository của HanoiLUG (http://virror.hanoilug.org) vào và chạy lệnh sau:
    apt-get install ffmpeg sox

    • /etc/apt/sources.list cho Debian GNU/Linux “Etch” 4.0:
      deb http://virror.hanoilug.org/debian/archive etch main contrib non-free
      deb http://virror.hanoilug.org/debian/security etch/updates main contrib non-free
      deb http://virror.hanoilug.org/debian/volatile etch/volatile main contrib non-free
      deb http://virror.hanoilug.org/debian/backports etch main contrib non-free
    • /etc/apt/sources.list cho Debian GNU/Linux “Lenny” 5.0:
      deb http://virror.hanoilug.org/debian/archive lenny main contrib non-free
      deb http://virror.hanoilug.org/debian/security lenny/updates main contrib non-free
      deb http://virror.hanoilug.org/debian/volatile lenny/volatile main contrib non-free
      deb http://virror.hanoilug.org/debian/backports lenny main contrib non-free
    • /etc/apt/sources.list cho Ubuntu “Hardy Heron” 8.04.2 LTS :
      deb http://virror.hanoilug.org/ubuntu/archive hardy main restricted universe multiverse
      deb http://virror.hanoilug.org/ubuntu/archive hardy-updates main restricted universe multiverse
      deb http://virror.hanoilug.org/ubuntu/archive hardy-backports main restricted universe multiverse
      deb http://virror.hanoilug.org/ubuntu/security hardy-security main restricted universe multiverse
      deb http://virror.hanoilug.org/ubuntu/medibuntu hardy free non-free
      deb http://virror.hanoilug.org/ubuntu/canonical hardy partner
      deb http://virror.hanoilug.org/ubuntu/hanoilug hardy contrib import
Tagged with: , , , ,

[HOWTO] Cài đặt Asterisk 1.6 trên Ubuntu

Posted in Asterisk by krazv7rvn9 on 03/06/2009

Các lệnh để bạn cài đặt Asterisk 1.6 trên Ubuntu Linux:

## Build the DAHDI kernel modules, for MeetMe function

DAHDI là tên gọi mới của module Zaptel trên Asterisk 1.4.x, để điều khiển các card Digium (dành cho cổng FXO, FXS và E1/T1). Nếu bạn muốn dùng chức năng Conference của Asterisk, bạn phải cài đặt DAHDI hoặc Zaptel để nó load module dahdi_dummy hay zaptel_dummy vào trong kernel.

Để cài đặt DAHDI, ta phải có gói header của nhân linux đang dùng, cùng với gói build-essential.

$> apt-get install linux-headers-`uname -r` build-essential
$> wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
$> tar xzvf dahdi-linux-complete-current.tar.gz
$> cd dahdi-linux-xxxx
$> make
$> make install

Để cài đặt Asterisk, ta phải cài thêm gói libncurses-dev, libeditline, libnewt

## For generate configuration menu
$> apt-get install libncurses-dev libeditline0 libeditline-dev libedit-dev libnewt-dev

Ngoài ra, bạn cần có thêm các gói sau để có thêm lệnh SendFAX và ReceiveFAX:

## For FAX
$> apt-get install libspandsp-dev

Để có codec SpeeX, cài thêm 2 gói :

## For SpeeX
$> apt-get install libspeex-dev libspeexdsp-dev

Còn để có thể ghi âm hay đọc định dạng Ogg Vorbis – định dạng mở thay thế cho MP3, ta phải cài thêm gói libvorbis-dev nữa:

## For Ogg Vorbis Format
$> apt-get install libvorbis-dev

Cuối cùng là thực hiện biên dịch và cài đặt.

## Run the configure script
$> wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.6.1-current.tar.gz
$> tar xzvf asterisk-1.6.1-current.tar.gz
$> cd asterisk-1.6.1-xxx
$> ./configure
$> make menuselect
$> make install
$> make config
$> make samples

Cài đặt thêm gói Asterisk Addons để sử dụng kênh H.323, format MP3 và ghi CDR vào CSDL MySQL.

## Install asterisk addons
$> wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-addons-1.6.0-current.tar.gz
$> tar xzvf asterisk-addons-1.6.0-current.tar.gz
$> cd asterisk-addons-1.6.0-xxx
$> apt-get install libmysqlclient16-dev
$> make
$> make menuselect
$> make install
$> make samples

Cuối cùng, cấu hình Asterisk chạy dưới tên người dùng asterisk và nhóm asterisk:

## Create the system group and user
$> groupadd -r asterisk
$> useradd -r -g asterisk asterisk
## Edit the init files
$> vim /etc/asterisk/asterisk.conf
Sửa lại dòng runuser và rungroup thành asterisk.

Đại loại là vậy!!!

Tagged with: , , ,
Follow

Get every new post delivered to your Inbox.