Mod avmd

From FreeSWITCH Wiki
Jump to: navigation, search


Warning

Superseded by https://confluence.freeswitch.org/display/FREESWITCH/mod_avmd

 


Contents

Description

AVMD stands for "Advanced Voice Mail Detection" and mod_avmd is designed to detect the beep sound at the end of voicemail or answering machine greetings. This is useful in cases where you wish to leave a recorded message on the recipient's message system but don't want to have the pregnant pause that is common when using wait_for_silence.

mod_avmd (AVMD) is the second generation Voice Mail Detection, and has a number of enhancements that make it much better at determining a beep. It is intended to replace mod_vmd. It works very similar to mod_vmd with a few exceptions.

  • VMD will listen for and send an event each time it thinks there is a beep. Therefore VMD may send many events while listening to a call.
    • AVMD only sends one event, and then quits. However AVMD is much better at determining correct beep sounds, which means it gives back fewer false positives and more true positives than VMD.
  • VDM events included frequency and duration details for the beep.
    • AVMD does not. [Eric said this about not including frequency and duration in the events, “It saves resources (cpu & memory) and we didn’t need the values.”]


Warning

AVMD (and VMD) are both very CPU intensive. You need to be aware of this fact when using it. It will drastically reduce your call capacity if you do not manage it correctly. On the other hand it is a very useful tool, and if managed properly will be a great aid for calls needing to do Voice Mail Detection.

  • Eric states, "You can expect about ~50 simultaneous instances on an Intel i7 920 CPU."


Usage

For best results in getting accurate detection as well a saving system resources (CPU & memory), you should do the following:

  • Wait until AFTER the call has been answered before starting AVMD. In many cases you may find it best to wait a few seconds after the call is answered before starting AVMD.
    • Starting AVMD before the call is answered will often result in false beeps and wastes CPU resources.
  • Once you have received the AVMD event, you should explicitly stop AVMD, even though it will not return another event.


From mod_event_socket

To start the mod:

api avmd <uuid> start

To stop the mod:

api avmd <uuid> stop

To get mod_avmd events:

event plain CUSTOM avmd::beep

A useful way to start avmd a few seconds after answer. Once you get an answer event, issue this command

api sched_api +3 none avmd <uuid> start

Example Event

Event-Subclass: avmd%3A%3Abeep
Event-Name: CUSTOM
Core-UUID: 3395d705-6571-414d-a38c-fad8b0bdd3e9
FreeSWITCH-Hostname: tpa-es-cos-232
FreeSWITCH-IPv4: 10.50.48.232
FreeSWITCH-IPv6: %3A%3A1
Event-Date-Local: 2010-07-02%2009%3A58%3A01
Event-Date-GMT: Fri,%2002%20Jul%202010%2013%3A58%3A01%20GMT
Event-Date-Timestamp: 1278079081446061
Event-Calling-File: mod_avmd.c
Event-Calling-Function: avmd_process
Event-Calling-Line-Number: 548
Beep-Status: stop
Unique-ID: d6ff2323-d57e-4e7d-b75b-7724d81bb5d9
call-command: avmd


Lua Example

This is an example of a callback in Lua:

local human_detected = false;
local voicemail_detected = false;

function onInput(session, type, obj)
    if type == "dtmf" and obj['digit'] == '1' and human_detected == false then
        human_detected = true;
        return "break";
    end

    if type == "event" and voicemail_detected == false then
        voicemail_detected = true;
        return "break";
    end
end

session:setInputCallback("onInput");
session:execute("avmd","start");


Javascript Example

This is an example of a callback in Javascript:

function onInput(s, type, obj, arg)
{
	try
	{
		if(type == "dtmf")
		{
			console_log("info", "DTMF digit: "+s.name+" ["+obj.digit+"] len ["+obj.duration+"]\n");
		}
		else if(type == "event" && session.getVariable("avmd_detect") == "TRUE")
		{
			console_log("info", "Voicemail Detected\n");
		}
		
	}
	catch(e)
	{
		console_log("err", e + "\n");
	}
	return true;
}

session.answer();
session.execute("avmd", "start");
while(session.ready())
{
	session.streamFile(argv[0], onInput);
}


From Dialplan

Note: all it does is set chan variable ${avmd_detect} to "TRUE" and nothing else, so don't rely on this for acting quickly if a beep is detected.

  <!-- mod_avmd test extension (new mod)-->
  <extension name="avmdtest">
    <condition field="destination_number" expression="^(\d{10})$">
      <action application="answer"/>
      <action application="info"/>
      <action application="avmd"/> <!-- Starts detection on the call. -->
      <action application="sleep" data="25000"/>
      <action application="info"/> <!-- Look for chan var "avmd_detect" here -->
      <action application="avmd" data="stop"/> <!-- Stops detection on the call. -->
      <action application="hangup"/>
    </condition>
  </extension>


Configuration

To compile it simply add this to 'modules.conf':

applications/mod_avmd

And do not forget to rebuild and install:

sudo make sure
sudo make install

To have FreeSWITCH load it on startup simply add this to '/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml':

<load module="mod_avmd"/>


Notes

No voicemail detection can claim to be 100% accurate. The industry standard is 80% detection. This module if used properly should exceed the standard by a very wide margin.


Related