Look, I've spent way too many late nights staring at AMD logs. VICIdial's Answering Machine Detection is one of those features that sounds simple — detect voicemails, skip them, save agent time. In practice it's a mess. Here's what I've learned running it across dozens of deployments.
The Algorithm Is Dumb. Like, Really Dumb.
VICIdial's AMD (app_amd.c in Asterisk) is a two-state finite state machine. It processes 20ms audio frames at 8kHz. No ML, no AI, no neural nets. Just a silence detector with a word counter bolted on.
It flips between SILENCE and WORD states. Counts transitions. Measures durations. Then makes a call based on whichever threshold hits first:
- INITIALSILENCE — nobody spoke within 2 seconds. Probably voicemail.
- MAXWORDS — heard 4+ voice segments. Sounds like a greeting listing options.
- LONGGREETING — voice went on too long. Voicemail.
- HUMAN — short utterance + silence. Someone said "Hello?" and waited.
- NOTSURE/TOOLONG — couldn't decide in 5 seconds. This is where things get ugly.
The defaults were calibrated on Asterisk 1.4/1.8 era calling patterns. Voicemail greetings in 2026 sound different. Carriers behave differently. The whole audio landscape shifted and the algorithm didn't.
The Dialplan Line Nobody Understands
exten => 8369,n,Playback(sip-silence)
This plays 250ms of silence to "prime" the audio channel. Without it, 40%+ of your calls return NOAUDIODATA — AMD gets literally zero audio frames. If you're seeing high NOAUDIODATA rates, try running this line twice. Seriously.
AMDMINLEN: Stop Burning Your DIDs
When AMD correctly catches a voicemail and hangs up, the call lasts 2-4 seconds. Carriers track Short Duration Percent. Too many short calls = degraded routing, higher rates, or they drop you entirely.
Fix: add Set(__AMDMINLEN=7) before the Dial line in your carrier entry. Keeps the call alive 7 seconds minimum. Doesn't waste agent time — just holds the line silently. Non-optional in 2026 if you care about your number reputation.
AMD Agent Route Options: The Feature Nobody Knows Exists
Default VICIdial routes both HUMAN and NOTSURE calls to agents. So when AMD can't decide after 5 seconds of dead air... it sends the call to an agent anyway. Customer's been sitting in silence for 5+ seconds. Great first impression.
SVN 3200+ added Settings Containers for AMD routing. At minimum, block NOTSURE-NOAUDIODATA. Strongly recommend also blocking NOTSURE-TOOLONG. Those calls were already dead before they hit your agent.
iOS 26 Is an Extinction Event
Apple's call screening in iOS 26 answers calls from unknown numbers automatically. Plays a prompt: "Please state your name and reason for calling." AMD hears this and thinks it's a voicemail greeting — long voice segment, multiple words, silence while waiting for response.
Result: AMD classifies real humans as MACHINE. Hangs up. The iPhone owner never knew you called.
With 59% US market share and 70%+ iOS adoption within 6 months of release, this isn't theoretical. Traditional AMD cannot distinguish between an iOS screening prompt and a voicemail greeting. Full stop.
When to Kill AMD Entirely
Honest take: set your dial timeout to 22-24 seconds. Most voicemail picks up at 24-25 seconds. Hang up before it answers. No AMD, no false positives, no dead air, no FCC abandonment risk.
AMD makes sense if you're pushing 40%+ voicemail rates with 20+ agents and can tolerate 20-30% false positives. Otherwise, train your agents to disposition fast and skip the headache.
I wrote up the full technical deep dive with dialplan code, Asterisk version comparisons, and the economic math at vicistack.com/blog/vicidial-amd-guide. Fair warning, it's 22 minutes of reading. But if you're running AMD in production, you probably need all of it.
Top comments (0)