nomoVM
Guides

AI AMD without new infrastructure: a practical guide for IT and ops

Most answering machine detection upgrades turn into infrastructure projects: new servers, new gateways, a carrier change or a full platform migration. It does not have to be that way. This guide shows how to add AI AMD without new infrastructure, what actually changes on your dialer, and a checklist IT and operations can work through before, during and after the switch.

An existing dialer and carrier unchanged, with one script added that streams answered audio to nomoVM

Why AMD upgrades usually turn into infrastructure projects

Ask a call center why it still runs the AMD that shipped with its dialer, and the answer is rarely "it works well". More often it is "replacing it is a project". Better answering machine detection tends to arrive bundled with something larger:

  • New servers or appliances. Detection software that must run next to the dialer needs its own capacity, monitoring, patching and someone on call when it fails.
  • New gateways or media boxes inserted into the call path, which means re-routing trunks and testing every route again.
  • A carrier change. Some carriers sell detection, but only on their own network or their own API.
  • A platform migration. CPaaS detection, such as Twilio's or Telnyx's, works on calls you place through their API. Twilio enables it with a parameter when the call is created through its API. Telnyx offers it through Call Control, not on calls your own Asterisk places over a Telnyx SIP trunk. To use either, you move call control off your dialer.

Each of these touches the parts of the operation that are most expensive to change: the call path, the carrier contract, the dialer itself. That is why many centers stay on timing-based AMD that hangs up on live people, or turn AMD off entirely and let agents listen to voicemail.

What actually changes with nomoVM

nomoVM takes a different route. Your dialer already has the audio of every answered call. It only needs to send the first seconds of it somewhere that can tell a person from a recording, and get one answer back. That is the whole integration.

ComponentChanges?Detail
Dialer serversOne script addednomovm.agi.py on VICIdial, GoAutoDial and Asterisk 13+; nomovm_amd.lua plus mod_audio_stream on FreeSWITCH
HardwareNoDetection is hosted
SIP carrier and trunksNoWorks with any SIP carrier
Call routing and caller IDsNoCalls are placed exactly as before
VICIdial campaign logicOne settingRouting Extension 8369 becomes 8370
Agents and agent screensNoThey just get fewer voicemails
FirewallUsually noOutbound HTTPS on port 443 to amd.nomovm.com

On VICIdial, the script sets the same AMDSTATUS variable that Asterisk's AMD() sets, so VD_amd.agi keeps working unchanged. Your "AMD send to VM exten" setting and voicemail messages keep working too. The VICIdial AMD page explains how it slots in.

On FreeSWITCH, "no new infrastructure" means no new servers, but you do load one open-source module, mod_audio_stream, alongside the standard mod_lua. Details are on the FreeSWITCH AMD page.

The 10-minute path on VICIdial

For a VICIdial or GoAutoDial server, the integration takes about 10 minutes for someone with root on the box:

  1. Create a key

    Sign up and create one WS key per dialer server, named after the server.

  2. Copy the script

    Put nomovm.agi.py in /var/lib/asterisk/agi-bin/ and chmod 755 it. It needs Python 3.6 or newer and only the standard library; ViciBox 11 and 12 already have Python 3.

  3. Test the connection

    python3 nomovm.agi.py --test wss://amd.nomovm.com/ YOUR_KEY should print AMDSTATUS=MACHINE AMDCAUSE=SILENCE in about 2 seconds.

  4. Add extension 8370

    A copy of your 8369 AMD extension with one extra line for nomoVM and a fallback to AMD():

    exten => 8370,1,AGI(agi://127.0.0.1:4577/call_log)
    exten => 8370,n,EAGI(nomovm.agi.py,wss://amd.nomovm.com/,YOUR_KEY,4500)
    exten => 8370,n,GotoIf($["${AMDSTATUS}" = "FALLBACK"]?native)
    exten => 8370,n(vdamd),AGI(VD_amd.agi,${EXTEN})
    exten => 8370,n,AGI(agi-VDAD_ALL_outbound.agi,NORMAL-----LB-----${CONNECTEDLINE(name)})
    exten => 8370,n,Hangup()
    exten => 8370,n(native),AMD(2000,2000,1000,5000,120,50,4,256)
    exten => 8370,n,Goto(vdamd)
  5. Switch one campaign

    Change that campaign's Routing Extension from 8369 to 8370. Leave every other setting alone.

The full walkthrough, with troubleshooting for each step, is in the VICIdial AMD setup guide.

Safe fallback and one-setting rollback

Operations teams care less about how fast something installs than about what happens when it breaks. nomoVM is built so that a failure costs you nothing worse than what you have today.

FALLBACK runs your old AMD

If nomoVM cannot judge a call (wrong key, plan limit, account suspended, service unreachable), the script sets AMDSTATUS=FALLBACK before any audio is used. The dialplan jumps to AMD(), and the call is handled by Asterisk's own detection, just like yesterday. Fallback calls are never billed. AMDCAUSE tells you which reason applied: AUTH, SUSPENDED, QUOTA or NOSERVER.

Uncertain calls stay away from agents

If something goes wrong after streaming has started, such as a timeout, the call is treated as MACHINE with cause UNKNOWN. Only a confirmed person reaches an agent. The client timeout is 4500 ms, which covers the normal 2 second decision, the 3.2 second maximum for unclear calls and network time.

Rollback is one setting

On VICIdial, set the campaign's Routing Extension back to 8369. Extension 8370 can stay in the dialplan, unused. On FreeSWITCH, originate calls into your previous extension again. There is no data migration to reverse and no carrier ticket to raise.

Checklist for IT and operations

Before you start

  • Confirm dialer versions: Asterisk 13 or newer for VICIdial, GoAutoDial and plain Asterisk; for FreeSWITCH, confirm you can install and load mod_audio_stream and that its license (AGPL-3.0 with a FreeSWITCH linking exception) suits you.
  • Check Python 3.6+ on each Asterisk-based dialer: python3 --version.
  • Confirm outbound HTTPS on port 443 from each dialer to amd.nomovm.com, and that DNS resolves it.
  • Pick one campaign with steady volume for the first test.
  • Note that campaign's current numbers: agent-connected calls, AA (answering machine) counts and drop rate, so you have a baseline.

Security and data

  • Audio travels over an encrypted WebSocket; the key is sent in an Authorization: Bearer header, never in a URL.
  • Only the first seconds of each answered call are sent, until the verdict.
  • Decide on recordings: on or off, kept for 1 to 90 days, deletable at any time.
  • Use one key per server so you can revoke one without touching the others.

Rollout

  • Run the --test command on each server before touching the dialplan.
  • Reload the dialplan and confirm the extension exists: asterisk -rx "dialplan show 8370@default".
  • Switch one campaign, watch the dashboard for a day, then compare with your baseline.
  • Label a sample of calls by ear to check accuracy on your own traffic.
  • Switch the remaining campaigns once the numbers hold.

Ongoing

  • Watch for FALLBACK in the logs: it means a key, plan or network problem, not a detection problem.
  • Use the dashboard's call logs, playback and CSV export when agents report odd calls.
  • Check usage against your plan's monthly calls.

Questions to ask before any AMD upgrade

Whether you choose nomoVM or something else, these questions separate a contained change from an infrastructure project. Put them to any vendor, and to your own team:

  1. What has to be installed, and where? A script on existing servers is a different conversation from new machines in your rack or your cloud account.
  2. Does the call path change? If trunks must be re-pointed or calls must pass through a new box, every route needs retesting.
  3. Do we have to change carrier or place calls through a new API? If yes, you are planning a migration, not an AMD upgrade.
  4. What happens to a call when the detection service fails? The answer should be "it is handled the way it is today", not "it is dropped" or "it goes to an agent unchecked".
  5. How do we roll back, and how long does it take? Minutes and one setting is the bar to aim for.
  6. Which error numbers do you publish? Ask for both: how many live people reach agents, and how many agent calls are really people. nomoVM publishes both on its accuracy page.
  7. How is it priced as we grow? Per-server, per-agent and per-port fees turn every new dialer into a purchasing decision.

If the answers point to new hardware, a new carrier or a new platform, budget for that project honestly. If they point to one script and one setting, you can test it this week.

What it costs compared with a migration

Because nothing new is deployed, the cost is the subscription. One billable call is one verdict on an answered call; unanswered calls and fallback calls are free. There are no per-server or per-agent fees, and you can connect as many servers as you like.

For comparison, here is the AMD fee alone at public list prices from November 2026 (check current pricing), excluding call minutes:

Answered calls / monthTwilio AMDTelnyx premiumTelnyx standardnomoVM
1,000,000$7,500$6,500$2,000$99 (Starter)
3,000,000$22,500$19,500$6,000$199 (Growth)
10,000,000$75,000$65,000$20,000$499 (Scale)

And the CPaaS figures assume you have already moved your calls onto their APIs. The free plan covers 30,000 calls a month with a hard limit and no card, which is enough to test a campaign properly. See pricing or estimate your own numbers with the ROI calculator.

The fastest way to judge it is to try it on one campaign. Create a free account, follow the setup guide, and keep your carrier, servers and agents exactly as they are.

Frequently asked questions

Do I need new servers or hardware to use nomoVM?

No. nomoVM is hosted. On VICIdial, GoAutoDial and Asterisk you add one script to the dialer servers you already run. On FreeSWITCH you add one open-source module, mod_audio_stream, and one Lua script.

Do I have to change my SIP carrier?

No. nomoVM listens to audio your dialer already has, so it works with any SIP carrier. Your carrier, routing, caller IDs and agents stay as they are.

What network access does the dialer need?

Outbound HTTPS on port 443 to amd.nomovm.com. Audio travels over an encrypted WebSocket, and the key is sent in an Authorization header, not in the URL.

What happens if nomoVM is down or my key is wrong?

The script returns FALLBACK before any audio is used. On VICIdial and Asterisk the dialplan then runs Asterisk's own AMD() for that call, exactly as before. Fallback calls are never billed.

How do I roll back on VICIdial?

Set the campaign's Routing Extension back from 8370 to 8369. Nothing else was changed, so the campaign is back on its previous AMD immediately.

How long does the integration take?

About 10 minutes per dialer for someone with root access: create a key, copy the script, test it, add one extension and switch one campaign.

Stop sending voicemail to your agents

30,000 calls a month free. No card, no setup fee. Your dialer falls back to Asterisk AMD() on its own if anything goes wrong.