EAGI Audio Capture

God O God,

Why EAGI is made so complex? The audio captured with with the EAGI-perl script on voip-info.org is almost not useful. The clarity of the audio is pathetic. Am i missing something??? I have Digium TDM 12B. I can get calls to my VoIP phone ok thru TDM and asterisk. But when i use EAGI-perl script, neither GSM nor RAW audio file sounds clear. Lot of noise and voice can not even be heard.

Please Help!!!


EAGI-perl script:


Note that this example doesn’t check the results of AGI calls, and doesn’t use

Asterisk::AGI in an attempt to keep it simple and dependency free.

This program is free software; you can redistribute it and/or modify

it under the same terms as Perl itself.

Author: Simon P. Ditner / uc.org/simon


- Create an AGI in /var/lib/asterisk/agi-bin, i.e.: perl.eagi

- Call using EAGI from your dialplan: exten => 100,1,EAGI(perl.eagi)

use warnings;
use strict;

use IO::Handle;

$| = 1; # Turn of I/O Buffering
my $buffer = undef;
my $result = undef;
my $AUDIO_FD = 3; # Audio is delivered on file descriptor 3
my $audio_fh = new IO::Handle;
$audio_fh->fdopen( $AUDIO_FD, “r” ); # Open the audio file descriptor for reading

Skip over the preamble that Asterisk sends this AGI

while( ) {
last if length($
) == 0;

Playback beep

print “STREAM FILE beep “#”\n”; $result = ;

Record 5 seconds of audio at 8,000 samples/second (uses 16 bit integers)

5 seconds x 8000 samples/second x ( 16 bits / 8bits/byte ) = 80000 bytes

my $bytes_read = $audio_fh->read( $buffer, 80000 );

Playback beep

print “STREAM FILE beep “#”\n”; $result = ;

Write the raw audio to a file for later analysis

my $fh;
open( $fh, “>/tmp/recording.raw” );
print $fh $buffer;
close( $fh );

Also convert the raw audio on-the-fly to the GSM format using ‘sox’, so that

we can play it back to the user right now.

open( $fh, “|/usr/bin/sox -t raw -r 8000 -s -w -c 1 - /tmp/recording.gsm” );

| | | | | | |

| | | | | | '-- Write to this file

| | | | | '-- Read from STDIN

| | | | '-- Mono Audio

| | | '-- Samples are words (a word is 2 bytes = 16 bit audio)

| | '-- The audio is signed (32766…-32766)

| '-- The sample rate is 8,000 samples/second

'-- The input format is SLIN, which is ‘raw’ audio

print $fh $buffer;
close( $fh );

Playback /tmp/recording.gsm

print “STREAM FILE /tmp/recording “#”\n”; $result = ;


why use the agi at all? try this…

make a dialplan script which does the following (pesudocode)

write #{DATETIME}and possibly other info to another ${variable}
Record(5 seconds, gsm format, to file ${variable})
Playback(file ${variable})
then if you push 1 it saves it to ${variable}-complete (maybe use system() to rename it)
if you push 2 it deletes the file and goes back to the beginning

Hi IronHelix,

My requirement is to capture the live audio stream and pass on to another system. Similary take the audio from the other side and stream on to the channel.

Please Help!!!


Mark & Kevin,

Can you please help us out on EAGI and audio channel details? What is the point in making a open source software and yet useful features are left un polished? :confused:

I have seen some postings about using EAGI for live audio stream capture but again none of the examples work good.

Please Help!!!

Thanks in advance,