The Beginning: An Overpriced, Frustrating Start
I started this project with one goal: to deploy a high-quality, conversational AI voice bot that could handle real interactions, respond naturally, and integrate with my existing systems without costing a fortune. Sounds simple, right? Yeah, not so much.
First, I tested SignalWire’s AI bot—it worked well, but the costs were insane. With ElevenLabs for voice, plus SignalWire’s AI logic, I was looking at $0.50 per minute to run this thing. Even stripping ElevenLabs out, I was still hovering around $0.20 per minute, which wasn’t sustainable.
Next, I tried Google DialogFlow with SignalWire’s One-Click Telephony. On paper, it seemed like a cost-effective solution. But the experience? Garbage. The bot couldn’t handle interruptions, didn’t retain context, and basically functioned as a glorified FAQ system. I even built out 250 intents with variations, hoping to improve things, but the bot still felt robotic and disconnected from real conversation.
That’s when I knew I needed a completely different approach.
The Shift: Open Source + Kubernetes
I already had a Kubernetes cluster running with Rasa, DeepSpeech, and Asterisk, so I decided to build my own AI bot from scratch. The idea:
- Use Rasa for the conversation logic (a real conversational AI, not just a Q&A bot).
- Use DeepSpeech for Speech-to-Text (STT) instead of Google’s overpriced API.
- Use Coqui TTS for natural-sounding speech instead of ElevenLabs.
- Use Asterisk as the PBX to connect my bot to a real phone system.
- Log calls and contacts in GoHighLevel for tracking and CRM integration.
Sounds good, right? Well… I hit a major roadblock.
The Current Nightmare: Asterisk Won’t Deploy
Here’s what I’m staring at when I check my cluster:
kubectl get pods -n ccmschatbot
And the output:
NAME READY STATUS RESTARTS AGE
asterisk-deployment-7cb9d75795-b97kq 0/1 ImagePullBackOff 603 (18d ago) 20d
deployments-etc...
ImagePullBackOff—the dreaded Kubernetes error when it can’t pull an image. I checked my Asterisk deployment and realized the problem: I’m storing all my images on GitLab, but I never properly configured Kubernetes to authenticate and pull from the registry.
The Fix: Pulling Asterisk from GitLab’s Container Registry
Since my Kubernetes cluster isn’t using Docker Hub, I need to configure GitLab’s private container registry so that Asterisk can be pulled correctly.
Step 1: Add GitLab Container Registry Credentials
I created a Kubernetes secret with my GitLab credentials:
kubectl create secret docker-registry gitlab-registry-secret \
--docker-server=registry.gitlab.com \
--docker-username=<your-gitlab-username> \
--docker-password=<your-gitlab-access-token> \
--docker-email=<your-email>
Step 2: Update My Kubernetes Deployment
My asterisk-deployment.yaml
now includes the registry credentials:
apiVersion: apps/v1
kind: Deployment
metadata:
name: asterisk-deployment
namespace: ccmschatbot
spec:
replicas: 1
selector:
matchLabels:
app: asterisk
template:
metadata:
labels:
app: asterisk
spec:
containers:
- name: asterisk
image: registry.gitlab.com/my-project/asterisk:latest
ports:
- containerPort: 5060
imagePullSecrets:
- name: gitlab-registry-secret
Step 3: Redeploy and Pray
After applying the updated deployment:
kubectl apply -f asterisk-deployment.yaml
I checked again:
kubectl get pods -n ccmschatbot
And FINALLY, Asterisk started pulling the image and deploying correctly.
What’s Next? Converting DialogFlow Intents to Rasa
Now that my infrastructure is (mostly) working, my next step is migrating my DialogFlow intents and entities to Rasa. I exported my DialogFlow agent as a ZIP and used this command to convert the training data:
pip install rasa-nlu-converters
rasa-nlu-converter convert --data dialogflow-export.zip --out rasa-training-data --format rasa
This gave me a domain.yml file and training data that I could use to train Rasa.
Next Up: ✅ Fix interruptions & context retention in Rasa ✅ Ensure calls flow through Asterisk to Rasa properly ✅ Log contacts & calls in GoHighLevel ✅ Test Coqui TTS as a replacement for ElevenLabs
Final Thoughts
This journey has been raw and brutal—but also exciting. I’ve learned that off-the-shelf solutions (like SignalWire AI and DialogFlow) are great for small projects but get expensive and fall apart at scale. Open-source gives me control, but it also requires a lot of debugging and troubleshooting.
If you’re building a similar AI-powered voice bot, don’t make my mistakes:
- Don’t trust One-Click setups—they work, but they’re fragile.
- Always verify Kubernetes can pull images before deploying.
- If you’re using GitLab for container storage, set up imagePullSecrets early.
- Plan your conversation logic carefully—chatbots are NOT just fancy FAQs.
I’ll be documenting everything as I go, including all the problems and solutions. If you’re on a similar journey, feel free to reach out, ask questions, or drop suggestions. Let’s build some cool s**t together. 🚀