Fermin Perdomo

Senior Full Stack Engineer | PHP | JavaScript

Outbound AI Agents with VICIdial + Ultravox

Fermin Perdomo
September 23, 2025

I’ve been experimenting with combining VICIdial (classic Asterisk-based dialer) with Ultravox (speech-language model for real-time voice AI). The goal: let the dialer place calls, route live answers to an AI bot, and then transfer to a human closer when needed.

Most call centers still run VICIdial, one of the most reliable dialers out there. But what if every live answer could be handled first by an AI agent—qualifying, answering FAQs, even delivering compliance lines—before a closer picks up?

That’s exactly what I’ve been testing: VICIdial + Ultravox.

Here’s how it works:

  1. VICIdial dials the lead, as usual.
  2. Instead of sending a live answer to a human right away, the call goes to an AI voice bot (Ultravox).
  3. The bot engages the customer in real time—no awkward lag.
  4. When ready, the call is seamlessly transferred to a sales agent.

Benefits for call centers:

  • ✅ Agents focus only on high-value conversations
  • ✅ Consistent compliance / script delivery
  • ✅ Lower cost per call with higher throughput
  • ✅ 24/7 coverage for first-touch conversations

If your contact center is running on VICIdial, this is a way to bring next-gen AI voice into your existing infrastructure—without ripping out what already works.

Would you try an AI front-end for your outbound campaigns?

 Integrating VICIdial with Ultravox (AI Bot Frontend)

I’ve been building a bridge between VICIdial and Ultravox to run outbound AI phone agents. The goal: VICIdial dials, Ultravox handles the conversation, then transfers to a closer.

🔗 Call Flow

  • VICIdial campaign → Remote Agent → Asterisk Dialplan
  • Dialplan uses ExternalMedia() to stream RTP to a Node.js gateway
  • Gateway converts G.711 ↔ PCM16 and streams audio to Ultravox via WebSocket
  • Ultravox bot replies with text/speech → played back to the customer
  • On transfer intent, gateway uses Asterisk AMI Redirect → VICIdial ingroup

📝 Dialplan Snippet

[ultravox-outbound]
exten => 7000,1,Answer()
 same => n,Set(CHANNEL(audio_read_format)=ulaw)
 same => n,Set(CHANNEL(audio_write_format)=ulaw)
 same => n,ExternalMedia(format=ulaw, direction=both, \
      remote_host=10.0.0.50, remote_port=40000, codec=ulaw)
 same => n,ConfBridge(7000)
 same => n,Hangup()

💻 Gateway Highlights

  • Listens for RTP from Asterisk
  • Sends audio frames to Ultravox streaming API
  • Uses TTS (Polly/ElevenLabs) for bot replies back into the call
  • Executes AMI Redirect to drop caller into a live ingroup when ready

Why Ultravox?
Unlike classic pipelines (ASR → LLM → TTS), Ultravox processes speech directly, keeping latency low and conversations fluid—perfect for outbound bots.

Next step: add RAG knowledge bases so the bot can pull live product info, and multilingual support for English/Spanish campaigns.


Reactions

Loading reactions...
Log in to react to this post.

Comments

Please login to leave a comment.

Newsletter