Transcrever e resumir ligações do WhatsApp com IA (e mandar para o CRM)
Como transcrever ligações do WhatsApp pela API, montar a conversa dos dois lados, gerar resumo com próximos passos por IA e registrar no CRM, com LGPD.
Para transcrever e resumir ligações do WhatsApp com IA, você captura a voz do outro lado pelo evento call-audio do Socket.IO (PCM 16 kHz), junta com o que o seu lado falou, transcreve, pede a um modelo de linguagem um resumo estruturado e grava no CRM ao encerrar a chamada. Na API não oficial da WAME isso funciona para toda ligação atendida ou feita pela API — por um agente de IA ou por um atendente falando pelo navegador.
O resultado é o que todo gestor de atendimento quer e quase nunca tem: um registro de cada ligação, com motivo, decisão e próximo passo, sem ninguém digitando.
A camada não oficial da WAME é independente e não é afiliada, endossada ou suportada pelo WhatsApp ou pela Meta. O uso é de responsabilidade de quem envia.
De onde vem o áudio
Numa ligação atendida pela API (POST /{key}/call/accept) ou iniciada por ela (POST /{key}/call), a mídia passa pela plataforma. Isso abre dois fluxos no Socket.IO da instância:
call-audio: a voz de quem está do outro lado, em pedaços, com ocallId.call-audio-in: o que você envia para a ligação — a voz sintética do agente ou o microfone de um atendente.
Os dois usam PCM de 16 bits, little-endian, mono, 16 kHz, em base64. É o formato que a maioria dos serviços de transcrição aceita diretamente.
Uma limitação para deixar clara desde já: ligação atendida no celular não passa por esse caminho. Só as chamadas que a API atendeu ou originou têm o áudio disponível.
Os dois lados da conversa
O call-audio traz o cliente. O seu lado você já conhece:
- Agente de IA (como em IA para atender ligação no WhatsApp): o texto de cada fala da IA está no seu histórico. Não precisa transcrever o que você mesmo gerou.
- Atendente humano pelo navegador: o áudio do microfone que você envia pelo
call-audio-intambém passa pelo seu código. Guarde uma cópia e transcreva junto.
Juntando os dois com carimbo de tempo, você monta a conversa como um diálogo, não como um bloco de texto sem quem disse o quê.
Capturar por chamada
O áudio chega em pedaços pequenos e de várias ligações ao mesmo tempo. Tudo precisa ser indexado pelo callId:
import { io } from 'socket.io-client';
const KEY = process.env.WAME_KEY;
const socket = io('https://us.api-wa.me', {
auth: { key: KEY },
query: { key: KEY },
transports: ['websocket', 'polling'],
});
const gravacoes = new Map(); // callId -> { inicio, cliente: [], falas: [] }
export function iniciarRegistro(callId, telefone) {
gravacoes.set(callId, { inicio: Date.now(), telefone, cliente: [], falas: [] });
}
socket.on('call-audio', ({ callId, pcm }) => {
const g = gravacoes.get(callId);
if (!g) return;
g.cliente.push({ t: Date.now() - g.inicio, buf: Buffer.from(pcm, 'base64') });
});
// Chame isto sempre que o seu lado falar (texto da IA, ou trecho do atendente já transcrito)
export function registrarFalaPropria(callId, texto) {
const g = gravacoes.get(callId);
if (g) g.falas.push({ t: Date.now() - g.inicio, quem: 'atendimento', texto });
}Se o seu agente de voz já detecta o fim de cada frase do cliente (e ele precisa, para responder), aproveite: transcreva frase por frase durante a ligação e guarde o texto com o tempo. Assim, ao encerrar, a transcrição já está pronta e o resumo sai em segundos.
Se você só grava e processa depois, junte os pedaços em trechos de alguns segundos antes de mandar para o serviço de transcrição — muitos cobram por requisição ou têm limite de tamanho mínimo.
Montar a transcrição
Com as falas dos dois lados, ordene por tempo e gere um texto limpo:
function montarTranscricao(g, trechosCliente) {
const linhas = [
...trechosCliente.map((c) => ({ t: c.t, quem: 'cliente', texto: c.texto })),
...g.falas,
].sort((a, b) => a.t - b.t);
return linhas
.map((l) => `[${formatar(l.t)}] ${l.quem}: ${l.texto}`)
.join('\n');
}
const formatar = (ms) => {
const s = Math.floor(ms / 1000);
return `${String(Math.floor(s / 60)).padStart(2, '0')}:${String(s % 60).padStart(2, '0')}`;
};Duas dicas que melhoram muito a transcrição em português:
- Passe vocabulário ao serviço, quando ele aceitar: nome da empresa, produtos, bairros atendidos. É o que mais erra.
- Não corrija à força. Se um trecho veio ininteligível, marque como
[inaudível]. Resumo em cima de palavra inventada é pior que lacuna.
O resumo que o CRM consegue usar
Um parágrafo bonito não preenche campo de CRM. Peça ao modelo um resumo estruturado:
const instrucoes = `
Você resume ligações de atendimento. Responda SOMENTE com JSON válido:
{
"motivo": "frase curta",
"resolvido": true | false,
"resumo": "até 3 frases",
"pendencias": ["..."],
"proximo_passo": { "acao": "...", "responsavel": "cliente|empresa", "prazo": "..." },
"sentimento": "positivo|neutro|negativo",
"precisa_humano": true | false
}
Use apenas o que está na transcrição. Se algo não foi dito, deixe vazio.
`;
async function resumir(transcricao) {
const texto = await modelo(instrucoes, transcricao); // seu provedor de LLM
return JSON.parse(texto);
}O "use apenas o que está na transcrição" não é enfeite: sem ele, o modelo completa lacunas com suposições, e um prazo inventado vira compromisso no CRM.
Fechar a ligação e registrar
O momento de gerar o resumo é o encerramento. Se foi o seu código que encerrou, você já sabe; se foi o cliente, o evento de chamada com o novo status chega no webhook.
async function aoEncerrar(callId) {
const g = gravacoes.get(callId);
if (!g) return;
gravacoes.delete(callId);
const trechos = await transcreverTrechos(g.cliente); // seu provedor de STT
const transcricao = montarTranscricao(g, trechos);
const resumo = await resumir(transcricao);
await crm.registrarLigacao({
telefone: g.telefone,
duracaoSeg: Math.round((Date.now() - g.inicio) / 1000),
transcricao,
...resumo,
});
if (resumo.precisa_humano) await crm.abrirTarefa(g.telefone, resumo);
}A partir daí, o que era uma ligação vira dado: motivos mais comuns do mês, percentual resolvido na primeira chamada, clientes com sentimento negativo para retorno.
Mandar o resumo para o cliente
Um passo que o cliente valoriza: receber por escrito o que foi combinado. Logo depois da ligação, mande pelo mesmo número:
curl -X POST "https://us.api-wa.me/SUA_KEY/message/text" \
-H "Content-Type: application/json" \
-d '{
"to": "5511999999999",
"text": "Resumo da nossa ligação:\n• Troca do produto aprovada\n• Coleta na quinta, das 8h às 12h\nQualquer dúvida, responda por aqui."
}'Faça isso só quando houver algo combinado — prazo, protocolo, próximo passo. Mandar "obrigado pela ligação" depois de toda chamada é ruído.
Para organizar a conversa no próprio WhatsApp, marque o chat com uma etiqueta ("ligação resolvida", "aguardando retorno") usando a API de labels.
Consentimento e LGPD
Transcrição de voz é dado pessoal, às vezes sensível. O mínimo:
- Avise no início: "esta ligação é atendida por um assistente virtual e pode ser transcrita" — ou, com atendente humano, "esta ligação pode ser transcrita para registro do atendimento".
- Tenha finalidade clara: registro do atendimento, qualidade, histórico do cliente. Não reaproveite para outra coisa sem base para isso.
- Defina retenção: por quanto tempo guarda a transcrição e o áudio (se guardar áudio). Muitas empresas guardam só o texto e o resumo e descartam o áudio.
- Controle acesso: nem todo mundo da empresa precisa ler transcrições completas.
As cláusulas que o cliente corporativo vai pedir estão em API de WhatsApp e LGPD. Este artigo não substitui orientação jurídica; ele mostra onde os cuidados entram no fluxo técnico.
Transcrição de ligação vs transcrição de áudio
Não confunda com a transcrição de mensagens de voz: lá o áudio chega inteiro, como mídia de uma mensagem, e você transcreve de uma vez. Aqui o áudio é um fluxo em tempo real, em pedaços, que só existe enquanto a ligação está aberta — por isso a captura por callId e a montagem no encerramento.
Onde está o custo
O custo principal é o serviço de transcrição, cobrado em geral por minuto de áudio, mais uma chamada ao modelo por ligação para o resumo. Transcrever só o lado do cliente (o seu lado você já tem em texto, no caso do agente de IA) corta boa parte da conta. As contas de tokens estão em quanto custa um agente de IA no WhatsApp.
Conclusão
Transcrever e resumir ligações do WhatsApp é juntar três coisas: o áudio do outro lado, que a API não oficial da WAME entrega em tempo real pelo evento call-audio; o que o seu lado falou, que você já tem; e um modelo que devolve um resumo estruturado em vez de um parágrafo solto. Com isso, cada ligação vira registro no CRM, tarefa quando precisa de humano e, quando faz sentido, uma mensagem para o cliente com o que foi combinado — tudo com aviso de transcrição e retenção definida. O agente que atende as ligações está em IA para atender ligação no WhatsApp, e os endpoints de chamada, na documentação.
Pronto para automatizar seu WhatsApp?
Crie sua conta gratuita e comece a enviar mensagens pela API em minutos.
Começar grátisPerguntas frequentes
Dá para transcrever ligações do WhatsApp pela API?+
Sim, nas ligações atendidas ou feitas pela API. Depois do atendimento, a voz do outro lado chega pelo Socket.IO no evento call-audio, em PCM 16 bits mono 16 kHz. Você junta esses pedaços por callId e envia para um serviço de transcrição.
Consigo transcrever os dois lados da conversa?+
O evento call-audio traz a voz de quem está do outro lado. O seu lado você já tem: se é um agente de IA, é o texto que ele falou; se é um atendente falando pelo navegador, é o áudio que você envia pelo call-audio-in. Juntando os dois com horário, você monta a conversa completa.
Ligações atendidas no celular podem ser transcritas?+
Não por este caminho. O áudio chega pela API só nas ligações atendidas ou iniciadas pela própria API. Ligação atendida no aparelho fica no aparelho.
Preciso avisar que a ligação está sendo transcrita?+
Sim, é a prática recomendada: informe no começo da ligação que ela pode ser transcrita e para quê. Defina também por quanto tempo guarda a transcrição e quem tem acesso. Isso faz parte de tratar dados pessoais com transparência sob a LGPD.
O que colocar no resumo da ligação?+
Motivo do contato, o que foi resolvido, o que ficou pendente, próximo passo com responsável e prazo, e o tom do cliente. Em formato estruturado (JSON), para o CRM preencher campos em vez de receber um texto solto.
Continue lendo
Agente de voz no WhatsApp: latência, interrupção (barge-in) e silêncio
Como deixar um agente de voz no WhatsApp natural: latência, streaming, detecção de fala, interrupção (barge-in), silêncio e eco, com exemplos em Node.js.
Ligação pelo WhatsApp via API não oficial: fazer, atender e tocar áudio
Como fazer, atender, recusar e encerrar ligações de WhatsApp pela API não oficial, tocar áudio na chamada e gerar link de chamada, com exemplos em cURL.
IA para atender ligação no WhatsApp pela API: como montar um agente de voz
Como montar um agente de voz que atende ligações no WhatsApp pela API: webhook, áudio em tempo real por Socket.IO, transcrição, IA, voz sintética e handoff.