DEV Community

Jason Shouldice
Jason Shouldice

Posted on • Originally published at vicistack.com

VICIdial AMD: What Nobody Tells You About Answering Machine Detection

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)
Enter fullscreen mode Exit fullscreen mode

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)