FreeSWITCH answering machine detection with VM Hunter: a Lua script forks the callee's audio to a speech-based detector and sets AMDSTATUS and AMDCAUSE on the channel, with a drop-in dialplan that routes people, machines and call screening.
FreeSWITCH has no equivalent of Asterisk's app_amd. What it offers is mod_avmd, which detects the voicemail beep, and the older mod_vmd, which does the same with a different method. Both answer the question "has the beep played yet", which is useful for timing a message drop and useless for the question a dialer asks at answer: is this a person?
VM Hunter answers that question from the words. It transcribes the first two seconds, recognises voicemail wording, carrier prompts, IVRs and call screening, and runs tone analysis for beeps, SIT tones and silence. The FreeSWITCH integration is a Lua script and an XML dialplan include.
| mod_avmd / mod_vmd | VM Hunter | |
|---|---|---|
| Question answered | Has a voicemail beep played? | Is a person on the line right now? |
| Decides at | Whenever the beep arrives, often 10 to 30 s in | About 2 s after answer |
| Live person | No verdict; the call simply never beeps | HUMAN, usually within 2 s |
| Voicemail greeting | Detected only when the beep plays | MACHINE from the wording, before the beep |
| Carrier prompts, IVR, call screening | Not detected | Recognised and labelled |
| Audit | Event log only | Transcript, reason and audio for every call |
vmhunter_amd extension, so the script runs the moment the callee answers.uuid_audio_fork (or uuid_audio_stream) to VM Hunter with the config frame as metadata, and waits for the verdict event.AMDSTATUS, AMDSTATUS_RAW and AMDCAUSE, then the dialplan transfers to vmhunter_route.vmhunter_route sends screened calls to an intro and an agent, people to vmhunter_HUMAN (your queue or bridge) and machines to vmhunter_MACHINE.Install steps and the originate string are in the FreeSWITCH guide. The script and dialplan are on GitHub under the MIT licence.
The script sets a fail-safe verdict before it does anything else, so a call always has a routable AMDSTATUS even if the module is missing, the key is wrong or the server cannot be reached. The default treats a failure as MACHINE; set FAILED_AS to HUMAN if you would rather connect the call than drop it.
The free plan includes 5,000 calls a month, enough to run VM Hunter next to your current AMD for a day and compare the dispositions. No card needed.