提交 b44b6e5b authored 作者: Piotr Gregor's avatar Piotr Gregor

FS-9564 [avmd]: add lagged detectors

Addition of detectors which skip first few frames
of audio before they start to process it helps
to properly handle some Verizon voicemails.
The result of avmd test using this commit is
OK. All PASS [100]

Thi scommit also resolves:
FS-9588 Add script for outbound avmdy
FS-9589 Add resolution info to events
上级 8e189ed2
......@@ -37,7 +37,7 @@
<!-- required number of consecutive elements in the SMA buffer
without reset. This parameter helps to avoid false beeps, bigger this value is
smaller the probability of getting false detection -->
<param name="sample_n_continuous_streak" value="5"/>
<param name="sample_n_continuous_streak" value="3"/>
<!-- define number of samples to skip starting from the beginning
of the frame and/or after reset has happened. This serves the purpose of skipping first few
......@@ -46,7 +46,7 @@
<param name="sample_n_to_skip" value="0"/>
<param name="require_continuous_streak_amp" value="1"/>
<param name="sample_n_continuous_streak_amp" value="5"/>
<param name="sample_n_continuous_streak_amp" value="3"/>
<!-- define/undefine this to enable/disable simplified estimation
of frequency based on approximation of sin(x) with (x)
......
......@@ -37,7 +37,7 @@
<!-- required number of consecutive elements in the SMA buffer
without reset. This parameter helps to avoid false beeps, bigger this value is
smaller the probability of getting false detection -->
<param name="sample_n_continuous_streak" value="5"/>
<param name="sample_n_continuous_streak" value="3"/>
<!-- define number of samples to skip starting from the beginning
of the frame and/or after reset has happened. This serves the purpose of skipping first few
......@@ -46,7 +46,7 @@
<param name="sample_n_to_skip" value="0"/>
<param name="require_continuous_streak_amp" value="1"/>
<param name="sample_n_continuous_streak_amp" value="5"/>
<param name="sample_n_continuous_streak_amp" value="3"/>
<!-- define/undefine this to enable/disable simplified estimation
of frequency based on approximation of sin(x) with (x)
......
......@@ -324,7 +324,7 @@
<extension name="618"><!-- this BEEP must be DETECETD in detection_mode 1 (FREQ), NOTDETECTED in detection_mode 0 (AMP) and 2 (BOTH) -->
<condition field="destination_number" expression="^(618)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,debug=0,detection_mode=1"/>
<action application="playback" data="tone_stream://L=1;%(1850,1000,1900,2000)" />
<action application="playback" data="tone_stream://L=1;%(1850,1000,1900,1950)" />
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
......@@ -332,7 +332,7 @@
<extension name="619"><!-- this BEEP must be DETECETD in detection_mode 1 (FREQ), NOTDETECTED in detection_mode 0 (AMP) and 2 (BOTH) -->
<condition field="destination_number" expression="^(619)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,debug=0,detection_mode=1"/>
<action application="playback" data="tone_stream://L=1;%(1850,1000,100,1000)" />
<action application="playback" data="tone_stream://L=1;%(1850,1000,200,500)" />
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
......@@ -340,7 +340,7 @@
<extension name="620"><!-- this BEEP must be DETECETD in detection_mode 1 (FREQ), NOTDETECTED in detection_mode 0 (AMP) and 2 (BOTH) -->
<condition field="destination_number" expression="^(620)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,debug=0,detection_mode=1"/>
<action application="playback" data="tone_stream://L=1;%(1850,1000,1000,2000)" />
<action application="playback" data="tone_stream://L=1;%(1850,1000,500,700)" />
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
......@@ -493,7 +493,7 @@
<extension name="718"><!-- this BEEP must be DETECETD in detection_mode 1 (FREQ), NOTDETECTED in detection_mode 0 (AMP) and 2 (BOTH) -->
<condition field="destination_number" expression="^(718)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,debug=0,detection_mode=2"/>
<action application="playback" data="tone_stream://L=1;%(1850,1000,1900,2000)" />
<action application="playback" data="tone_stream://L=1;%(1850,1000,1900,1950)" />
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
......@@ -501,7 +501,7 @@
<extension name="719"><!-- this BEEP must be DETECETD in detection_mode 1 (FREQ), NOTDETECTED in detection_mode 0 (AMP) and 2 (BOTH) -->
<condition field="destination_number" expression="^(719)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,debug=0,detection_mode=2"/>
<action application="playback" data="tone_stream://L=1;%(1850,1000,100,1000)" />
<action application="playback" data="tone_stream://L=1;%(1850,1000,200,500)" />
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
......@@ -509,7 +509,7 @@
<extension name="720"><!-- this BEEP must be DETECETD in detection_mode 1 (FREQ), NOTDETECTED in detection_mode 0 (AMP) and 2 (BOTH) -->
<condition field="destination_number" expression="^(720)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,debug=0,detection_mode=2"/>
<action application="playback" data="tone_stream://L=1;%(1850,1000,1000,2000)" />
<action application="playback" data="tone_stream://L=1;%(1850,1000,500,700)" />
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
......@@ -780,3 +780,61 @@
<action application="hangup"/>
</condition>
</extension>
<extension name="840531400"><!-- obscure voicemail pack 2 -->
<condition field="destination_number" expression="^(840531400)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,detection_mode=2,debug=0"/>
<action application="playback" data="voicemail/8000/2764944714-18-15-bad.wav"/>
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="840531401"><!-- obscure voicemail pack 2 -->
<condition field="destination_number" expression="^(840531401)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,detection_mode=2,debug=0"/>
<action application="playback" data="voicemail/8000/3054957758-18-15-bad.wav"/>
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="840531402"><!-- obscure voicemail pack 2 -->
<condition field="destination_number" expression="^(840531402)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,detection_mode=2,debug=0"/>
<action application="playback" data="voicemail/8000/5044810548-18-15-bad.wav"/>
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="840531403"><!-- obscure voicemail pack 2 -->
<condition field="destination_number" expression="^(840531403)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,detection_mode=2,debug=0"/>
<action application="playback" data="voicemail/8000/5852842171-18-15-bad.wav"/>
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="840531404"><!-- obscure voicemail pack 2 -->
<condition field="destination_number" expression="^(840531404)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,detection_mode=2,debug=0"/>
<action application="playback" data="voicemail/8000/5857330628-18-15-bad.wav"/>
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="840531405"><!-- obscure voicemail pack 2 -->
<condition field="destination_number" expression="^(840531405)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,detection_mode=2,debug=0"/>
<action application="playback" data="voicemail/8000/8702463704-18-15-bad.wav"/>
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
</extension>
<extension name="840531051"><!-- fragment of "Save tonight" by Eagle-Eye Cherry covered by D-Lete-Funk-K -->
<condition field="destination_number" expression="^(840531051)$">
<action application="avmd_start" data="inbound_channel=1,outbound_channel=0,detection_mode=2,debug=0"/>
<action application="playback" data="voicemail/8000/save_tonight_8000.wav"/>
<action application="avmd_stop"/>
<action application="hangup"/>
</condition>
</extension>
#!/usr/bin/perl -w
#brief Call single voicemail available in default dialplan
# and print detection result to the console.
#brief Call single voicemail and print detection result to the console.
#author Piotr Gregor <piotrgregor@rsyncme.org>
#date 15 Sept 2016 02:44 PM
......@@ -74,7 +73,7 @@ sub test_once {
my $uuid = $con->api('create_uuid')->getBody();
my ($time_epoch, $time_hires) = Time::HiRes::gettimeofday();
printf("Calling with uuid [%s] [%s]...\n", $uuid, POSIX::strftime('%Y-%m-%d %H:%M:%S', localtime($time_epoch)), $time_hires);
printf("Calling with uuid [%s] [%s]...\n", $uuid, POSIX::strftime('%Y-%m-%d %H:%M:%S', localtime($time_epoch)));
$con->bgapi(sprintf($originate_string, $uuid));
......
#!/usr/bin/perl -w
#brief Call (possibly) multiple voicemails
# and print detection result to the console.
#author Piotr Gregor <piotrgregor@rsyncme.org>
#date 15 Sept 2016 02:44 PM
use strict;
use warnings;
require ESL;
use POSIX;
use Time::HiRes;
my $host = "127.0.0.1";
my $port = "8021";
my $pass = "ClueCon";
my $extension_base = "sofia/internal/1000\@192.168.1.60";
my $playback = 'local_stream://moh';
my $context = 'default';
#Example:
#my $endpoint = "originate {originator_codec=PCMA,origination_uuid=%s}sofia/gateway/box_b/840534002 \&park()";
my $endpoint = "originate {originator_codec=PCMA,origination_uuid=%s}sofia/gateway/%s/%s \&park()";
my $gateway;
my $dest;
my $callerid;
my $thread_n;
my $idx = 0;
if ($#ARGV + 1 eq 4) {
$gateway = $ARGV[0];
$dest = $ARGV[1];
$callerid = $ARGV[2];
$thread_n = $ARGV[3];
print "Dialing [" .$thread_n ."] calls simultaneously to [" .$gateway ."][" .$dest ."] as [" .$callerid ."]\n";
} else {
die "Please specify gateway, destination number, caller id and number of calls to make\n";
}
my $con = new ESL::ESLconnection($host, $port, $pass);
if (!$con) {
die "Unable to establish connection to $host:$port\n";
}
if ($con->connected()) {
print "OK, Connected.\n";
} else {
die "Connection failure.\n";
}
while($con->connected() && ($idx < $thread_n)) {
call_once($dest, $callerid, $idx);
$idx++;
Time::HiRes::sleep(0.15); # avoid switch_core_session.c:2265 Throttle Error! 33, switch_time.c:1227 Over Session Rate of 30!
}
print "Disconnected.\n\n";
sub call_once {
my ($dest, $callerid, $idx) = @_;
my $uuid =
my $originate_string =
'originate ' .
'{ignore_early_media=true,' .
'originator_codec=PCMA,' .
'origination_uuid=%s,' .
'originate_timeout=60,' .
'origination_caller_id_number=' . $callerid . ',' .
'origination_caller_id_name=' . $callerid . '}';
if(defined($endpoint)) {
$originate_string = '';
$originate_string .= $endpoint;
} else {
$originate_string .= 'loopback/' . $dest . '/' . $context;
$originate_string .= ' ' . '&playback(' . $playback . ')';
}
my $uuid = $con->api('create_uuid')->getBody();
my ($time_epoch, $time_hires) = Time::HiRes::gettimeofday();
printf("[%s]\tCalling with uuid [%s] [%s]... [%s]\n", $idx + 1, $uuid, POSIX::strftime('%Y-%m-%d %H:%M:%S', localtime($time_epoch)), $originate_string);
$con->bgapi(sprintf($originate_string, $uuid, $gateway, $dest));
$con->api('uuid_setvar ' . $uuid .' execute_on_answer avmd_start');
}
#!/usr/bin/perl -w
#brief Test module avmd by calling all voicemails available
# in avmd test suite and print detection results to the console.
#brief Test module avmd by calling voicemails from avmd test suite
# and print detection results to the console.
#author Piotr Gregor <piotrgregor@rsyncme.org>
#details If you are testing serving voicemails from dialplan then avmd
# must be set to inbound mode, either globally (by avmd set inbound
# in fs_cli) or in dialplan settings (<action application="avmd_start"
# data="inbound_channel=1,outbound_channel=0").
# data="inbound_channel=1,outbound_channel=0") or dynamically per call.
#date 15 Sept 2016 03:00 PM
......@@ -114,6 +114,13 @@ my %numbers = (
840531212 => "DETECTED",
840531213 => "DETECTED",
840531214 => "DETECTED",
840531400 => "DETECTED", # obscure voicemails ATT pack
840531401 => "DETECTED",
840531402 => "DETECTED",
840531403 => "DETECTED",
840531404 => "DETECTED",
840531405 => "DETECTED",
840531051 => "NOTDETECTED", # fragment of "Save tonight" by Eagle-Eye Cherry covered by D-Lete-Funk-K
);
my $host = "127.0.0.1";
......@@ -122,7 +129,7 @@ my $pass = "ClueCon";
my $extension_base = "sofia/internal/1000\@192.168.1.60";
my $playback = 'local_stream://moh';
my $context = 'default';
my $context = 'default';
my $endpoint;
my $dest;
my $expectation;
......@@ -162,7 +169,7 @@ $con->events("plain", "CHANNEL_HANGUP");
print "OK.\n\n";
printf("\nRunning [" .keys(%numbers) ."] tests.\n\n");
printf("outbound uuid | destination number | timestamp | expectation | test result\n\n");
printf("outbound uuid | destination number | timestamp | expectation | test result | freq | f-variance | amplitude | a-variance\n\n");
foreach $dest (sort keys %numbers) {
if (!$con->connected()) {
last;
......@@ -182,7 +189,7 @@ sub test_once {
my $originate_string =
'originate ' .
'{ignore_early_media=true,' .
'origination_uuid=%s,' .
'origination_uuid=%s,' .
'originate_timeout=60,' .
'origination_caller_id_number=' . $callerid . ',' .
'origination_caller_id_name=' . $callerid . '}';
......@@ -192,6 +199,11 @@ sub test_once {
my $uuid_in = "";
my $freq = "N/A";
my $freq_var = "N/A";
my $amp = "N/A";
my $amp_var = "N/A";
my $resolution = "N/A";
my $offset = "N/A";
my $idx = "N/A";
if(defined($endpoint)) {
$originate_string .= $endpoint;
......@@ -220,6 +232,11 @@ sub test_once {
if ($avmd_event_type eq 'avmd::beep') {
$freq = $e->getHeader("Frequency");
$freq_var = $e->getHeader("Frequency-variance");
$amp = $e->getHeader("Amplitude");
$amp_var = $e->getHeader("Amplitude-variance");
$resolution = $e->getHeader("Detector-resolution");
$offset = $e->getHeader("Detector-offset");
$idx = $e->getHeader("Detector-index");
}
$outcome = $e->getHeader("Beep-Status");
if ($outcome eq $expectation) {
......@@ -243,6 +260,6 @@ sub test_once {
}
}
}
printf("\t[%s]\t[%s]\t\t[%s]\t[%s]HZ\t[%s]\n", POSIX::strftime('%Y-%m-%d %H:%M:%S', localtime($time_epoch)), $expectation, $result, $freq, $freq_var);
printf("\t[%s]\t[%s]\t\t[%s]\t[%s]HZ\t[%s]\t[%s]\t[%s]\t[%s][%s][%s]\n", POSIX::strftime('%Y-%m-%d %H:%M:%S', localtime($time_epoch)), $expectation, $result, $freq, $freq_var, $amp, $amp_var, $resolution, $offset, $idx);
Time::HiRes::sleep(0.5); # avoid switch_core_session.c:2265 Throttle Error! 33, switch_time.c:1227 Over Session Rate of 30!
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论