Saltar para o conteúdo
megapromotingVamos falar

Especialização · Telefonia e contact center

A camada de telefonia entre o seu operador e quem responde — humano ou agente.

Construímos a central: trunks SIP, regras de encaminhamento por horário, menus IVR lidos da base de dados, filas de espera, transferência para um humano, gravação e análise das chamadas. A chamada torna-se um registo com transcript e resumo, não uma memória.

Já construídoTrei implementări proprii, citate mai jos. (1) Stratul Asterisk din platforma Kallina: 5.522 de linii de configurație de dialplan, scripturi AGI și punți audio în `asterisk/`, plus șabloane de trunk generate automat per număr. (2) `asterisk-manager` — un serviciu separat care administrează cozile, trunkurile și fluxul RTP prin interfața de management a centralei. (3) Middleware-ul pentru centrala virtuală a unui operator, care a rulat în producție: commitul de reconciliere din 14 iulie 2026 aduce în depozit cod care rulase pe server și era cu circa 40 de zile înaintea git-ului. Rezerva, spusă înainte să întrebi: gazda SIP prin care trec liniile noastre de test nu răspunde — verificat azi, 06.09.2026, fără răspuns la ping și fără răspuns pe HTTP. Nu prezentăm un număr de demonstrație pe care să suni acum, pentru că nu l-am putea ridica în fața ta.

Entre o seu operador de telefonia e quem responde efetivamente — uma pessoa ou um agente vocal — tem de existir uma camada que toma decisões. Quem recebe a chamada às 23:40. O que acontece se ninguém responder. Para onde vai a chamada quando o cliente pede «uma pessoa». O que fica da conversa depois de ela terminar. Esta camada é uma central, e nós construímo-la para ser da empresa, não do fornecedor de voz: se amanhã mudar o motor do agente, as regras de routing, as filas e o histórico continuam consigo.

Concretamente, o que construímos: doze ficheiros de dialplan — produção, IVR, fila, transferência, voicemail, redirecionamento, chamadas de saída com agente — quatro scripts AGI em Python e duas pontes de áudio, no total 5.522 linhas. O motor de IVR não tem os menus escritos no ficheiro: lê-os da base através de um script AGI e devolve uma de seis decisões — para um agente, para outro menu, para uma fila, transferência para um número externo, mensagem final, ou encerramento. As filas têm o nome do respetivo identificador e não têm membros escritos na configuração: são adicionados e removidos do exterior, através da interface de gestão, o que significa que um operador pode entrar ou sair da fila sem reiniciar a central.

O encaminhamento tem regras reais, não apenas um único «ligue aqui»: horários de funcionamento e fuso horário, funcionamento nocturno do tipo 22:00 → 06:00, e correspondência por prioridade — o cabeçalho SIP `Diversion`, que transporta o número original de onde a chamada foi reencaminhada, depois o próprio número, depois a regra de reserva. Os trunks são gerados por número, com nome construído a partir do fornecedor e do número, por uma função de configuração — não escritos à mão em cada nova linha.

O que sai da chamada é tão importante como a chamada. Para a linha ligada à central virtual de um operador, construí um middleware em Python que consulta a lista de registos a cada minuto, com uma reconciliação ampla a cada seis horas para que uma falha de rede não perca nada, e uma varredura a cada três minutos das chamadas perdidas — essas não têm registo e, de outro modo, seriam completamente invisíveis. Cada registo é descarregado, transcrito, analisado e espelhado na análise de chamadas, e a chamada perdida torna-se um alerta. A idempotência está num conjunto Redis, para que o mesmo registo não seja processado duas vezes.

Qué incluye

El trabajo, por componentes

O número entra num trunk gerado, não escrito à mão

Os modelos de trunk são parametrizados e preenchidos por uma função de configuração, com nome formado pelo fornecedor e pelo número. No modelo estão escritos o transporte, os codecs permitidos, o tratamento de NAT, o modo DTMF e a autenticação. A consequência prática: o décimo número liga-se da mesma forma que o primeiro, e as diferenças entre operadores ficam num único lugar.

A central decide para onde vai a chamada, segundo regras escritas

Horários de funcionamento e fuso horário, funcionamento nocturno do tipo 22:00 → 06:00, correspondência por prioridade: o cabeçalho SIP `Diversion` (o número de onde foi reencaminhada), depois o próprio número, depois a regra de reserva. A procura da regra é feita por um script AGI que pergunta à plataforma durante a chamada, com o seu próprio tempo de espera — portanto, uma regra alterada na interface aplica-se à chamada seguinte, sem reinício.

A chamada chega ao agente, à fila ou à pessoa

Para o agente vocal, o áudio passa por uma ponte que converte o codec nos dois sentidos, `g711_ulaw` ↔ `PCM16`. Para as pessoas, a chamada entra numa fila administrada do exterior. E a transferência está ao alcance de quem fala: transferência cega por `##` e transferência assistida por `*2`, com a chamada a aterrar num contexto escrito para isso, que distingue as extensões internas de quatro dígitos dos números externos.

Menu IVR lido da base de dados, não de ficheiro

O motor de IVR recebe o identificador do menu e lê-o da base de dados através de um script AGI. O resultado é uma de seis decisões: para um agente, para outro menu (recursivo), para uma fila, transferência externa, mensagem final, encerramento. As mensagens podem ser sintetizadas ou podem ser ficheiros áudio gravados previamente. Alterar um menu significa alterar uma linha na base de dados, não editar um ficheiro de configuração no servidor.

Filas com membros dinâmicos

Cada fila leva o nome derivado do seu identificador. Os membros não são persistidos na configuração: são adicionados e removidos durante o funcionamento através da interface de gestão da central, e o posicionamento simultâneo em vários lugares livres está activado. Na prática, um operador entra ou sai da fila sem que a central seja reiniciada e sem que as chamadas em espera sejam afectadas.

Despacho para pessoas no terreno

Um agente pode telefonar ele próprio para alguém do exterior e voltar com a resposta. O mecanismo é implementado com tabela própria e estados explícitos — a ligar, em curso, a tentar novamente, concluído, falhado, sem resposta, expirado — com no máximo três tentativas e uma pausa de dois minutos entre elas, e o resultado (incluindo o tempo estimado de chegada) volta de forma estruturada para a conversa que o pediu. Não é um conceito: são cinco funções de servidor dedicadas, mais uma varredura das chamadas que ficaram presas.

As chamadas tornam-se dados, incluindo aquelas a que ninguém atendeu

Um processo agendado lê a lista de registos a cada minuto, com reconciliação ampla a cada seis horas para que uma falha não perca nada. O registo é descarregado em WAV, transcrito, analisado e espelhado na análise de chamadas juntamente com o áudio. Separadamente, a cada três minutos são lidas as chamadas não atendidas — que não têm registo e, de outro modo, não existiriam em lado nenhum — e tornam-se alerta. Uma chamada perdida é um cliente perdido; torná-la visível é a melhoria mais barata num centro de chamadas.

Travões perante a API do operador

O cliente que fala com a central do operador tem limitador de taxa próprio, com balde de tokens, e tratamento explícito de erros. Não é uma precaução teórica: um middleware que consulta a cada minuto e reconcilia a cada seis horas pode, sem travão, atingir o limite do operador e ser bloqueado precisamente quando precisa dele.

Qué aspecto tiene

El recorrido, paso a paso.

01

Inventário das linhas antes de qualquer configuração

Que números existem, em que operadora, quem responde hoje por cada um, em que horário, e o que acontece agora quando ninguém responde. Parece burocracia; é a parte que evita surpresas. Pela nossa experiência, num parque de números há quase sempre linhas em que a base diz uma coisa e a central diz outra — e elas não são descobertas no lançamento, mas sim agora.

02

Trunk, depois teste nos dois sentidos, separadamente

O número entra no trunk, e as chamadas recebidas e as efetuadas são testadas como duas coisas distintas, porque se avariam de forma distinta. Temos documentado um caso em que as chamadas recebidas funcionavam perfeitamente durante dias seguidos, enquanto todas as chamadas efetuadas eram rejeitadas pela central da operadora com `403 Forbidden`, sem qualquer alteração da nossa parte. Um único teste “ligou e funcionou” não cobre isto.

03

Dialplan: encaminhamento, IVR, fila, transferência, voicemail

As regras de horário e de prioridade, os menus, as filas e os caminhos de transferência são escritos como dialplan e como registos na base, não como entendimento verbal. No final, você sabe exatamente o que acontece com uma chamada às 23:40, ao sábado, quando o agente não entende o pedido.

04

As chamadas entram nos seus sistemas

O resultado da chamada — transcript, resumo, sentimento, endereço da gravação, duração — é enviado em frente por um webhook assinado, e a organização é identificada pelo número de telefone. Onde existe um CRM, a chamada é ligada à ficha e pode alterar automaticamente o estado; sobre esta parte escrevemos na página de CRM e automatização de vendas.

05

A continuidade é discutida no início, não depois da primeira falha

Uma central num único servidor é um único ponto de falha, e nós vivemos exatamente isso: quando o servidor não responde, todas as linhas que passam por ele caem com ele, independentemente de quão bem o agente esteja configurado. A assinatura da falha é clara — a chamada devolve “request timed out” com o identificador de chamada SIP vazio, ou seja, a chamada SIP nunca chegou a estabelecer-se. Por isso, num projeto real, a pergunta “o que acontece quando o servidor cai” é colocada e orçamentada no início: um segundo servidor, monitorização que chama uma pessoa, e um caminho de reserva para números normais.

Ce vede utilizatorulAplicațiaRețea și securitateGăzduire și dateFIECARE STRAT, ALES ȘI EXPLICAT
Straturile unei linii telefonice: trunkul operatorului, centrala cu regulile de rutare, puntea audio către agent, coada și transferul către om, apoi înregistrarea, transcrierea și analiza.

Os dados

Qué tocamos, dónde están y cuánto se quedan

Las preguntas que hace cualquiera que tenga un delegado de protección de datos — hechas aquí antes de que las haga él.

Onde fica o registo das chamadas
O registo das chamadas da central é hoje escrito localmente, em formato CSV, no servidor da central; a sua escrita numa base PostgreSQL está preparada na configuração, mas permanece desativada. Dizemo-lo porque tem uma consequência direta: se você quiser relatórios sobre chamadas fora da central, ativar o registo na base é um trabalho a fazer, não uma caixa para assinalar. Os transcripts e as análises ficam separados, na plataforma, ligados ao seu espaço de trabalho.
O que é armazenado de uma chamada
O número do chamador e o número chamado, o momento, a duração, o resultado, a gravação áudio, o transcript e a análise. Para as chamadas não atendidas existem o número, o momento e o motivo da falta de resposta — não existe áudio, porque não foi produzido. A gravação é descarregada em WAV a 8 kHz, mono, e é convertida para um formato comprimido para entrega às pessoas.
Idempotência, para que os dados não sejam duplicados
Cada registo processado é marcado num conjunto Redis. A reconciliação alargada pode reler a mesma janela de tempo sem reenviar nada. É o detalhe que faz a diferença entre um sistema que pode ser reiniciado com tranquilidade e um que, a cada reinício, volta a enviar todos os alertas de ontem.
Quem pode ouvir uma gravação
Os dados da chamada estão ligados ao espaço de trabalho da empresa, e o acesso passa por autenticação. Não existe um repositório comum entre clientes e não existe acesso «da plataforma» sem uma identidade. Quem da sua equipa tem direito a ouvir é definido na implementação, não por defeito.
A retenção e o aviso de gravação são decisões suas
Quanto tempo o áudio, a transcrição e o registo das chamadas são guardados, e o que é dito no início da conversa sobre o facto de estar a ser gravada, são decisões do operador de dados — ou seja, suas. A eliminação a pedido é implementada na plataforma; a eliminação automática no prazo é feita hoje por procedimento, não por um relógio, portanto, se precisar que seja automática, entra como trabalho no projeto.

Un caso

As chamadas longas desapareciam. As curtas, não.

A situação

Num fluxo de análise de conversas, parte das chamadas ia para análise e parte não. O padrão foi o que deu a causa: faltavam exatamente as chamadas longas. Um defeito que é comunicado como «às vezes não funciona» e procurado, erradamente, na transcrição.

Qué construimos

Havia dois caminhos de transcrição e ambos falhavam, por motivos diferentes. O caminho multimodal enviava o ficheiro de áudio completo codificado no corpo do pedido; acima de um certo tamanho, o limite do corpo do servidor intermédio respondia com 413. O caminho de reserva pedia um modelo de transcrição que a chave de acesso já não permitia, por isso respondia com 403. Ambos falhavam, o processo reportava que todos os modelos de transcrição tinham falhado, e a chamada era abandonada. As chamadas curtas ficavam abaixo do limite do corpo, portanto passavam — daí o padrão. A correção foi: saltar o caminho multimodal para ficheiros WAV acima de 12 MB (limiar configurável no ambiente), reutilizar a transcrição já calculada em vez de transcrever uma segunda vez, e a transcrição de última instância foi movida para um modelo permitido.

Qué salió

Verificado na gravação que tinha ficado bloqueada: uma conversa de 21 minutos, ficheiro WAV de 41 MB — o caminho multimodal foi contornado, a transcrição foi obtida, a análise foi gerada, a linha e o áudio chegaram à análise de chamadas, zero falhas. A reconciliação confirmou depois que já não existem outras gravações bloqueadas.

Qué no dice el caso

O limiar de 12 MB é uma propriedade do servidor intermédio, não da chamada. Quando o gateway, a chave ou o modelo mudam, o limiar tem de ser reverificado — por isso tornámo-lo configurável no ambiente, e não escrito no código.

Perguntas

Lo que nos pregunta la gente antes de llamar

Tem um número para o qual eu possa ligar agora, para ouvir o agente?

Não hoje, e preferimos dizer isso do que dar um número que toca em vazio. A parte do agente pode ser ouvida na página, imediatamente. A parte do telefone depende de um host SIP, e o host por onde passam as nossas linhas de teste não responde à data de redação — verificado hoje, sem resposta ao ping e sem resposta por HTTP. Para um seu projeto, a telefonia é levantada num host dedicado ao projeto, não no de teste.

Porquê central própria e não diretamente o fornecedor de voice agent?

Porque as regras de encaminhamento, as filas, a transferência, o voicemail e o histórico das chamadas são do negócio, não do fornecedor de voz. Com uma central própria pode mudar o motor do agente sem reescrever o comportamento do seu telefone, pode encaminhar a mesma chamada ora para um agente, ora para uma pessoa, e pode manter o registo das chamadas consigo. Sem ela, fica preso ao que o fornecedor decide expor.

O que acontece se o servidor da central cair?

Caem todas as linhas que passam por ele. Não é hipótese: foi o que vivemos, e a assinatura é fácil de reconhecer — a chamada devolve «request timed out» com o identificador de chamada SIP vazio, portanto não é culpa do agente, do número ou do prompt. A conclusão que tirámos e que agora aplicamos em cada projeto: a continuidade não é uma função da central, é uma decisão de arquitetura e de orçamento, tomada no início. Resolve-se com um segundo host e com uma rota de reserva para números normais, não com uma definição.

As chamadas efetuadas funcionam de forma segura, se as recebidas funcionam?

Não. São duas coisas diferentes, e o operador pode tratá-las de forma diferente. Temos documentado um caso em que, com a nossa configuração inalterada e com as chamadas recebidas funcionais, a central do operador começou a recusar todas as chamadas efetuadas com `403 Forbidden` — a prova de que era do lado do operador foi que uma segunda conta, com configuração estruturalmente idêntica, continuava a ligar para fora. Por isso não prometemos uma campanha de chamadas efetuadas antes de um teste de saída bem-sucedido no seu número.

Podem trabalhar com a central virtual que o meu operador me dá?

Sim, e fizemo-lo: escrevemos um middleware em Python sobre a API de uma central virtual de operador, com cliente próprio, limitador de taxa, descarregamento de gravações, transcrição, análise e alertas, em execução em produção. O que é preciso saber de antemão: o acesso à API alargada é muitas vezes um serviço separado, contratado à parte, e as credenciais podem não funcionar à primeira tentativa — no nosso caso, o ciclo de esclarecimento da especificação e de reposição da palavra-passe com o operador durou meses, com o serviço já faturado. Por isso, numa proposta que dependa da API de um operador, colocamos explicitamente a condição: o trabalho começa depois de a autenticação ter sido demonstrada, não depois de ter sido prometida.

As chamadas são gravadas e quem as pode ouvir?

Podem ser gravadas, transcritas e analisadas. Permanecem ligadas ao espaço de trabalho do seu negócio, e o acesso exige autenticação — não existe um depósito comum entre clientes. Quem da sua equipa tem direito de escuta é definido na implementação. O aviso ao interlocutor e a base da gravação são decisões suas como operador de dados; escrevemo-las no сценарio, não as presumimos.

O que acontece com as chamadas a que ninguém atende?

São o caso pior tratado na maioria das empresas, porque não deixam rasto: não há gravação, não há transcrito, existe apenas no registo de chamadas. Para nós, um processo lê o registo a cada três minutos, identifica as chamadas não atendidas e transforma-as em alerta e em linha visível. Para ficar claro de que depende: só as vemos na medida em que o operador as expõe no seu registo.

Consegue fazer menus do tipo «prima 1 para...»?

Sim, e os menus ficam na base, não em ficheiros no servidor. O motor lê a configuração do menu durante a chamada e decide um de seis caminhos: para um agente, para outro menu, para uma fila, transferência para um número externo, uma mensagem final, ou encerramento. As mensagens podem ser sintetizadas ou gravadas de antemão. Na prática, uma alteração de menu não exige intervenção na central.

Como sei se uma chamada se perdeu pelo caminho, entre a central e a análise?

Por reconciliação, e é uma peça que construímos explicitamente. A consulta rápida tem uma janela de algumas dezenas de horas, e por cima disso corre a cada seis horas uma reconciliação numa janela de uma semana, que relê várias páginas de resultados. Cada registo processado é marcado, portanto a releitura não duplica nada. Sem reconciliação, uma falha de uma hora significa um buraco permanente nos dados — e ninguém o nota.

Em que se baseiam as afirmações acima (22 fontes)

22 delas são código e ficheiros dos nossos repositórios. Não publicamos o nome nem a linha: juntos, numa única página, descreveriam com demasiada precisão como estão construídos sistemas que não são só nossos. Percorremo-los consigo, no repositório, a pedido — a verificação continua possível, só que se faz numa conversa.

O que gostaria que funcionasse melhor?

Conte-nos o seu processo. Em conjunto decidimos o que vale a pena construir, o que podemos ligar e como verificamos o resultado.

Vamos falar