Sistema completo de IA para ligações telefônicas usando Asterisk + AudioSocket + IA em tempo real.
┌─────────────────────────────────────────────────────────────┐
│ │
│ Cliente ◄──► Asterisk ◄──► AudioSocket ◄──► Node.js │
│ (TCP) Server │
│ │ │
│ ├──► Groq (STT/Whisper)
│ ├──► OpenRouter (IA)
│ └──► ElevenLabs (TTS)
│ │
└─────────────────────────────────────────────────────────────┘
✅ Asterisk 18.10.0 - Instalado e configurado ✅ AudioSocket - Módulo instalado e funcionando ✅ Trunk SIP - Configurado (IP: 138.59.146.69, Tech Prefix: 1290#) ✅ Servidor AudioSocket Node.js - Implementado ✅ Integração Groq - STT com Whisper (Speech-to-Text) ✅ Integração OpenRouter - IA/LLM para processar conversas ✅ Integração Eleven Labs - TTS (Text-to-Speech) ✅ CallManager - Gerenciador de fluxo de chamadas com IA ✅ ffmpeg - Instalado para conversão de áudio
/root/ligai/
├── index.js # Arquivo principal
├── package.json # Dependências Node.js
├── .env # Variáveis de ambiente (CONFIGURE AQUI!)
├── .env.example # Exemplo de configuração
├── src/
│ ├── audiosocket-server.js # Servidor TCP AudioSocket
│ ├── call-manager.js # Gerenciador de chamadas com IA
│ └── services/
│ ├── groq-service.js # Integração Groq (STT)
│ ├── elevenlabs-service.js # Integração Eleven Labs (TTS)
│ └── openrouter-service.js # Integração OpenRouter (IA)
└── README.md # Este arquivo
Edite o arquivo .env:
nano /root/ligai/.envAdicione suas chaves de API:
# OpenRouter API Key
OPENROUTER_API_KEY=sk-or-v1-xxxxxxxxxxxx
# Groq API Key (para STT)
GROQ_API_KEY=gsk_xxxxxxxxxxxx
# Eleven Labs API Key (para TTS)
ELEVENLABS_API_KEY=xxxxxxxxxxxx
# AudioSocket Configuration
AUDIOSOCKET_HOST=0.0.0.0
AUDIOSOCKET_PORT=9092
# AI Configuration
AI_MODEL=anthropic/claude-3.5-sonnet
AI_TEMPERATURE=0.7
AI_MAX_TOKENS=150cd /root/ligai
npm startVocê deve ver:
╔═══════════════════════════════════════════════════════════╗
║ ║
║ 🤖 LigAI - Sistema de IA ║
║ Sistema de Ligações com IA em Tempo Real ║
║ ║
╚═══════════════════════════════════════════════════════════╝
🚀 ============ LigAI Iniciando ============
📡 AudioSocket: 0.0.0.0:9092
🤖 IA Model: anthropic/claude-3.5-sonnet
==========================================
🎧 AudioSocket Server rodando em 0.0.0.0:9092
asterisk -rx "channel originate Local/5584991516506@outbound-calls application Echo"Primeiro, certifique-se de que o servidor LigAI está rodando (npm start), depois:
# Use AMI para originar chamada com IA
asterisk -rx "originate Local/558499151650@outbound-calls-ai extension wait@default"Nota: O contexto outbound-calls-ai usa AudioSocket e conecta com a IA!
- Asterisk origina chamada para o número do cliente
- Quando atende, conecta ao AudioSocket (Node.js)
- AudioSocket recebe frames de áudio PCM (20ms cada)
- Acumula ~3 segundos de áudio
- Groq Whisper converte áudio → texto (STT)
- OpenRouter processa texto com IA → gera resposta
- Eleven Labs converte resposta → áudio (TTS)
- AudioSocket envia áudio de volta para o Asterisk
- Cliente ouve a resposta da IA
- Repete o ciclo até fim da chamada
- Áudio: PCM 8kHz 16-bit mono
- Frame Size: 320 bytes (20ms)
- Protocolo: TCP (AudioSocket)
- Latência: ~300-700ms por ciclo completo
- Codecs: ulaw, alaw, gsm
1. outbound-calls-ai - Chamadas com IA
[outbound-calls-ai]
exten => _X.,1,NoOp(===== Chamada IA para ${EXTEN} =====)
same => n,Dial(PJSIP/1290#${EXTEN}@sip-trunk,60,g)
same => n,GotoIf($["${DIALSTATUS}" = "ANSWER"]?answered:hangup)
same => n(answered),AudioSocket(127.0.0.1:9092,${UNIQUEID})
same => n(hangup),Hangup()
2. outbound-calls - Chamadas simples (sem IA)
[outbound-calls]
exten => _X.,1,Dial(PJSIP/1290#${EXTEN}@sip-trunk,60)
same => n,Hangup()
Erro: "Missing API keys"
Solução: Configure as chaves de API no arquivo .env
cp .env.example .env
nano .env
# Adicione suas chaves de APIErro: "ffmpeg not found"
Solução: ffmpeg já está instalado, mas se der erro:
sudo apt-get install -y ffmpegVerificar se servidor está rodando:
netstat -an | grep 9092Deve mostrar: 0.0.0.0:9092 LISTEN
Verificar módulo AudioSocket no Asterisk:
asterisk -rx "module show like audiosocket"Deve mostrar: res_audiosocket.so Running
Verificar logs do Node.js:
# Rode o servidor e veja os logs
npm startVerificar se AudioSocket foi chamado:
asterisk -rx "core show channels"# Ver chamadas ativas
asterisk -rx "core show channels"
# Ver endpoints SIP
asterisk -rx "pjsip show endpoints"
# Ver dialplan
asterisk -rx "dialplan show outbound-calls-ai"
# Console interativo
asterisk -rvvv# Iniciar servidor
npm start
# Modo desenvolvimento (auto-reload)
npm run dev
# Ver logs
tail -f /var/log/asterisk/messagestail -f /var/log/asterisk/messagesO servidor imprime logs em tempo real:
- 📞 Nova conexão
- 🎤 Transcrevendo áudio
- 👤 Usuário disse
- 🤖 Resposta da IA
- 🗣️ Gerando TTS
- 📡 Enviando áudio
Edite o prompt do sistema em src/call-manager.js:
this.openRouterService.setSystemPrompt(sessionId, `
Você é um vendedor expert em produtos X.
Seu objetivo é:
- Qualificar o lead
- Agendar uma demonstração
- Ser persuasivo mas não agressivo
...
`);| Variável | Descrição | Padrão |
|---|---|---|
AUDIOSOCKET_HOST |
Host do AudioSocket | 0.0.0.0 |
AUDIOSOCKET_PORT |
Porta do AudioSocket | 9092 |
GROQ_API_KEY |
API Key do Groq | - |
ELEVENLABS_API_KEY |
API Key do Eleven Labs | - |
OPENROUTER_API_KEY |
API Key do OpenRouter | - |
AI_MODEL |
Modelo de IA | anthropic/claude-3.5-sonnet |
AI_TEMPERATURE |
Criatividade da IA | 0.7 |
AI_MAX_TOKENS |
Tamanho máximo da resposta | 150 |
- ✅ AudioSocket só aceita conexões locais (127.0.0.1)
- ✅ API Keys em arquivo .env (não versionado)
⚠️ Para produção, use firewall e SSL/TLS
-
pbx_config não carrega - Contexto
outbound-calls-aipode não aparecer- Solução: Use AMI para originar chamadas ou configure via AEL
-
Latência alta - Primeira resposta pode demorar
- Normal: Primeira chamada carrega modelos
- Chamadas subsequentes são mais rápidas
- Sistema de Lista de Clientes - Gerenciar números para ligar
- Dashboard Web - Interface para monitorar chamadas
- Relatórios - Análise de conversas e métricas
- Escalabilidade - Múltiplas chamadas simultâneas
Desenvolvido com ❤️ usando Asterisk + Node.js + IA